De ce aplicațiile de dictare îți mănâncă primul cuvânt

Apeși hotkey-ul, vorbești, primul cuvânt e tăiat. De ce pornirea la rece taie cuvinte și cum ajută un microfon deja pornit cu un pre-roll de 500 ms.

Teodor Deleanu10 iulie 20268 min de citit

Apeși hotkey-ul. Începi să vorbești. Te uiți cum transcrierea începe de la al doilea cuvânt — uneori de la al treilea. „Refactorizează logica de retry" iese ca „logica de retry". „Nu face merge la asta încă" iese ca „face merge la asta încă", care e o propoziție sincer periculoasă de tastat în numele tău. Eșecul ăsta e ușor de reprodus în pipeline-urile de microfon cu pornire la rece, de la funcțiile integrate în sistem până la instrumentele dedicate de dictare.

Lumea îl descrie în feluri diferite — „taie începutul", „trebuie să fac o pauză înainte să vorbesc", „primul cuvânt lipsește mereu" — dar e un singur fenomen și, odată mușcat, îți dezvolți soluția de avarie pe care și-o dezvoltă toată lumea: apeși tasta, aștepți o clipă, apoi vorbești. Ceea ce înseamnă că acum execuți un mic ritual superstițios de zeci de ori pe zi, ca să compensezi pentru instrumentul tău, iar instrumentul te-a dresat pe tine, nu invers.

Am făcut ritualul acela luni de zile, în alte instrumente. Construind Keebye, eliminarea lui a fost printre primele lucruri de pe listă, pentru că soluția a cerut până la urmă un compromis inconfortabil pe care majoritatea aplicațiilor nu-l vor face — și vreau să vorbesc despre compromis la fel de pe față ca despre soluție.

De ce e tăiat primul cuvânt?

Asta e o problemă la nivel de categorie, nu neglijența unui singur furnizor, iar fizica ei e simplă: microfoanele nu sunt instantanee.

Când o aplicație de dictare pornește o înregistrare în modul naiv — apeși hotkey-ul, apoi se deschide microfonul — trebuie să ruleze un lanț întreg înainte să fie captat primul eșantion din vorbirea ta. Sesiunea audio a sistemului de operare trebuie inițializată. Dispozitivul de input trebuie să se trezească, ceea ce pentru unele componente hardware înseamnă timp literal de încălzire. Formatul de stream se negociază, se alocă bufferele, iar primele buffere care sosesc sunt adesea gunoi care se aruncă. În funcție de mașină și de dispozitiv, lanțul acela durează undeva între „o clipă" și câteva secunde.

Între timp, tu — o ființă umană cu un gând deja format — începi să vorbești în clipa în care degetul tău atinge tasta. De obicei un firicel înainte de clipa aceea, de fapt: intenția de a apăsa și intenția de a vorbi îți părăsesc creierul împreună, iar debutul vorbirii bate în mod obișnuit pregătirea aplicației. Tot ce ai spus înainte ca streamul să pornească nu a existat niciodată, din punctul de vedere al aplicației. Modelul nu poate transcrie audio care nu a fost captat niciodată. De aici: „logica de retry".

De ce pornesc aplicațiile microfonul la cerere, în loc să-l țină pregătit? În principal din bun-simț. Ținerea unui microfon deschis costă puțină energie și — mult mai important — aprinde indicatorul de microfon al sistemului de operare, pe care utilizatorii îl citesc, pe bună dreptate, ca „aplicația asta mă ascultă". Deschiderea microfonului doar la cerere ține indicatorul cinstit și aplicația arătând politicos. Costul este riscul de pornire la rece la începutul unei înregistrări.

Soluția: un microfon care ascultă deja când apeși tasta

Keebye atacă asta de la ambele capete, iar cele două mecanisme merită separate, pentru că rezolvă două jumătăți diferite ale problemei.

Microfonul deja pornit. După prima ta înregistrare dintr-o sesiune, Keebye ține deschis streamul de input audio. Asta înseamnă că lanțul de pornire la rece — inițializarea sesiunii, trezirea dispozitivului, negocierea streamului — s-a întâmplat deja înaintea unei dictări ulterioare, cât timp streamul acela rămâne sănătos. Streamul e viu înainte să ți se miște degetul.

Pre-roll-ul. Un stream deja deschis repară întârzierea aplicației, dar nu și pe a ta — ține minte, debutul vorbirii tale poate bate apăsarea tastei. Așa că Keebye ține un buffer rulant de 500 de milisecunde din cel mai recent audio (8.000 de eșantioane la 16 kHz, într-un inel). Când apeși hotkey-ul, acea jumătate de secundă de audio dinainte este vărsată în fața rostirii. Audio-ul care a început înăuntrul acelui buffer e disponibil pentru transcriere, în loc să fie aruncat înainte de apăsarea tastei.

