Whisper, czyli robimy z głosu tekst

UWAGA NA WSTĘPIE: Warto zajrzeć do nowszego posta na temat Whispera w bardziej "strawnej" wersji!


Pisałem w sierpniu 2021 o możliwościach komputera w rozpoznawaniu mowy. Wówczas wprawdzie bardziej chodziło mi o przyspieszenie pracy nad skryptem, żeby nie tracić czasu na klepanie w klawiaturę, jednak okazało się, że piszę dużo szybciej, niż jestem w stanie dyktować komputerowi.

Ale, tak czy owak, warto przygotować transkrypcję audycji dla osób, które nie są w stanie jej wysłuchać. Wprawdzie w przypadku mojego podcastu wydaje się to trochę abstrakcyjne, bo jak przełożyć na tekst test mikrofonu, ale przecież nie ja jeden robię podcasty. Kiedy więc kolega Piotr Bartkowski zapytał mnie, czy słyszałem o darmowym programie Whisper, czujnie postawiłem uszy i stanąłem słupka. Oho!

Schooody

Początki zabawy z Whisperem nie napawają jednak optymizmem. Po pierwsze, warto mieć zainstalowany język Python w komputerze, bo wygodnie korzysta się z Whispera za pośrednictwem tego właśnie języka.

Potem niekoniecznie jest łatwiej, więc warto skorzystać z opisu, jak zainstalować i jak używać tego narzędzia. Jest to opisane także w repozytorium projektu.

W moim przypadku rzecz sprowadziła się na szczęście tylko do pobrania projektu z repozytorium i już mogłem uruchomić pierwszy skrypt pythonowy:

import whisper;


model = whisper.load_model("base")
result = model.transcribe("f:\\podcast_010049.mp3")
print(result["text"])

I tak oto po około pięciu minutach dysponowałem gotową transkrypcją 49 odcinka mojego podcastu o mikrofonie PreSonus PD70, którą to transkrypcję możecie podejrzeć tutaj. Faktycznie wyszło całkiem fajnie, choć nie da się ukryć, że dokument wymagałby dokładnej edycji - ale jest już na poziomie, że ta edycja trwałaby krócej niż spisywanie odcinka ręcznie.

Czasy podano dla Windows 10 64bit, procesora Intel i3570K oraz pamięci 24GB.

Może być lepiej!

Na szczęście, Whisper ma do dyspozycji kilka tak zwanych modeli, służących do transkrypcji. Użyłem początkowo modelu base, czyli stosunkowo prostego. Do dyspozycji mamy jeszcze jeden słabszy tiny i trzy mocniejsze: small, medium oraz large. Najpierw, rzecz jasna, rzuciłem się do sprawdzania największego - pobrałem model (2,5GB!) i uruchomiłem skrypt. Po pół godzinie dałem jednak za wygraną - mój komputer zdecydowanie przegrał z wymaganiami największego modelu.

Ale nie poddałem się, zainstalowałem najpierw model small (ok. 450MB) i ten już zdołał dokonać transkrypcji w akceptowalnym czasie niemal dwukrotnie dłuższym niż samo nagranie (ok. 12 minut, przy niespełna 8 minutach, które ma odcinek). Za to jakość tej transkrypcji jest już zdecydowanie lepsza - a można ją podejrzeć tutaj. Poprawki nadal są konieczne, ale naprawdę jest to już coś!

Nie byłbym sobą, gdybym nie wypróbował modelu medium (1,4GB). Tutaj czas transkrypcji był dłuższy prawie trzy razy niż w modelu small i wyniósł 33 minuty. Jakość znów się poprawiła i w zasadzie treść wymagała jedynie kosmetycznych poprawek, co możecie sprawdzić tutaj.

PS. Poświęciłem się, odczekałem prawie 2 godziny i wygenerowałem także tłumaczenie dla modelu large. I faktycznie, jest najlepsze.

CUDA, panie!

Whisper może działać szybciej, tylko trzeba go uruchomić z wykorzystaniem CUDA, czyli korzystając z mocy obliczeniowej karty graficznej nVidii. Kartę taką mam, ale samo w sobie niczego to nie znaczy, bo trzeba jeszcze odpowiednio wszystko skonfigurować, aby moduł torch "zauważył", że karta obsługująca CUDA jest dostępna.

Wymagało to w moim przypadku odinstalowania modułu torch i zainstalowania w jego miejsce modułu pytorch, co dość klarownie jest opisane w tej dyskusji. Pobieranie sterowników trwało dobrą chwilę, bo i one zajmują ponad 2GB, ale za to kiedy uruchomiłem transkrypcję po ich zainstalowaniu, Whisper dostał prawdziwego kopa i to na mojej zabytkowej już karcie GeForce GTX960: model base uwinął się z robotą w mniej niż minutę, model small w niespełna dwie minuty. Niestety, był to koniec sukcesów, bowiem próba wykorzystania modeli medium i large nie powiodła się w trybie CUDA - moja karta ma za mało pamięci, bo tylko 2GB, co dla tych modeli jest już wartością niewystarczającą (model large potrzebuje około 10GB pamięci!)...

Wnioski końcowe

