Razpoznavanje govora brez oblaka!
V januarski številki smo si v članku Stran s tipkovnico, računalniku narekujmo! ogledali kar nekaj orodij, ki znajo pretvoriti govorjeno besedo v besedilo. Večini opisanih rešitev je bilo skupno, da pretvorbo počnejo nekje v »oblaku«. Kaj pa, če besedila nočete izpustiti iz svojih rok, hkrati pa še iščete »cenovno ugodno« (beri: zastonjsko) rešitev?
Rešitev je orodje Whisper, ki ga je podjetje OpenAI konec leta 2022 dalo v javno rabo. Poleg osnovnega pogona so v javno last prepustili tudi nekaj jezikovnih modelov različne velikosti (in seveda tudi kakovosti). Prva različica se je učila na 680.000 urah posnetkov, od katerih je bilo le 117 tisoč ur neangleških. Angleščino je umetna pamet zato prepoznavala bistveno bolje od ostalih jezikov. Kasneje so izdali še dve izboljšani različici jezikovnih modelov in zadnja, large-v3, že kar dobro razume tudi slovenščino. No, vsaj včasih.
Kako namestiti Whisper
Preden boste lahko razpoznavali govor na svojem računalniku, boste morali namestiti nekaj nujno potrebnih komponent. Za začetek potrebujete Python. Nekaj malega izkušenj z ukazno vrstico tudi ne bo odveč, saj bo delo z Whisperjem potekalo izključno v tem načinu.
Python morda že imate (v ukazno vrstico vpišite python pa boste videli, ali se požene). Če ga še ni, je namestitev silno enostavna, saj ga poznajo vsi namestitveni sistemi najbolj razširjenih operacijskih sistemov. V ukazno vrstico, odprto z administratorskimi privilegiji, vpišite winget install python (Windows), brew install python (MacOS) ali apt install python (večina Linuxov). Če se slučajno Python noče namestiti, vam bo zagotovo lahko pomagal svetovni splet.
Ker je namestitev Whisperja kar obilna (25 paketov in nekaj gigabajtov robe), priporočamo, da ga namestite v Pythonovo virtualno okolje venv. Tako bodo vsi nameščeni paketi shranjeni v eni mapi, ki jo lahko enostavno pobrišete, če bi radi povrnili staro stanje sistema. Z naslednjo inkantacijo boste naredili virtualno okolje v podmapi whisper in ga aktivirali.
python -m venv whisper
whisper\scripts\activate
Virtualno okolje zapustite z ukazom deactivate, aktivirate pa tako, da ponovno poženete activate.
V tako ustvarjenem okolju najprej posodobite Pythonov upravitelj paketov pip, nato pa namestite Whisper.
python -m pip install –upgrade pip
pip install openai-whisper
Da ne boste iskali delujočih knjižnic CUDA in CUDNN, ki jih Whisper potrebuje za delo, bo naslednje zaporedje ukazov na sistem naložilo knjižnico Torch z vsemi potrebnimi dinamičnimi knjižnicami CUDA 12.
pip uninstall torch
pip cache purge
pip3 install torch -f download.pytorch.org/whl/torch_stable.html
Whisper je zdaj pripravljen na delo!
A pojdimo od začetka. Za poganjanje Whisperja boste potrebovali računalnik z enim od najpogostejših operacijskih sistemov (Windows, Mac, Linux) in na njem naložen Python ter nekaj dodatnih paketov. (Več o tem preberite v okvirčku Kako namestiti Whisper.) ter tudi grafično kartico podjetja NVidia, ki podpira gonilnike CUDA vsaj različice 11. Za rabo najboljših jezikovnih modelov je priporočljivo, da ima ta vsaj 4 GB pomnilnika.
Vsa testiranja smo opravili na pet let starem prenosniku s kartico NVidia GeForce GTX 1050 Ti, na kateri Whisper teče brez najmanjših težav (čeprav morda ne tako hitro, kot bi na novejšem sistemu). Ta sicer lahko deluje tudi brez NVidijine kartice, a postane tako počasen, da je popolnoma neuporaben (več kot pet minut procesiranja za eno minuto zvočnega posnetka).
Whisper smo – tako kakor v januarskem članku – testirali na Prešernovi Zdravljici, kot jo bere Stane Sever (monitor.si/sever), novoletni poslanici predsednice republike (monitor.si/PircMusar) in skeču Gašperja Berganta (monitor.si/Bergant).
Prvo razpoznavanje
Ko imate nameščena Python in Whisper, lahko zvočne datoteke prepoznavate z ukazom whisper Posnetek.mp3 --model tiny --output_format txt --device cuda. (Da, vse boste počeli iz ukazne vrstice.) Pri tipkanju bodite pozorni – vsako stikalo se začne z dvema minusoma in ne s pomišljajem. Whisper bo najprej z interneta prenesel jezikovni model tiny, nato pa pognal prepoznavanje zvočne datoteke Posnetek.mp3 in rezultat zapisal v trenutno mapo v datoteko Posnetek.txt. Jezikovni model bo ostal shranjen na disku, zato ob naslednjem prepoznavanju niti interneta na potrebujete več.
Za prvi test smo uporabili model tiny, ki je velik le 70 MB, zato se hitro prenese in deluje tudi v grafičnih karticah z malo pomnilnika. Uporaben pa ni, saj je razpoznavanje izredno slabo. Denimo, predsedničin nagovor se začne z »Drag je držoljankje in deržoljani prebi vauke in prebi vauci Slovenije«, kar ni niti za osnovnošolsko dvojko. Za resno delo boste morali uporabiti večji jezikovni model. Na voljo so tiny, base, small, medium, large-v1, large-2 in large-v3. Zadnji zasede na disku kar 3 GB prostora.
Whisper samodejno (in zelo dobro) zazna jezik, delo pa mu lahko olajšate tako, da pri zagonu navedete še stikalo --language Slovenian. Koristno stikalo, ki smo ga uporabili že v zgornjem primeru, je --output_format, s katerim določite obliko rezultata. Zahtevate lahko tekstovno datoteko v obliki UTF-8 (txt), nekaj različnih vrst datotek s podnapisi (vtt, srt in tsv) ali pa format json, namenjen kasnejši programski obdelavi. V zadnjem primeru lahko s stikalom --word_timestamps True zahtevate, da je vsaka beseda opremljena s časovno kodo. Za še več parametrov pa poženite Whisper s stikalom --help.
Hitrejši Whisper
Ker je osnovna implementacija OpenAI Whisper relativno počasna, boste verjetno raje uporabili projekt Faster-whisper, v katerem so del implementacije prevedli v jezik C++. Ker se ta koda prevede v strojni jezik procesorja, je implementacija precej hitrejša, hkrati pa porabi manj pomnilnika na grafični kartici. Minus te rešitve je, da je implementacija vezana na CUDA 11, paket Torch, omenjen v okvirčku Kako namestiti Whisper, pa vsebuje knjižnice CUDA 12, zato boste morali do pravih dinamičnih knjižnic priti sami. Navodila za prenos in namestitev boste dobili na naslovih developer.nvidia.com/cublas in developer.nvidia.com/cudnn.
Ko sta nameščena CUDA 11 in CUDNN, naredite virtualno okolje in namestite razpoznavalnik faster-whisper z ukazno vrstico whisper-ctranslate2 z naslednjim zaporedjem ukazov.
python -m venv whisper-ctranslate
whisper-ctranslate\scripts\activate
python -m pip install –upgrade pip
pip install whisper-ctranslate2
Z večjim modelom dobimo tudi boljše rezultate, se pa hkrati s tem razpoznavanje tudi precej upočasni. Za novoletno poslanico, ki je dolga 188 sekund, je testni računalnik z modelom small porabil 74 sekund, z modelom medium 303 sekunde, z modelom large-v3 pa kar 780 sekund! Glavni krivec za to je bila grafična kartica, ki ji je že z modelom medium primanjkovalo pomnilnika. Nvidijin program nvidia-smi je pokazal, da ima kartica porabljenih vseh 4GB pomnilnika in da porabi 95 – 100 odstotkov moči GPU.
Če imate dovolj pomnilnika ali pa vam model medium zadostuje (pri našem preizkušanju ni kaj dosti zaostajal za large-v3), lahko tukaj že končate branje. Če pa menite – tako kot avtor teh vrstic –, da so računalniki vedno prepočasni, ostanite še malce z nami.
Hitrejši Whisper
Projekt faster-whisper (github.com/SYSTRAN/faster-whisper) je reimplemetacija OpenAI Whisper, ki uporablja hitro knjižnico C++ CTranslate2. Po besedah avtorjev je do štirikrat hitrejša od originala, hkrati pa porabi manj pomnilnika. Za hitrost pa je treba tudi plačati – tokrat z bolj zapleteno namestitvijo. Več o tem si oglejte v okvirčku Hitrejši Whisper.
Faster-whisper uporabljate povsem enako kot Whisper, le da ukaz whisper zamenjate z whisper-ctranslate2. Na voljo je tudi nekaj dodatnih stikal (vse vam bo pokazal --help), od katerih je najpomembnejše --vad_filter True. S tem vključimo filter, ki iz posnetka izloči vse dele, ki niso govorjeni (VAD – Voice Activity Detection) ter s tem izboljša rezultat.
zdravljica.png: Zdravljica, razpoznana z orodjem faster-whisper in modelom large-v3.
Faster-whisper je prav zares hitrejši. Za 188 sekund novoletne poslanice je z modelom small porabil 25 sekund (2,9-krat hitreje), z modelom medium 53 sekund (5,7-krat hitreje) ter z modelom large-v3 96 sekund (8,1-krat hitreje). Delovanje z modelom medium smo si ogledali tudi z nvidia-smi, ki je pokazal, da je na kartici porabljenih le 1,8 GB pomnilnika (v primerjavi s 4 GB pri osnovnem Whisperju).
Rezultati
Posvetimo še nekaj besed rezultatom. Obe implementaciji delujeta podobno, ne pa identično. V ozadju je pač nevronsko omrežje, ki nima pojma o pravilih slovenščine. Rezultat majhnih modelov je sicer zabaven, a neuporaben (»nele na vschodoje urope,«, »Spoznanje, kako solidarnje in srčnismo« in podobno), z večjimi modeli (medium, large-v3) pa dobimo že kar spodoben rezultat.
Zdravljica, razpoznana z orodjem faster-whisper in modelom large-v3.
Nekaterih napak pa se vseeno ne moremo znebiti. Whisper (v obeh različicah) rad zapiše »prebivavke« (prebivalke), »drugot« (drugod), »ulagamo« (vlagamo), »nele« (ne le), »prostovolcev« (prostovoljcev), »nimi« (njimi), »pre mnogi« (premnogi) in podobno. Skratka, napake, ki se bi jih sramoval vsak osnovnošolec. Če rezultat spustimo še skozi ChatGPT, pa dobimo že zelo dobro različico, ki potrebuje le še malo lekture.
Po drugi strani pa je delovanje na narečni slovenščini Gašperja Berganta neverjetno dobro. Napak je bilo le malo in večinoma so bile nemoteče. Še največji kiks je bil pri razpoznavanju »da četrte že šter gajbe«, iz česar je nastalo »da 44 gajbe«.
Najboljša rezultata razpoznavanja sta nastala z implementacijo Faster-whisper, modelom large-v3 in stikalom --vad_filter True. Ogledate si jih lahko v okvirčkih Novoletna poslanica in Gašper Gašper.
Ocena v enem stavku? Rezultat sicer ni neposredno uporaben, je pa odlična osnova za nadaljnje delo.
Rezultati razbiranja
Novoletna poslanica (monitor.si/PircMusar)
Drage državljanke in državljani, prebivalke in prebivalci Slovenije, rojake v zamejstvu in po svetu. Leto 2022 je bilo leto solidarnosti. Leto aktivnih državljank in državljanov poguma in boja za pravičnost. Bilo je leto športnih uspehov, prebojev v znanosti, medicini in odličnosti v kulturi. Leto, ko smo v Sloveniji ženske skočile daleč in splezale visoko. Najprej Urša Bogataj in Janja Garembred, za njimi ženske v politiki. In bilo je leto tihih porazov in odhodov. Letos nas je zapustil veliki Boris Pahor, človek, ki je videl največje strahote 20. stoletja in pred njimi svaril v 21. stoletju. A so ga številni preslišali? Pre mnogi so letos premladi, umirali zaradi vojn in nasilja ne le na vzhodu Evrope, tudi drugod po svetu. Leto 2022 je bilo leto, ko je narava spet pokazala svojo moč. Suša in požari, ki so divjali na krasu, so prinesli strah pred mogočnostjo naravnih nesreč in ponos ob odzivu prostovoljnih gasilcev in gasilk, prebivalki in prebivalcev Slovenije. Požar na krasu je uničil rastje na krasu, a prinesel spoznanje, da vsakemu od nas lahko zraste nekaj velikega. Spoznanje, kako solidarni in srčni smo. Prinesel spoznanje o velikem srcu v sicer geografsko majhni državi. Humanitarka Anita Ogulin, ki je pomagala tolikim otrokom iz ranljivih družin, je pred časom dejala. Ne vem, če se kot družba zavedamo, da vse, kar vlagamo v sod človeka, on vrne ne le enkrat, trikrat, večkrat. In dodala, ozirati se je treba okoli sebe in treba je biti sočuten in solidaren. Če tega ne zmoremo, naj vsaj ne sodimo. Ponosna sem na Slovenijo gasilcev in gasilk, prostovoljcev in prostovoljk, srčnih zdravstvenih delavcev in negovalk, izjemnih inovatorjev in inovatork, podjetnic in podjetnikov, vrhunskih znanstvenic in znanstvenikov, sijajnih umetnic in umetnikov, športnic in športnikov, ki nam vedno znova prinašajo veselje. In ponosna sem na vse tiste prebivavke in prebivavce, ki se ozirajo, nesebično pomagajo ranljivejšim in ne sodijo. Državljankam in državljanom, prebivavkam in prebivavcev, v Sloveniji želim, da bi bilo leto 2023 svetlo leto. Leto pozitivizma, zdravja, veselja in prijaznosti. Srečno!
Gašper Gašper (monitor.si/bergant)
Vsake lete jim uspel bi bit nekoga, da se za 40 dni zaveže, da ne bo pil alkohol. In to vedno nekoga, ki zgleja, kot da itek ne pije. Leta si mi uspel dobit mojega fotra. Glej, kak zdrav zgleja. Koma in kaj točno koristi to, a? Kje so statistike vseh alkoholikih, ki so zaradi te akcije prenehali pit? Ja, njeh, a ne? Kje so statistike, ki dejansko dokazuje, da kebrozakonik deluje, a? Zdaj, alkohol lahko kupiš sam do 9 ure zvečer. Takrat, ko normalen folk dejansko začne pit. Zakon nas dobesedno sili v to, da začnemo pit prej in se naredimo, da 44 gajbe zaloge pira. Če pa si zaloge nisi naredil, pa po 9 lahko dobiš alkohol sam še v gostilni. Kjer pa so ostale alkoholiki, tvoja nova družina. Vsaka gostilna se enkrat zaprema. In je treba domov. In to, seveda, z avtom. In te nevarnosti bi se lahko znebili, če bi že na začetku lahko kupili alkohol po 9, a ne? In varno pili doma. Vsaka slovenska familija ima vsaj enega alkoholika, oziroma ga more imeti. To je slovenska tradicija in folklora. Če se ti pa zdi, da v vaši familii ni noben alkoholik. Pol se pa upa trditi, da si to ti. Vem, da ni prijetno in fajn slišati, ampak pesmi, igre, stavbe, vse, kar vam je ljubo pod solncem, je nastalo pod rokami alkoholikov. Zato mislim, da je čas, da jih nekamo omejevati in jim damo svobodo, ki si jih zasluži. Prav, za kje dogaja, sem preverjal Gašper Gašper. Na zdravje.