Detecția automată tot ghicește greșit: fixează-ți limba
Dictarea îți iese mereu în limba greșită? Detecția automată oscilează pe vorbirea bilingvă prin design. Fixează-ți limba o dată și rămâne fixată.
Dacă dictezi în mai mult de o limbă, ai văzut eșecul. Spui o propoziție în română, iar transcrierea se întoarce ca engleză mutilată fonetic — cuvinte reale, niciunul dintre ele al tău. Sau se răstoarnă la mijlocul propoziției: prima jumătate în limba corectă, a doua în ceva la care modelul a decis că ai comutat. Sau, favorita mea personală, supa cu alfabete amestecate — caractere latine, cu câteva chirilice presărate, de parcă modelul și-ar fi împărțit pariurile literă cu literă.
Asta nu e o plângere despre un singur produs. E un mod de eșec previzibil al detecției automate de limbă, inclusiv al implicitului calibrat pentru engleză al lui Keebye. Îi lovește pe vorbitorii cu engleză accentuată și pe oricine comută între limbi în timpul zilei. Un dezvoltator bilingv al cărui Slack e în poloneză și ale cărui mesaje de commit sunt în engleză îi dă detecției automate exact semnalele amestecate cu care se descurcă cel mai prost.
A doua jumătate a plângerii e mai discretă, dar la fel de reală: când o setare de limbă chiar există, e adesea îngropată. La trei meniuri adâncime, în spatele unui selector de motor, dincolo de un comutator al cărui nume nici nu pomenește de limbă. Dacă schimbi limba de douăzeci de ori pe zi, o setare îngropată e, practic, nicio setare.
Vreau să explic de ce apare oscilația — folosind povestea de război a propriului meu produs, pentru că Keebye a avut problema asta înainte să aibă soluția — și apoi să arăt cum arată o soluție reală.
De ce oscilează detecția automată (și de ce nu e chiar un bug)
Iată mecanica sinceră. Modelele moderne de vorbire fac identificare de limbă în tăcere, ca parte a decodării. Modelul ascultă, își formează o presupunere internă despre ce limbă aude și decodează pe baza acelei presupuneri. Când audio-ul e curat, neaccentuat și monolingv, funcționează atât de bine încât nu te gândești niciodată la asta.
Acum hrănește-l cu vorbire reală. Un accent deplasează vocalele spre fonemele altei limbi. O propoziție conține trei împrumuturi din engleză — orice conversație tehnică conține. E un copil pe fundal sau ești pe microfonul laptopului. Fiecare dintre astea face presupunerea internă de limbă a modelului mai puțin sigură, iar o presupunere cu încredere scăzută se poate răsturna de la un cadru la altul. Când se răstoarnă, se răstoarnă și decodarea cu ea, iar tu primești o transcriere care schimbă limba la mijlocul gândului.
Partea crucială: în majoritatea instrumentelor nu există nimic care să ancoreze presupunerea aceea. Modelul decide, în tăcere, per rostire, iar tu nu ai niciun mod de a-l suprascrie. Ăsta nu e un bug într-o anumită aplicație — asta este detecția automată tăcută. Un model care ia o decizie de judecată pe care nu o poți corecta.
Știu asta îndeaproape, pentru că motorul implicit al lui Keebye are exact proprietatea asta. Parakeet, implicitul nostru calibrat pentru engleză, ignoră orice indiciu de limbă la nivelul de decodare — nu-i poți spune ce urmează să vorbești. Pe engleză clară e excelent, motiv pentru care e implicit. Pe audio neclar poate oscila între limbi ca orice altceva din categorie. Îți spun asta întâi despre propriul meu produs, pentru că soluția are sens abia după ce accepți că problema stă în arhitectură, nu în neglijența vreunui concurent.
Ce face de fapt fixarea unei limbi?
Soluția e să nu-i mai ceri modelului să ghicească. Keebye vine cu un al doilea motor on-device — Canary 1B v2 de la NVIDIA, cuantizat la int8 — care acoperă exact 25 de limbi: bulgară, croată, cehă, daneză, olandeză, engleză, estonă, finlandeză, franceză, germană, greacă, maghiară, italiană, letonă, lituaniană, malteză, poloneză, portugheză, română, slovacă, slovenă, spaniolă, suedeză, rusă și ucraineană. Spre deosebire de motorul implicit, Canary acceptă o instrucțiune de limbă și o respectă.
Keebye expune asta ca o fixare: o setare explicită de limbă, transmisă motorului Canary la fiecare rostire. Fixează româna, iar decodorul folosește româna în loc să facă o alegere automată de limbă. Recunoașterea poate fi în continuare greșită, mai ales în jurul împrumuturilor și pe audio zgomotos, dar alegerea limbii nu mai e o presupunere neverificată.
Setarea e citită live, la fiecare dictare. Schimb-o și următoarea dictare cu ținut apăsat folosește limba nouă, fără repornirea aplicației. Contează mai mult decât pare: un control de limbă e mult mai util când schimbarea lui nu întrerupe munca.
Și pentru că Canary rulează on-device ca tot ce ține de Keebye, fixarea nu te costă povestea confidențialității. Modelul are în jur de 1.3 GB, descărcat o singură dată; după aceea, româna ta, poloneza ta, ucraineana ta nu părăsesc niciodată mașina. (De ce credem că dictarea multilingvă locală contează în general e un articol separat — dictarea pentru dezvoltatori nu ar trebui să fie doar în engleză. Ăsta e continuarea lui practică: acela pledează pentru limbi, ăsta e despre cum le faci de fapt utilizabile.)
Două clicuri, nu trei meniuri adâncime
O fixare la care nu ajungi e o fixare pe care nu o folosești, așa că schimbarea stă în tray. Iconița din bara de meniu a lui Keebye are un meniu „Dictation Language", cu o listă scurtă, curatoriată, de 11 limbi — engleză, română, franceză, germană, spaniolă, italiană, portugheză, olandeză, poloneză, rusă, ucraineană. Două clicuri din orice aplicație: clic pe tray, clic pe limbă. Nu deschizi Setări, nu părăsești fereastra în care lucrai.
Lista completă de 25 de limbi stă în Setări, pentru limbile din afara listei scurte. Dar lista scurtă acoperă realitatea zilnică a majorității muncii bilingve: scrii echipei tale într-o limbă și unui client sau unui agent AI în alta și ai nevoie ca răsturnarea să nu coste nimic.
Mai e o opțiune care merită știută, pentru că schimbă complet felul în care unii folosesc fixarea: un comutator de traducere în engleză. Vorbești în limba ta, iar engleza ajunge la cursor — același motor, aceeași execuție on-device. Dacă monologul tău interior curge în română, dar outputul tău trebuie să fie în engleză (mesaje de commit, prompturi către un agent de programare, răspunsuri către o echipă internațională), asta comprimă pasul de traducere pe care îl făceai în cap. Îl folosesc mai mult decât mă așteptam.
Cât te costă fixarea
25 de limbi înseamnă 25 de limbi. Instrumentele de dictare în cloud listează mult mai multe, pentru că trimiterea audio-ului către un model mare de pe server e calea ieftină de a adăuga limbi. Ăsta e compromisul real al lui on-device: un model care încape pe Mac-ul tău acoperă mai puțin din lume decât un model care umple un centru de date. Dacă limba ta nu e pe lista celor 25, motorul multilingv al lui Keebye nu te acoperă azi, iar eu prefer să spun asta decât să rotunjesc în sus.
O fixare înseamnă o fixare. Asta e cealaltă față a determinismului și vreau să fiu clar în privința ei: dacă fixezi româna și apoi vorbești engleză, Keebye îți va decoda fidel-greșit engleza ca română, până când comuți. Motorul face exact ce i-ai spus. Tot farmecul detecției automate era că nu trebuia niciodată să te gândești la asta — fixarea schimbă comoditatea aceea pe predictibilitate. Din experiența mea, schimbul merită, pentru că o presupunere greșită pe care nu o poți controla e mai rea decât o setare greșită pe care o poți repara în două clicuri. Dar e un schimb, nu un prânz gratuit.
Lista scurtă din tray are 11 limbi, nu 25. Dacă perechea ta zilnică include, să zicem, finlandeza sau greaca, treci prin Setări pentru una dintre laturi. Curatoriere înseamnă că limba cuiva nu a intrat în meniul rapid.
Unde rămâne plângerea
Plângerea la nivel de categorie — „dictarea îmi iese mereu în limba greșită" — e de fapt o plângere despre decizii tăcute. Modelul a ghicit, ghicitul a fost greșit și nu exista niciun mod de a-i spune altfel. Orice soluție care păstrează ghicitul (detecție mai bună, ferestre de audio mai lungi, praguri de încredere) doar face eșecul mai rar și mai bizar. Soluția care chiar încheie plângerea e să-i dai utilizatorului decizia înapoi.
Dacă trăiești asta acum cu alt instrument, paginile noastre de comparație sunt sincere despre unde se potrivește fiecare — Keebye vs Superwhisper și Keebye vs Wispr Flow acoperă amândouă și întrebarea despre limbă. Ca să încerci fixarea în sine, începe proba gratuită mai jos, reia propoziția în română sau în poloneză de la începutul articolului și vezi cât din oscilație venea dintr-o presupunere neverificată, nu din accentul tău.
Fixează limba pe care chiar o folosești
Începe proba gratuită și reia un răspuns în limba maternă pe care detecția automată l-a mutilat înainte.
Start free trialEarly access: we'll email you the moment the macOS build is ready — your 14 days start when you first sign in from the app.
Citește mai departe
Dictează review-urile de cod în limba ta
Codul e în engleză. Comentariile tale de review nu. Cum dictezi feedback de review în una din 25 de limbi on-device și de ce contează fixarea limbii.
Dictarea prompturilor către agenți paraleli, lane cu lane
Rularea a doi sau trei agenți de programare simultan face din prompt gâtuirea. Un flux vocal pentru a hrăni lane-uri paralele fără să pleci din cel curent.
Claude Code cu vocea: lucru pe lane-uri paralele
Agenții AI au făcut din tastare un blocaj. Un flux practic pentru dictarea de prompturi, review-uri și schimbări de direcție pe lane-uri paralele în macOS.