Przyznam, że jestem pod wielkim wrażeniem skuteczności Whispera. Naprawdę, już od modelu small daje radę, a i prostszy base jest od biedy akceptowalny. Jednak to, co się zaczyna wyprawiać w modelach medium oraz (szczególnie) w large - czapki z głów! Nie spodziewałem się aż tak dobrych wyników!

Trzeba jednak w tej radości pamiętać o dwóch rzeczach: kontrola jest nadal wskazana, bo transkrypcja nie jest stuprocentowo poprawna i to niekoniecznie z winy ograniczonego algorytmu. Lektor mógł coś niepoprawnie wymówić, robił pauzy, zawieszenia głosu. Czasem warto też po prostu poprawić składnię, która podczas mówienia bywa lekko chaotyczna i o ile w słuchaniu to nie przeszkadza mocno, to już przy czytaniu troszkę zaczyna zgrzytać.

Druga rzecz to apetyt na moc obliczeniową i pamięć. Najlepsze efekty uzyskuje się, stosując większe modele, wtedy tekst trzeba poprawiać w najmniejszym stopniu. Jeśli mamy do zrobienia wiele transkrypcji, to naprawdę przyda się szybki komputer, najlepiej z szybką kartą graficzną nVidii, wspierającą technologię CUDA i mającą do dyspozycji przynajmniej 8GB pamięci. Inaczej... no cóż, albo stracimy czas poprawiając bardziej niedoskonałe transkrypcje, albo stracimy czas czekając na transkrypcje lepsze.

Polecam tak czy owak wypróbować - warto w tym celu przemęczyć się z instalowaniem Pythona czy git-a.

Komentarze

  1. Masa literówek i przekłamań. Szybciej można to wklepać ręcznie.

    OdpowiedzUsuń
    Odpowiedzi
    1. Strasznie mało konkretów jak na takie stwierdzenie. Jaki model był używany i do jakiego materiału? W ciągu ostatniego tygodnia przerobiłem za pomocą modelu "large" kilkadziesiąt odcinków mojego podcastu. Jeśli w transkrypcji kilkunastominutowego odcinka znajduję 5-6 błędów, to uważam to mimo wszystko za rewelacyjny wynik.
      Ale nawet gdyby przyjąć mało dokładny model "base", to sprawdziłem - ręczne wpisanie ośmiominutowego odcinka zajęło mi 14 minut. Poprawienie błędów w transkrypcji z modelu "base" - około pięciu minut.

      Usuń
    2. Pisałem o próbce podanej jako przykład w tym wpisie.
      Poza tym nadaje się to wyłącznie do bardzo prostego materiału, z dobrym mikrofonem, jedną osobą wyraźnie mówiącą. Niestety w prawdziwym życiu mamy bardziej skomplikowane sytuacje.
      Nie twierdzę, że jest bezwartościowe, ale nie jest też jeszcze przełomem typu "wciśnij i zapomnij".

      Usuń
    3. Proszę w takim razie wskazać w próbce z modelu "large" ową "masę literówek i przekłamań", która sprawia, że szybciej będzie treść wpisać niż poprawić, skoro pierwszy komentarz odnosił się do próbek z tekstu.

      Nigdzie nie twierdzę, że jest to narzędzie idealne, a wynik nie wymaga poprawek (a nawet dwa razy wspomniałem, że koniecznie trzeba wynik skontrolować). To po prostu narzędzie i ośmielę się stwierdzić, że tak, jest przełomem, bo do tej pory nie można było robić za darmo transkrypcji języka polskiego na tak wysokim poziomie.


      Usuń
    4. "mającą ujaż mieć głoski wybuchowe."
      Co drugie zdanie ma takie kwiatki.

      Usuń
    5. Proszę czytać ze zrozumieniem: w próbce modelu "large". W niej to zdanie brzmi: "PD70 ma firmowo założoną gąbeczkę mającą ujarzmić głoski wybuchowe." i jakoś nie widzę, żeby tam w co drugim zdaniu coś było nie tak. Jeśli chcemy mieć transkrypcję prawie na gotowo, to chyba logiczne, że używamy modelu, który daje najwyższą jakość?

      Usuń
  2. O, fajnie, że napisałeś o tym - nie używam Linuksa, więc nie testowałem tam Whispera ani Speech Translate. Dobrze wiedzieć, że jest alternatywa, bo faktycznie na razie jeszcze speech recognition wymaga dużych mocy obliczeniowych, chociaż podejrzewam, że za jakiś czas nawet smartfony będą sobie z tym radziły ;)

    OdpowiedzUsuń
  3. To prawda, przy modelu large zazwyczaj do poprawy jest baaardzo mało - radzi sobie rewelacyjnie nawet z czytanymi przeze mnie angielskimi nazwami firm, co - przyznam - zrobiło na mnie niemałe wrażenie :)

    Co do wydajności - mam teraz RTX3060 i zwykle transkrypcja trwa mniej więcej połowę czasu trwania materiału, więc jest już jak najbardziej ok, ale przy przetwarzaniu procesorem to byłaby makabra i pewnie stosowałbym model small + ręczne poprawki albo w ogóle dałbym sobie spokój ;) Fajnie, że da się to zrobić zdalnie, bez inwestycji.

    OdpowiedzUsuń

Prześlij komentarz