Transcrierea audio în text în limba română poate rula offline, pe CPU, cu modele precum Whisper, SpeD și Parakeet. În testele noastre, diferențele au ținut de timpul de procesare, greșelile de transcriere și felul în care modelele au recunoscut engleza din frazele românești.
La DO IT MAGIC urmărim constant ce soluții AI locale sau mixte funcționează în practică, nu doar în prezentările producătorilor. Publicăm aceste rezultate ca o contribuție la informațiile tehnice disponibile despre recunoașterea vocală în română, unde comparațiile cu cifre, exemple și limite declarate sunt încă puține. Pentru această rundă am ales dictarea ca scenariu de test, pentru că acolo întârzierile se observă imediat: termini o propoziție și aștepți să vezi ce a înțeles aplicația. Dacă mai trebuie să repari câteva cuvinte, începi să te întrebi cât timp ai câștigat față de tastare.
Am comparat mai multe modele de recunoaștere vocală, cu o cerință comună pentru această rundă: procesarea audio să rămână pe calculatorul utilizatorului și să poată rula pe CPU. Ne interesa în primul rând româna, inclusiv felul în care o vorbim într-o discuție despre software, cu expresii englezești strecurate printre cuvintele românești.
Testele din septembrie 2026 ne-au dat câteva răspunsuri utile. SpeD s-a descurcat foarte bine pe proză românească. Whisper Large-v3-Turbo a păstrat mai bine engleza din proba mixtă, cu un timp de procesare mai mare. Iar încercarea de a corecta transcrierile cu modele lingvistice mici ne-a arătat cât de ușor poate deveni un text mai fluent și, în același timp, mai puțin fidel înregistrării.
Speech-to-Text, sau STT, transformă vorbirea în text. În lucrările de cercetare întâlnim mai des numele Automatic Speech Recognition, prescurtat ASR. În scenariul de dictare folosit pentru teste, rezultatul trebuie să poată fi introdus într-un e-mail, într-un document sau într-un formular, fără operația intermediară de copiere și lipire.
Un API cloud poate simplifica mult dezvoltarea: furnizorul rulează modelul, iar aplicația trimite audio și primește text. Pentru documente interne, însă, ne interesează cât de departe se poate merge păstrând procesarea pe dispozitiv. O soluție mixtă, cu cloud doar acolo unde aduce un câștig clar, rămâne o opțiune; întâi am vrut să știm ce pot face modelele locale. După descărcarea și pregătirea modelelor necesare, transcrierea poate funcționa și fără conexiune la Internet.
Alegerea mută o parte din muncă în aplicație. Trebuie să distribuim modelele, să gestionăm memoria și să ținem cont de procesorul disponibil. Tot noi trebuie să rezolvăm capturarea sunetului și împărțirea lui în fragmente suficient de lungi pentru o transcriere bună, dar suficient de scurte pentru ca utilizatorul să nu aștepte prea mult.
Whisper a fost un candidat firesc. Modelul original a fost antrenat pe aproximativ 680.000 de ore de audio multilingv și multitask.1 Pentru rularea locală există implementări precum whisper.cpp și faster-whisper, pe care le-am inclus în comparație.23
Am testat și Parakeet TDT 0.6B v3, modelul NVIDIA care suportă 25 de limbi europene, inclusiv româna.4 Am ajuns la el evaluând Voz, ASR-ul DesertAnt, distribuit oficial doar pentru Apple Silicon. Pe Linux am folosit direct modelul NVIDIA prin sherpa-onnx; cifrele de mai jos nu descriu implementarea Core ML a DesertAnt.
Pentru comparația principală am păstrat două înregistrări: una de 52,099 secunde în română și una de 83,963 secunde în care româna alternează cu engleza. Ambele sunt PCM mono, pe 16 biți, la 16 kHz. Sunt probele finale preprocesate cu Clear, folosite ca intrare comună pentru modelele comparate.5
Testele au rulat local, pe Linux și CPU. Pentru faster-whisper am consemnat 15 fire de execuție și beam size 5. Notele păstrate nu includ modelul exact al procesorului, toate versiunile bibliotecilor sau statistici din rulări repetate. Cifrele descriu experimentele noastre; nu sunt suficiente pentru a promite aceiași timpi pe alt calculator.
| Model și implementare | Încărcare | Română, 52,099 s | Română–engleză, 83,963 s |
|---|---|---|---|
| Parakeet TDT 0.6B INT8, prin sherpa-onnx | 1,903 s, separat | 3,980 s | 7,490 s |
| faster-whisper Small INT8 | 0,787 s, separat | 7,048 s | 10,203 s |
mikr/whisper-small-ro-cv11 INT8 |
1,092 s, separat | 8,823 s | 12,822 s |
| whisper.cpp Small | Inclusă în timpii din dreapta | 13,76 s | 11,78 s |
| whisper.cpp Large-v3-Turbo Q5 | Inclusă în timpii din dreapta | 30,72 s | 40,56 s |
Diferența dintre coloane contează: pentru primele trei configurații avem încărcarea măsurată separat; pentru cele două variante whisper.cpp, ea este inclusă. Tabelul compară configurațiile folosite, cu implementări și setări diferite. Nu izolează performanța arhitecturii fiecărui model.
Pe proba mixtă, Large-v3-Turbo a păstrat cel mai bine expresii precum „user experience”, „speech recognition” și „real-time transcription”. Cele 40,56 secunde au fost însă un cost ridicat pentru experiența pe care o urmăream.
Acest timp nu înseamnă că utilizatorul ar aștepta 40 de secunde după fiecare propoziție. Aplicația procesează fragmente, iar testul din tabel a folosit fișierul complet. Latența dictării trebuie măsurată de la sfârșitul vorbirii până la apariția textului, incluzând pauza de segmentare, inferența și inserarea rezultatului.
SpeD Romanian este un model de aproximativ 110 milioane de parametri, bazat pe FastConformer și adaptat pentru română. Autorii descriu antrenarea pe peste 2.600 de ore de vorbire și o configurație hibridă CTC/TDT.6
Cele două prescurtări descriu moduri de a obține secvența de text. CTC permite învățarea fără o aliniere manuală exactă între fiecare cadru audio și transcriere și se poate decoda printr-o strategie simplă, greedy. TDT prezice tokeni și pași de avans în timp, reducând numărul de pași necesari în decodare.7 În comparația noastră am folosit ramura CTC a SpeD, în varianta INT8.
Am făcut un test separat pe o înregistrare de 96,7 secunde de proză românească. Aceasta a fost împărțită în aceleași nouă segmente pentru SpeD și Parakeet.
| Model | Încărcare | Transcrierea celor nouă segmente |
|---|---|---|
| SpeD Romanian CTC INT8 | 0,628 s | 0,666 s |
| Parakeet TDT 0.6B INT8 | 1,418 s | 2,588 s |
La evaluarea transcrierilor, SpeD a avut mai puține greșeli. Problemele principale au rămas primul cuvânt și numele „Carnegie”. Parakeet a produs mai multe forme deformate, printre care „Cercetori-efectuat” și „ingenieria”. Este o observație calitativă pe acea probă; nu am consemnat un scor WER, adică rata erorilor la nivel de cuvânt.
Proba avea și o limitare de captură: nivelul audio era scăzut. Acest lucru a afectat intrarea ambelor modele. Fișierul nu a fost păstrat, deci testul nu poate fi reprodus din cele două înregistrări disponibile în proiect.
Împărțirea celor 96,7 secunde la 0,666 dă un raport de aproximativ 145. Ar fi tentant să îl prezentăm drept viteza aplicației. Numărătorul este însă durata înregistrării, iar numitorul este timpul de transcriere al segmentelor selectate de VAD, după încărcarea modelului. Măsurătoarea arată că această etapă a fost rapidă; nu include întregul traseu de la microfon la text.
Rezultatul a fost suficient de bun pentru a justifica reevaluarea modelului implicit. În aplicația folosită ca banc de test, Parakeet era încă modelul implicit, iar SpeD o alternativă selectabilă.
Într-o conversație despre software, o propoziție precum „verific pull request-ul și după aceea intru în meeting” nu are nimic neobișnuit. Pentru recunoașterea vocală, alternarea limbilor, numită code-switching, merită testată separat.
Pe înregistrarea noastră mixtă, Parakeet a transformat „Speak to Me” în „Speed to Min”, „speech recognition” în „speech reconiction” și „pull request” în „por request”. SpeD a avut la rândul lui dificultăți cu engleza inserată în fraze românești. Large-v3-Turbo a păstrat mai bine aceste secvențe.
Faptul că Parakeet suportă ambele limbi nu a fost suficient pentru a evita erorile din această probă. Totuși, rezultatul nu spune cum s-ar comporta pe o înregistrare integral în engleză: acel test separat nu a fost făcut.
Pentru alegerea unui model, contează astfel și ce dictează omul. O pagină de proză românească și o discuție tehnică bilingvă pot duce la preferințe diferite, chiar pe același calculator.
În aplicația de test folosim Silero VAD pentru a detecta porțiunile cu vorbire.8 VAD-ul ajută la segmentare și la evitarea trimiterii către ASR a unor perioade fără vorbire. Reducerea zgomotului din interiorul unei porțiuni vorbite este o sarcină separată.
Cât așteptăm înainte să închidem un segment are efect direct asupra dictării. Un prag mic trimite textul mai repede la procesare, dar poate lăsa modelul cu prea puțin context. Un prag mai mare îi oferă o frază mai lungă și adaugă timp de așteptare.
Pentru SpeD cu restaurarea punctuației activată, implementarea folosește 1,2 secunde de liniște. Acest interval face parte din experiența utilizatorului, chiar dacă modelul de punctuație procesează apoi fragmentul în câteva milisecunde.
Înainte de transcriere, codul adaugă și 0,3 secunde de tăcere la începutul fragmentului și o secundă la final. Acest padding trebuie deosebit de păstrarea sunetului original din jurul segmentului: zerourile adăugate nu pot recupera o consoană deja tăiată. Pentru astfel de erori trebuie verificată captura și limita efectivă a segmentului.
Clear a rămas o direcție de lucru pentru prelucrarea audio. Deși probele din comparația principală au trecut prin el, la versiunea verificată nu exista o cale de execuție care să îl folosească în aplicație. În plus, proba inițială cu volum prea mic fusese înregistrată din nou. Nu putem atribui îmbunătățirea exclusiv procesării cu Clear.
Am încercat corectarea textului cu Qwen 2.5 0.5B, Qwen 3 0.6B, EuroMoE 2.6B A0.6B, Ministral 3 3B și Gemma 3 1B, rulate local prin llama.cpp. Experimentele au rămas separate de aplicație.5
La început am folosit un text cu greșeli introduse intenționat: „echipa au discutat”, „modificările aplicăției”, „microfonul funcționau prea încet”. Unele modele au reparat o parte bună din el. Gemma a avut cel mai bun rezultat dintre variantele testate pe această probă, deși a lăsat și greșeli.
Transcrierile reale au fost mai dificile. Un cuvânt recunoscut greșit poate fi apropiat fonetic de cel rostit, fără să ofere suficiente indicii în text. Modelul de corectură vede doar rezultatul ASR, nu și înregistrarea din care provine.
EuroMoE a introdus propoziții și acțiuni noi în fragmentele neclare. Ministral a schimbat sensul unor pasaje și a păstrat cuvinte deformate. Gemma a fost mai prudent, dar a corectat puțin din transcrierea reală. Pe proba mixtă a tradus expresii și propoziții englezești, deși instrucțiunea cerea păstrarea limbilor originale.
Pentru dictare, aceste comportamente ne-au făcut să renunțăm la corectura generativă automată cu modelele testate. Utilizatorul are nevoie să găsească în document ceea ce a spus. Dacă post-procesarea introduce o schimbare plauzibilă, dar greșită, aceasta poate fi mai greu de observat decât un cuvânt evident deformat.
Decizia privește aceste modele, configurații și probe. Un corector antrenat special pe erori ASR românești sau o metodă care restrânge modificările ar merita o evaluare nouă.
Pentru SpeD am ales o etapă mai restrânsă: restaurarea punctuației. Modelul punctuation_fullstop_truecase_romance suportă șase limbi romanice, inclusiv româna, și oferă predicții pentru punctuație și capitalizare.9
Integrarea noastră folosește doar etichetele pentru punct, virgulă și semnul întrebării. Cuvintele ASR sunt păstrate, iar formatterul existent se ocupă de capitalizare și comenzile vocale. În felul acesta, tokenizerul nu reconstruiește forme precum „de-a” sau „l-ai”.
Pe unul dintre textele testate, modelul a identificat corect câteva limite de propoziție și o întrebare, dar a lăsat formularea greșită „ea constă a determinat persoana”. Acesta este comportamentul așteptat de la etapa aleasă: poate face textul mai ușor de citit, fără să rezolve erorile de vocabular sau gramatică. Nici punctuația nu este garantată; o virgulă sau un semn de întrebare greșit poate influența interpretarea.
În testul Go, încărcarea și prima inferență au durat aproximativ 0,37 secunde. În teste Python separate, fragmentele au fost procesate după încărcare în 5–42 ms, iar memoria rezidentă maximă a procesului a fost de aproximativ 258 MiB. Sunt măsurători din două medii diferite, nu memoria și latența completă a aplicației desktop.
Opțiunea se aplică numai pentru SpeD. Parakeet folosește punctuația produsă de propriul model.
Pentru testele practice am folosit Speak2Me, aplicația noastră de dictare, scrisă în Go, cu Wails și o interfață React. Captura audio folosește malgo, iar modelele SpeD și Parakeet sunt accesate prin sherpa-onnx, care oferă API pentru Go și execuție locală bazată pe ONNX Runtime.10
ONNX ne permite să distribuim modelele într-un format executat de runtime-ul nativ. Variantele INT8 reduc precizia numerică pentru o parte dintre operații și greutăți; pot economisi memorie și pot accelera inferența pe procesoare potrivite. Câștigul depinde de model și hardware, iar acuratețea trebuie verificată după cuantizare.11
Integrarea mai înseamnă gestionarea resurselor native, încărcarea și schimbarea modelelor și coordonarea capturii cu transcrierea. În calea ONNX verificată, accesul la recognizer este serializat, iar succesiunea apelurilor native este fixată pe același thread prin runtime.LockOSThread().12 Aceasta este o alegere din implementarea proiectului, nu o cerință generală pe care o atribuim tuturor utilizărilor ONNX Runtime.
Pentru utilizator, rezultatul acestor componente este un flux simplu:
Microfon → detectarea și segmentarea vorbirii → ASR local → punctuație opțională pentru SpeD → formatare → text în aplicația activă.
Modelele și fișierele suplimentare trebuie pregătite înainte de folosirea offline. Instalarea și descărcarea lor sunt etape distincte de procesarea locală a înregistrării.
Pentru proba exclusiv românească, SpeD a oferit combinația cea mai convingătoare dintre timpul de transcriere și calitatea observată în comparația directă. Pentru înregistrarea mixtă, Large-v3-Turbo a păstrat mai bine fragmentele englezești, cu un cost de procesare mai mare în configurația folosită.
Am păstrat și limitele experimentelor. Două înregistrări și o comparație suplimentară nu acoperă accentele, microfoanele, zgomotul și vocabularul tuturor utilizatorilor. Următoarea evaluare utilă ar trebui să măsoare și timpul de la ultima silabă până la textul inserat, să includă o referință pentru calculul erorilor și să păstreze configurația completă pentru repetarea testului. Merită comparate și API-urile cloud pe aceleași înregistrări, pentru scenariile în care o soluție mixtă are sens.
O aplicație reală ne-a oferit un loc concret în care să facem aceste alegeri. Am putut urmări ce se întâmplă cu aceeași înregistrare, ce cuvinte se pierd și ce aduce fiecare etapă în plus. Din aceste observații a venit și decizia de a folosi punctuația specializată, păstrând corectarea liberă cu LLM în afara fluxului de dictare.
La DO IT MAGIC SOFTWARE testăm periodic soluții AI locale și mixte și construim aplicații și sisteme AI care pot rula pe infrastructura clientului. Pentru orice sistem de transcriere, evaluarea începe cu felul în care vorbesc oamenii care îl vor folosi. Câteva înregistrări reprezentative spun adesea mai mult despre alegerea modelului decât o listă lungă de funcționalități. Una dintre aplicațiile în care am pus în practică aceste rezultate este aplicația de dictare Speak2Me.
Articolul descrie experimentele din septembrie 2026 și implementarea din aplicația de test din aceeași perioadă. Timpii și observațiile despre transcrieri provin din documentația internă5; sursele externe explică modelele și tehnicile, fără să valideze măsurătorile noastre. Descrierea implementării a fost verificată în cod, fără o nouă rulare a benchmark-urilor.
Alec Radford et al. — Robust Speech Recognition via Large-Scale Weak Supervision. Lucrarea originală Whisper și datele de antrenare raportate de autori. ↩︎
whisper.cpp. Implementare locală a Whisper în C/C++. ↩︎
faster-whisper. Implementare Whisper bazată pe CTranslate2. ↩︎
NVIDIA — Parakeet TDT 0.6B v3. Fișa modelului și limbile suportate. ↩︎
DO IT MAGIC — Experimente locale ASR, audio și corectură. Notele interne din 18 septembrie 2026, cu rezultatele, limitele și cele două probe audio păstrate. Document intern, nepublicat. ↩︎ ↩︎ ↩︎
Gabriel Pîrlogeanu, Alexandru-Lucian Georgescu, Horia Cucu — Open Source State-Of-the-Art Solution for Romanian Speech Recognition. Arhitectura și evaluarea SpeD Romanian. ↩︎
Hainan Xu et al. — Efficient Sequence Transduction by Jointly Predicting Tokens and Durations. Lucrarea care introduce TDT. ↩︎
Silero VAD. Model pentru detectarea activității vocale. ↩︎
1-800-BAD-CODE — punctuation_fullstop_truecase_romance. Modelul de punctuație și capitalizare pentru șase limbi romanice. ↩︎
sherpa-onnx. Infrastructura de procesare vocală locală și API-urile disponibile. ↩︎
ONNX Runtime — Quantize ONNX models. Cuantizarea și limitele câștigurilor de performanță. ↩︎
Go — runtime.LockOSThread. Comportamentul fixării unei goroutine pe un thread al sistemului de operare. ↩︎
Da, cu un model și un motor de inferență care rulează local. Fișierele necesare trebuie descărcate înainte de utilizarea offline. În configurațiile testate, procesarea înregistrării se face pe calculator; descărcarea modelelor este o etapă separată.
Nu este obligatoriu. Configurațiile din acest articol au fost testate pe CPU. Timpul de răspuns depinde însă de model, procesor, cuantizare și lungimea fragmentului. O viteză acceptabilă pentru transcrierea unui fișier nu garantează o experiență bună la dictare.
Pe proba noastră mixtă, Whisper Large-v3-Turbo a păstrat cel mai bine expresiile englezești dintre configurațiile comparate. SpeD a fost convingător în comparația separată pe proză românească. Alegerea merită verificată pe înregistrări cu vocabularul și microfonul utilizatorilor tăi.