Rezultatul combinat: la dictările repetate, streamul deja deschis și pre-roll-ul de 500 ms acoperă cazul comun în care vorbirea începe chiar înainte de apăsarea tastei sau odată cu ea. Pauza rituală devine inutilă înăuntrul acelei granițe. Nu poate recupera un cuvânt rostit cu mai mult de o jumătate de secundă înainte de pornirea înregistrării, iar prima dictare dintr-o sesiune plătește în continuare latența normală de pornire a streamului.

Compromisul, spus pe față

Iată partea pe care refuz să o îngrop, pentru că e prețul sincer al designului: fiindcă streamul audio rămâne deschis între dictări, macOS arată microfonul ca fiind activ chiar și când nu dictezi. Punctul portocaliu e aprins. Dacă te uiți în Control Center, Keebye e listat ca folosind microfonul, chiar atunci, în timp ce tu nu faci nimic.

Ce se întâmplă de fapt în timpul acela: audio-ul curge în bufferul inelar de 500 ms și e aruncat continuu. Nu se transcrie nimic. Nu se stochează nimic. Nimic nu părăsește bufferul până când nu apeși tasta — iar tot ce e mai vechi de o jumătate de secundă a dispărut pentru totdeauna, suprascris de inel. Dar nu am de gând să mă prefac că indicatorul minte, pentru că nu minte: streamul e deschis, iar „capabil de ascultare permanentă" e o descriere corectă a arhitecturii, chiar dacă nimic nu ascultă în vreun sens semnificativ până când nu ceri tu.

Am făcut compromisul ăsta deliberat, cu ochii deschiși, și iată raționamentul. Deschiderea microfonului la cerere introduce de fiecare dată risc de pornire la rece: cuvinte tăiate, propoziții greșite, pauza dresată. Designul cu stream deja deschis are un cost care cade pe cât de confortabil îți e cu un punct portocaliu, susținut de o arhitectură pe care o poți raționa: istoric local doar text (despre care am scris în dictarea ta nu ar trebui să dispară pur și simplu), transcriere on-device, niciun audio stocat vreodată, o jumătate de secundă de memorie inelară. Eu accept punctul. Dacă tu nu — e o poziție legitimă și chiar ar putea face din alt instrument alegerea potrivită pentru tine; paginile noastre Keebye vs Superwhisper și Keebye vs Wispr Flow sunt scrise ca să ajute exact la decizia asta.

Două granițe, ca să nu fie nimeni surprins

Prima dictare dintr-o sesiune are în continuare latența normală de pornire a streamului. Microfonul e cald pentru că s-a întâmplat deja o înregistrare; prima tot plătește costul de configurare. Dictările ulterioare beneficiază, cât timp streamul rămâne deschis.

Pre-roll-ul e de 500 de milisecunde, iar 500 de milisecunde sunt o clipă, nu o propoziție. Bufferul acoperă cazul natural — un cuvânt început cu puțin înainte de apăsarea tastei. Dacă rostești o propoziție întreagă și apoi îți amintești să apeși tasta, cuvintele dinainte s-au dus, prin design: inelul ține doar vreodată o jumătate de secundă, tocmai ca aplicația să nu rețină audio semnificativ cât timp stă degeaba. Un pre-roll mai lung ar prinde mai multe dintre pornirile tale distrate și ar ține mai mult din audio-ul tău ambiental în memorie. Jumătatea de secundă e locul unde am trasat linia aceea.

De ce contează o jumătate de secundă mai mult decât pare

Un prim cuvânt tăiat arată ca un bug mic. În fluxul de lucru cu lane-uri paralele pentru care a fost construit Keebye — vocea drept canal de control pentru mai mulți agenți AI și mai multe conversații umane deodată, ziua de lucru descrisă în Doi copii, trei startup-uri, o singură voce — dictarea se întâmplă de zeci de ori pe zi, în rafale, la mijlocul unui context switch. Un instrument care cere o pauză rituală taxează fiecare rafală și, mai rău, îți inversează ocazional sensul și îl trimite. „Face merge la asta încă" a fost amuzant exact o dată.

Fiabilitatea în categoria asta nu e o singură funcție mare. E acumularea unor măsuri de siguranță mai mici: pre-roll pentru audio-ul de la început, istoric în spatele transcrierii și o cale de inserare recuperabilă. Articolul ăsta e despre prima dintre ele; articolul despre istoric o acoperă pe a doua.

Keebye este în acces anticipat pentru macOS. Începe proba gratuită mai jos, spune „Nu face merge la asta încă" la o dictare repetată și verifică dacă primul cuvânt supraviețuiește. Ăsta e tot testul.

Începe să vorbești fără pauza rituală

Începe proba gratuită și testează o dictare repetată care începe cu un cuvânt pe care nu ți-l permiți să-l pierzi.

Start free trial

Early 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