OpenAI Whisper to zaawansowane narzędzie do konwersji mowy na tekst. Jednakże, jego obsługa poprzez wpisywanie poleceń może być uciążliwa. Po co utrudniać sobie pracę, skoro można wykorzystać potencjał AutoHotkey?
AutoHotkey pozwala na łatwe stworzenie intuicyjnego interfejsu graficznego dla aplikacji wiersza poleceń, takiej jak Whisper. Zobaczmy, jak, łącząc możliwości AutoHotkey w zakresie tworzenia GUI z inteligencją Whisper od OpenAI, stworzyć własną aplikację do transkrypcji, obsługiwaną za pomocą przycisków.
Przygotowanie podstaw dla Whisper i AutoHotkey
AutoHotkey to nie tylko narzędzie do tworzenia prostych skryptów. W tym projekcie wykorzystamy go do zbudowania interfejsu graficznego dla Whisper. Dzięki temu będziemy mogli korzystać z zaawansowanej technologii rozpoznawania mowy OpenAI, klikając przyciski i dostosowując parametry, zamiast ręcznie wpisywać polecenia.
Aby móc przejść dalej, należy upewnić się, że zarówno AutoHotkey, jak i Whisper są już zainstalowane na komputerze.
AutoHotkey możesz pobrać z oficjalnej strony internetowej. Następnie wystarczy uruchomić instalator i postępować zgodnie z instrukcjami.
Należy pamiętać, że w tym projekcie korzystamy ze starszej wersji „v1” języka skryptowego, a nie nowej wersji v2. Obie wersje różnią się składnią, dlatego kod przedstawiony w tym artykule może nie działać poprawnie w przypadku użycia v2.
Instalacja Whisper jest bardziej złożona, ale szczegółowy opis tego procesu znajdziesz w naszym artykule na temat transkrypcji mowy na tekst z wykorzystaniem OpenAI’s Whisper dla systemu Windows.
Po zainstalowaniu obu programów, plan działania wygląda następująco:
- Stworzenie interfejsu graficznego z elementami do ustawiania zmiennych i parametrów Whisper.
- Napisanie funkcji odpowiedzialnych za pobieranie wartości z interfejsu, wybór plików i folderów oraz składanie wszystkiego w działające polecenie Whisper.
- Uruchomienie polecenia Whisper w celu uzyskania rezultatów.
Oczywiście, można również skorzystać z wbudowanej funkcji rozpoznawania mowy w systemie Windows, jak opisaliśmy w naszym artykule o uruchamianiu pisania głosowego w Windows 11. Jednak, jak przekonasz się sam, Whisper oferuje znacznie wyższą dokładność (choć działa wolniej).
Z osobistej perspektywy chciałbym dodać, że nie jestem programistą, a ten projekt to „remiks” rozwiązania, które stworzyłem na własny użytek.
Tworzenie nowego skryptu AutoHotkey
Pierwszym krokiem jest utworzenie nowego, pustego pliku skryptu. Najlepiej umieścić go w dedykowanym folderze, jeśli w przyszłości będziesz chciał go rozbudowywać i dodawać nowe pliki.
- Uruchom menedżer plików (lub wciśnij Klawisz Windows + E, aby otworzyć Eksplorator Windows) i utwórz nowy folder w dowolnym miejscu na dysku, w którym umieścisz swoją aplikację do transkrypcji.
- Kliknij prawym przyciskiem myszy w oknie folderu i wybierz Nowy > Skrypt AutoHotkey, aby utworzyć nowy, pusty plik skryptu.
- Wciśnij Shift i kliknij prawym przyciskiem myszy na plik, aby wyświetlić pełne menu kontekstowe. Wybierz opcję otwarcia pliku w ulubionym edytorze tekstu lub kodu. W zupełności wystarczy Notatnik Windows.
- Chociaż utworzony plik AHK jest „pusty”, znajdziesz w nim pewne domyślne ustawienia. Są to zmienne i flagi AutoHotkey, które definiują jego podstawowe zachowanie. Zignoruj je, pozostaw w takiej formie, w jakiej są, i pisz swój kod poniżej.
Zrozumienie flag Whisper
Tworząc graficzny interfejs dla aplikacji wiersza poleceń, warto zapoznać się z jej głównymi zmiennymi i flagami, których będziemy używać w projekcie. Szczegółowe informacje można znaleźć w dokumentacji Whisper, na oficjalnej stronie Github oraz uruchamiając program w terminalu.
Poniżej przedstawiamy flagi, które wykorzystamy w tym projekcie, dla wygody. Sugerujemy dodanie ich do skryptu w postaci komentarzy (w osobnych liniach, z ” ; ” i spacją na początku każdej z nich).
; Whisper Flags:;
Tworzenie interfejsu graficznego z AutoHotkey
Zalecamy podzielenie skryptu na sekcje, używając komentarzy, tak jak my to zrobiliśmy, aby utrzymać porządek w kodzie. Zaczniemy od definicji zmiennych, następnie przejdziemy do stworzenia interfejsu, a na końcu zdefiniujemy funkcje obsługi poszczególnych elementów.
Ustalanie zmiennych wewnętrznych
Zaczniemy od sekcji, w której zdefiniujemy zmienne, które możemy chcieć zmienić w przyszłości, ale nie tak często, by udostępniać je w interfejsie graficznym i nadmiernie go komplikować. W jednej linii możesz zdefiniować jedną zmienną, zapisując „Nazwa_zmiennej = zawartość lub wartość zmiennej”.
W naszym projekcie zdefiniowaliśmy zmienną OutputFormat, której przypisaliśmy wartość „txt”, oraz zmienną WhisperExecutable, zawierającą nazwę pliku wykonywalnego Whisper. Dzięki temu, jeśli w przyszłości będziemy chcieli generować napisy SRT zamiast plików TXT lub przejść do innej aplikacji, wystarczy, że zmodyfikujemy wartości tych zmiennych w jednym miejscu, a nie w całym skrypcie.
OutputFormat = txtWhisperExecutable = whisper
Konfigurowanie opcji dla użytkownika
W przypadku korzystania z Whisper w wierszu poleceń, dostępne są trzy flagi, które pozwalają na ustawienie:
- Czy ma być wykonana transkrypcja, czy tłumaczenie.
- Język nagrania audio.
- Model języka, który ma zostać użyty (dostępne są różne modele, różniące się jakością i wydajnością).
Najprostszym sposobem na udostępnienie tych opcji w interfejsie graficznym są listy rozwijane. Składnia dodania listy rozwijanej do interfejsu w AutoHotkey jest następująca:
Gui, Add, DropDownList, xPosition yPosition wWidth hHeight vVariable_that_will_hold_selected_value, optionA|optionB|default_optionC||optionD|
W oparciu o tę składnię, dodamy do naszego skryptu trzy listy rozwijane: wybór języka Whisper (angielski/en lub grecki/el), wybór modelu (tiny, base, small, medium, large) i wybór typu zadania (transkrypcja lub tłumaczenie).
Gui, Add, DropDownList, x5 y5 w165 h50 vSelectedLanguage, en||el
Gui, Add, DropDownList, x175 y5 w165 h100 vSelectedModel, tiny|base|small||medium|large|
Gui, Add, DropDownList, x345 y5 w165 h100 vTaskType, transcribe||translate|
Aby ustawić daną opcję jako domyślnie wybraną, należy umieścić po niej symbol podwójnej kreski („|”). W naszym przykładzie domyślnie ustawiliśmy język na angielski (en), model na small, a typ zadania na transkrypcję.
Jak kierować Whisper
Whisper, jako rozwiązanie oparte na sztucznej inteligencji, nie daje pełnej kontroli nad procesem transkrypcji. Algorytm sam decyduje o tym, co uważa za optymalne.
Jednak, podobnie jak inne rozwiązania AI, Whisper umożliwia uwzględnienie podpowiedzi użytkownika. Poprzez wprowadzenie podpowiedzi, możemy „pokierować” procesem transkrypcji.
Czy wygenerowana transkrypcja nie jest idealna? Spróbuj „wyjaśnić” Whisper, „o czym jest nagranie”, podając w podpowiedzi słowa, skróty i frazy w takiej formie, w jakiej chcesz je widzieć w transkrypcji. W tym celu dodamy pole edycji tekstu AutoHotkey.
Składnia jest bardzo podobna do tej, której użyliśmy do dodawania list rozwijanych:
Gui, Add, Edit, x5 w505 h400 vPromptText, %PromptText%
„%PromptText%” na końcu instrukcji informuje AutoHotkey, aby wyświetlił zawartość zmiennej PromptText (jeśli ta zmienna ma przypisaną jakąś wartość) w polu tekstowym. W tworzonym przez nas skrypcie pole będzie puste, ale traktuj je jako miejsce, w którym możesz umieścić podpowiedź, gdy w przyszłości będziesz chciał dostosować skrypt i zapisywać i wczytywać podpowiedzi.
Wolisz przypisać domyślną wartość do zmiennej PromptText? Dodaj coś takiego do sekcji zmiennych skryptu. Pamiętaj, aby zastąpić „Twoje imię” swoimi danymi.
PromptText = Transkrypcja notatek Twoje imię
Konfiguracja przycisków akcji
Do wybierania plików, folderów i uruchamiania Whispera po skonfigurowaniu wszystkiego najlepiej użyć przycisków. Możesz dodać przyciski do interfejsu AHK, korzystając z poniższej składni:
Gui, Add, Button, xPosition yPosition wWidth hHeight gFunction_To_Perform, Button Text
Zauważ, że w przeciwieństwie do zmiennych elementów interfejsu, których nazwy zaczynają się na literę „v”, nazwy funkcji zaczynają się od „g”, co oznacza „Idź (do tego miejsca skryptu)”.
Przycisk w interfejsie AHK można również ustawić jako „domyślny”, który zostanie aktywowany po naciśnięciu Enter, bez klikania w inne miejsce interfejsu. Ustawia się go poprzez dodanie słowa „default” w sekcji współrzędnych i funkcji, co widać w naszym przycisku „OK”:
Gui, Add, Button, x5 w505 h50 gSelectFile, Załaduj plikGui, Add, Button, x5 w505 h50 gSelectFolder, Wybierz folder wyjściowy
Gui, Add, Button, Default x5 w505 h50 gButtonSubmit, OK
Mając to na uwadze, definiujemy trzy przyciski:
- Przycisk „Załaduj plik”, który po kliknięciu uruchomi funkcję SelectFile.
- Przycisk „Wybierz folder wyjściowy”, który uruchomi funkcję SelectFolder.
- Przycisk „OK”, który jest domyślnie wybrany i „wywołuje” funkcję ButtonSubmit.
Jak wyświetlić interfejs graficzny
Nasz interfejs graficzny jest gotowy, ale nie pojawi się na ekranie, ponieważ nie „powiedzieliśmy” AutoHotkey, by go wyświetlił, ani co ma robić każdy przycisk.
W tym celu dodaj dwa poniższe wiersze poniżej tych, które definiują interfejs graficzny:
Gui, ShowReturn
Pierwsza linia „mówi” AutoHotkey, aby wyświetlił okno interfejsu, a druga oznacza koniec tej sekcji.
Funkcje i działanie naszej aplikacji
Chociaż skończyliśmy tworzenie interfejsu, jeśli spróbujesz uruchomić skrypt w tej formie, nastąpi błąd. Jest to spowodowane faktem, że odwołujemy się w nim do funkcji, które jeszcze nie istnieją. Kolejnym krokiem jest więc stworzenie tych funkcji.
Trzy potrzebne funkcje to:
- Wybór pliku wejściowego.
- Wybór folderu wyjściowego, w którym zostanie zapisany transkrybowany plik.
- Stworzenie polecenia, które „złoży” wszystkie zmienne w działające polecenie Whisper, analogiczne do tego, które wpisujemy ręcznie w terminalu, a następnie uruchomi je.
Wybór pliku wejściowego
Pierwszą funkcją, którą nazwaliśmy „SelectFile”, dodając jej przycisk do interfejsu, jest:
SelectFile:FileSelectFile, SelectedFileReturn
FileSelectFile to wbudowana funkcja AutoHotkey, która otwiera okno dialogowe, w którym użytkownik może wybrać plik. SelectedFile to zmienna w naszym skrypcie, która przechowuje ścieżkę do pliku wybranego przez użytkownika.
Jak widać na naszych zrzutach ekranu, tuż przed końcem funkcji „return” dodaliśmy następujący wiersz:
MsgBox, %SelectedFile%
Spowoduje to, że AutoHotkey wyświetli okno komunikatu z informacją o wybranym pliku, co jest przydatne w rozwiązywaniu ewentualnych problemów ze skryptem. Jeśli okno to wyświetla ścieżkę i nazwę pliku, oznacza to, że problem nie leży w przycisku ani funkcji wyboru pliku.
Wybór folderu wyjściowego
Funkcja wyboru folderu jest niemal identyczna, zmienia się jedynie nazwa polecenia i zmienna, tak aby wskazywały, że mamy do czynienia z folderem, a nie plikiem:
SelectFolder:FileSelectFolder, SelectedFolderMsgBox, %SelectedFolder%Return
Funkcja końcowa
Ostatnia funkcja będzie najbardziej skomplikowana. Będzie ona powiązana z przyciskiem OK i będzie odpowiedzialna za „zebranie” wszystkich wartości zmiennych z interfejsu, przekształcenie ich w użyteczne polecenie i uruchomienie go.
Zaczynamy od zdefiniowania początku i końca funkcji:
ButtonSubmit:Return
Aby „pobrać” wszystkie wartości z interfejsu graficznego, dodaj poniższy wiersz pod wierszem ButtonSubmit:
Gui Submit, nohide
Poniższy wiersz tworzy nową zmienną o nazwie „WhisperFlags”. Następnie dodaje do niej wszystkie zmienne interfejsu w postaci flag dla polecenia Whisper.
WhisperFlags = --initial_prompt "%PromptText%" --task %TaskType% --model %SelectedModel% --language %SelectedLanguage% --output_format %OutputFormat% -o "%SelectedFolder%" "%SelectedFile%"
Następnie „poinformujemy” AutoHotkey, że ma użyć domyślnego terminala (CMD.exe) do uruchomienia pliku wykonywalnego Whisper (zdefiniowanego w zmiennej WhisperExecutable) z parametrami GUI (które są teraz „zebrane” w zmiennej WhisperFlags).
RunWait, cmd.exe /c %WhisperExecutable% %WhisperFlags%
Aby ułatwić rozwiązywanie problemów, dodaliśmy, analogicznie jak wcześniej, okno komunikatu. Dodatkowo dodaliśmy także ten wiersz:
Clipboard = %WhisperExecutable% %WhisperFlags%
Spowoduje to skopiowanie do schowka kompletnego polecenia, które zostało przekazane do CMD. Dzięki temu, w przypadku wystąpienia błędu, będziesz miał dostęp do polecenia nie tylko w oknie komunikatu AHK, ale także w schowku.
Otwórz terminal, wklej polecenie ze schowka i sprawdź błędy, które się pojawią, aby zlokalizować ewentualne problemy.
Na przykład, pracując nad tym skryptem, początkowo zapomniałem umieścić znaku podpowiedzi w cudzysłowie. Polecenie nie działało, ponieważ Whisper interpretował podpowiedź jako flagi.
Testowanie i ostateczne poprawki
To wszystko – właśnie stworzyliśmy aplikację do transkrypcji, wykorzystującą możliwości AutoHotkey w zakresie tworzenia interfejsów graficznych i gotowe rozwiązanie do transkrypcji AI.
Spróbuj uruchomić skrypt (kliknij dwukrotnie na jego plik). Na ekranie powinien pojawić się interfejs graficzny.
- Zmień ustawienia Whisper, korzystając z list rozwijanych u góry.
- Wpisz krótki opis nagrania (wraz z terminologią) w polu Podpowiedź.
- Kliknij przycisk Załaduj plik i wybierz plik audio, który chcesz transkrybować.
- Kliknij przycisk Wybierz folder wyjściowy i wybierz miejsce zapisu utworzonego pliku tekstowego.
- Kliknij OK, aby uruchomić Whisper, skonfigurowany za pomocą interfejsu, dla wybranego pliku audio. Transkrypcja zostanie zapisana jako plik tekstowy we wskazanym folderze.
Jeśli wszystko działa poprawnie, wróć do skryptu i usuń lub zakomentuj (dodając znak „;” na początku) wszystkie linie związane z rozwiązywaniem problemów (okna komunikatów i kopiowanie do schowka).
Rozszerzanie możliwości Whisper z AutoHotkey
Poprzez odpowiednie ustawienie domyślnych wartości w interfejsie graficznym oraz dodanie opcjonalnej podpowiedzi, możesz przekształcić Whisper w narzędzie do transkrypcji, którego obsługa sprowadza się do trzech kliknięć, bez konieczności ponoszenia opłat za komercyjne rozwiązania, korzystania z usług zewnętrznych, modyfikacji skomplikowanych interfejsów czy wpisywania poleceń w terminalu.