Twój koszyk jest obecnie pusty!
Dzisiaj pokażę wam jak wykorzystać model Whisper od OpenAI, aby wykonać transkrypcję pliku wideo.
Transkrypcja to nic innego jak generowanie tekstu na podstawie pliku dźwiękowego. Model Whisper obsługuje wiele języków i bardzo dobrze radzi sobie z językiem polskim, dlatego go właśnie wykorzystamy do stworzenia transkrypcji. Co ciekawe Whisper jest modelem open source’owym, można go uruchomić na swoim komputerze, ale my do połączenia wykorzystamy API od OpenAI.
Do połączenia z API od OpenAI będziemy potrzebowali klucza. Jeśli nie masz jeszcze konta na platformie OpenAI to musisz go założyć. Gdy już założysz konto przejdź do zakładki API Keys i kliknij przycisk Create New Secret Key.
Pamiętaj aby nie udostępniać klucza nikomu, ani nie umieścić go przypadkowo na repozytorium.
Według dokumentacji możemy do API przesłać bezpośrednio pliki wideo na przykład w formacie .mp4
, ale maksymalna waga pliku jest ograniczona do 25 megabajtów, dlatego w naszym kodzie zastosujemy bibliotekę, która wyciągnie plik dźwiękowy w formacie .mp3
z naszego wideo, a także odpowiednio podzieli ten plik jeśli jego rozmiar przekroczy 25 megabajtów.
Do obsługi API wykorzystamy oficjalną bibliotekę stworzoną przez OpenAI. Możesz wykorzystać tą bibliotekę do stworzenia własnego projektu, lub wykorzystać mój projekt do którego link umieszczam w opisie, a który teraz omówię.
Aby skorzystać z projektu najpierw sklonuj repozytorium korzystając z tej komendy, następnie przejdź do utworzonego podkatalogu i zainstaluj wszystkie niezbędne paczki npm-owe.
Ostatnim krokiem jest uzupełnienie pliku .env
. W tym pliku musisz podać swój tajny klucz API od OpenAI. Aby skorzystać z tego projektu i wygenerować transkrypcję należy wykonać komendę node index.js i podać ścieżkę do pliku video.
Zanim przetestujemy działanie tego projektu zobaczmy najpierw co dzieje się w kodzie. Najpierw w pliku index.js importujemy niezbędne biblioteki oraz ładujemy niezbędne zmienne środowiskowe z pliku .env.
Dalej z przekazanych parametrów uruchomieniowych odczytujemy ścieżkę do pliku video. Jeśli ścieżka nie zostanie przekazana to zwracamy błąd i zakończamy działanie aplikacji. Podobną sytuację mamy z kluczem API od OpenAI.
W dalszej kolejności odczytujemy trzeci parametr który możemy przekazać podczas uruchomienia aplikacji. Jest to parametr który określa minimalny czas trwania jednej frazy na ekranie.
Dalej do zmiennej output.dir przypisujemy nazwę katalogu wynikowego w którym będą przechowywane pliki z transkrypcjami. Jeśli taki folder istnieje to najpierw go usuwamy i tworzymy nowy. W tej części występują już niezbędne operacje do wygenerowania transkrypcji. W pierwszym kroku za pomocą funkcji extract audio wyodrębniamy sam plik .mp3. W tej funkcji wykorzystujemy bibliotekę fluent.ff.mpeg za pomocą której właśnie wyodrębnimy sam plik audio. Wracając do pliku index.js po wydzieleniu pliku .mp3 ze ścieżką audio następuje jego podział tak aby żaden plik nie był większy niż 20MB co jest limitem wielkości pliku który można przesłać do API OpenAI. W funkcji split audio file również korzystamy z biblioteki fluent.ff.mpeg która wykonuje odpowiednie przekształcenie tak aby podzielić jeden duży plik .mp3 na kilka mniejszych. Tak przygotowane pliki przesyłamy po kolei do modelu whisper. Wykorzystujemy do tego funkcję transcribe audio. W wnętrzu tej funkcji wykorzystujemy bibliotekę OpenAI. Do stałej OpenAI przypisujemy nowy obiekt klasy OpenAI. W parametrach podajemy klucz załadowany z pliku .env. Aby wykonać transkrypcję wykorzystujemy obiekt OpenAI audio transcription oraz metodę create. Za pomocą tej metody przesyłamy plik .mp3. Określamy model który ma zostać zastosowany. Określamy także rodzaj odpowiedzi, format odpowiedzi. Zgodnie z dokumentacją możemy zastosować format odpowiedzi taki jak .json, .txt, .srt czyli format napisów używanych w filmach podobnie jak format .wtt, a także jeszcze opcję verbose.json. W moim projekcie wykorzystam opcję verbose.json ponieważ jest ona niezbędna aby zastosować złożoną granulację. Wysyłając plik do API możemy także określić formę granulacji jaką chcemy otrzymać. Czy ma być to granulacja słowo czy segmentu. O co chodzi z tą granulacją? API może nam zwrócić dokładne znaczniki czasu dla poszczególnych słów lub segmentów lub jednego i drugiego. W moim projekcie chcę mieć zarówno informacje o czasie wystąpienia każdego słowa oraz każdej frazy. Dlatego ustawię parametr timestamp granularities jako tablicę word oraz segment oraz response format verbose.json. Wróćmy jeszcze do pliku index.js. Gdy już wszystkie pliki mp3 zostaną przetworzone i będziemy mieli transkrypcję wszystkich plików. Łączymy wszystkie teksty tak aby powstał jeden całościowy tekst transkrypcji. Używamy do tego funkcji combine transcriptions. Otrzymane odpowiedzi z API OpenAI zapisujemy również w katalogu output pliku transcription.json. Dzięki temu będziemy mogli podglądnąć konkretne odpowiedzi jakie zostały zwrócone przez API. Gdy już otrzymamy transkrypcję dokonujemy jej przetworzenia. W tym przypadku przetwarzamy ją w taki sposób aby długość wystąpienia pojedynczej frazy ze słowem nie była krótsza niż określony parametr. Dzięki temu przygotowując film z napisami które pojawiają się słowo po słowie unikniemy bardzo krótkich czasów wyświetlania pojedynczego słowa. Gdy już plik zostanie przetworzony zapisujemy dwa pliki w formacie SRT czyli w formacie który można zastosować w wielu programach do edycji wideo. Zapisujemy dwa pliki ponieważ jeden plik będzie przygotowany do wyświetlenia w takiej formie właśnie słowo po słowie. Natomiast drugi plik będzie zawierał pełne zdania przygotowane przez transkrypcję przez model whisper. Myślę że już nadszedł czas aby przetestować działanie. W terminalu uruchamiam komendę node. Następnie podaję nazwę pliku index.js. Kolejnym parametrem uruchomieniowym jest ścieżka do pliku video. W moim przypadku jest to plik w tym samym katalogu whisper.mov. I ostatnim parametrem jaki mogę podać jest długość minimalnego czasu trwania pojedynczej frazy pojedynczego słowa. Określę ją na długość 800 milisekund. I klikam enter. Widzę że skrypt działa. W tym momencie whisper generuje transkrypcję. Okej otrzymaliśmy transkrypcję. Jest to treść tego filmu. Zerknijmy jeszcze do folderu output. Wygenerowany został tutaj folder whisper bo tak nazywał się mój plik video. W katalogu znajdziemy plik ze ścieżką dźwiękową w formacie MP3. Plik json który zawiera odpowiedzi sym modelu z API od OpenAI. W tym pliku możemy prześledzić wszystkie frazy oraz ich czasy początku i końca jakie zostały znalezione w ścieżce dźwiękowej. Widzimy w tym pliku zarówno granulacje na segmenty jak i na pojedyncze słowa. Kolejny plik json zawiera w zasadzie te same informacje. Jedynie w granulacji z słowami mogą występować różnice. Długość fraz została dobrana w taki sposób aby czas wyświetlenia był nie krótszy niż 800 milisekund które podaliśmy jako parametr uruchamiając aplikację. W dalszej kolejności w folderze output mamy pliki w formacie SRT. Jest tutaj plik zawierający zarówno pełne segmenty jak i plik wyświetlający słowo po słowie. To już wszystko co chciałem pokazać w tym filmie. Chociaż może nie. Zobaczcie jeszcze jak wyglądają napisy wygenerowane właśnie za pomocą tego projektu. Jeśli film wam się podobał koniecznie dajcie łapkę w górę bo pomoże mi to rozwinąć kanał. A żeby nie ominąć kolejnych filmów koniecznie kliknijcie przycisk subskrybuj.