Ingegneria

Architettura del voice typing: dentro lo stack a tre modelli di Loqua

Perche separiamo speech recognition, intelligenza linguistica e contesto dello schermo, e come ragioniamo con onesta sui numeri interni.

TL;DR

Questo è uno sguardo blog-level all'architettura di voice typing di Loqua, e al motivo per cui la giusta architettura voice ai per la dettatura non è un unico grande modello ASR. Loqua e costruito come tre layer cooperanti: speech recognition, intelligenza linguistica e contesto multimodale. Il motivo e semplice: la qualità della dettatura non è solo word error rate. Uno stack di modelli di dettatura utile deve sentire le parole, capire i nomi tecnici e modellare l'output per l'app di destinazione. I nostri target interni sono reattivita nell'ordine dei 200 ms, alto riconoscimento del vocabolario tecnico e WER a una cifra bassa nelle condizioni supportate; finche non pubblicheremo una pagina benchmark, considerateli misure interne e non claim di terze parti.

Sono Shuran. Guido un piccolo team di ricercatori algoritmici che usa il voice typing ogni giorno. Abbiamo costruito Loqua perché gli strumenti di dettatura che avevamo valutato, quasi tutti ben progettati e davvero utili, arrivavano allo stesso limite quando li spingevamo su codice, mix multilingue e formattazione consapevole dell'app. Il limite è strutturale, non un problema di tuning. Questa è l'architettura a cui siamo arrivati dopo aver deciso che la struttura doveva cambiare.

Questo non è un paper. E una spiegazione blog-level: l'intuizione dietro ogni layer, i numeri emersi e per cosa usiamo davvero lo stack. Se vuoi il contesto accademico più profondo, la sezione di letture consigliate in fondo rimanda ai paper da cui abbiamo tratto spunti.

La trappola del wrapper Whisper

Whisper di OpenAI ha cambiato ciò che e possibile nel riconoscimento vocale inglese. E un modello notevole. Il paper di Whisper ha mostrato che scalare training audio weakly-supervised produce ASR generale robusto, tra accenti, condizioni e 99 lingue, senza fine-tuning per dominio. E una vittoria strutturale per il campo.

Ma Whisper e un modello ASR, non un prodotto di dettatura. Il divario tra trascrive il parlato accuratamente e produce testo che posso incollare in un'email senza editarlo e grande. L'approccio wrap-Whisper, prendere l'output di Whisper e passarlo in un layer di formattazione, chiude una parte del divario. Fallisce in tre punti che per noi contavano:

  • Vocabolario tecnico. Whisper sente react query e scrive react query. Non sa che nel tuo codebase quello è @tanstack/react-query e che l'import del package era ciò che volevi. La NER sul vocabolario tecnico richiede un modello che veda il contesto circostante, non un modello che senta fonemi.
  • Formattazione consapevole dell'app. Whisper trascrive; non sa se sei in Slack o in un file Python. Avvitare sopra un formatter richiede una euristica, fragile, oppure una chiamata LLM pesante per ogni utterance, lenta e dipendente dal cloud.
  • Streaming con budget di latenza stretti. Whisper e eccellente per la trascrizione batch. Whisper in streaming, a bassa latenza e on-device richiede compromessi (modello più piccolo, accuratezza più bassa) o ingegneria aggressiva che combatte la struttura del modello.

Abbiamo provato la strada wrap-Whisper per un prototipo di ricerca. Era sufficiente per testare idee. Non era sufficiente per diventare il nostro strumento quotidiano.

L'intuizione dei tre modelli: un diverso tipo di stack speech recognition

L'intuizione e che il voice typing contiene tre lavori, e lo stesso modello e cattivo nel farli tutti. I tre lavori:

  1. Sentire le parole. Da acustica a token. E ciò in cui l'ASR e forte.
  2. Capire l'intento. Ripulire riempitivi, false partenze e correzioni a metà frase. Riconoscere entita tecniche. Decidere cosa l'utente intendeva davvero digitare.
  3. Collocarlo correttamente. Formattare l'output per l'app di destinazione. Far uscire lo stesso intento come codice in VS Code, come messaggio Slack in Slack, come prompt strutturato in Cursor.

Un singolo modello end-to-end che prova a fare tutte e tre le cose ha un problema strutturale difficile: la loss surface per trascrivere fonemi e quella per formattare per Slack puntano in direzioni diverse. Il training congiunto compromette entrambe. Lo confermiamo con le nostre ablation: abbiamo provato a unificare i layer 2 e 3 in un transformer addestrato su dati multi-task, e l'accuratezza e calata su entrambi.

Dividerlo in tre permette a ogni modello di fare bene un lavoro. Il costo e una piccola latenza per il passaggio tra layer, che recuperiamo facendo girare tutto su Neural Engine in una singola pipeline. Questo è il cuore dell'architettura di voice typing di Loqua: non un trascrittore monolitico, ma un piccolo stack di modelli di dettatura in cui ogni layer e addestrato per la sua parte del problema.

Layer 1: speech recognition

Input acustico → sequenza di token. Questo è un recognizer vocale specifico per il task, non un wrapper diretto di Whisper. Le scelte architetturali sono state guidate da tre vincoli su cui non volevamo compromessi:

  • Streaming-first. L'output inizia prima che chi parla finisca l'utterance. Questo esclude come default l'attenzione non causale sull'intera sequenza audio: usiamo una variante adatta allo streaming.
  • Compatibilita con Neural Engine on-device. Dimensione del modello e scelta degli operatori sono vincolate da ciò che gira in modo efficiente su Core ML di Apple tramite Neural Engine. E un vincolo reale: operatori che sembrano perfetti in un paper possono uscire dal percorso Neural Engine e finire CPU-bound.
  • Robustezza a bassa ampiezza. I nostri dati di training includono intenzionalmente input a volume da sussurro, persone che dettano piano nei caffe o di notte. La maggior parte dei dati ASR generali e a volume normale; il volume da sussurro richiede copertura esplicita.

L'output di questo layer e una sequenza di token con timing e confidence score. Non e il testo finale: e il riconoscimento grezzo che il layer successivo ripulisce.

Layer 2: intelligenza linguistica

Sequenza di token → testo pulito e risolto per intento. Qui facciamo il maggiore investimento di ricerca, perché qui vive gran parte della qualità visibile all'utente.

Il compito di questo layer: prendere ciò che il modello vocale ha sentito e produrre ciò che l'utente intendeva. Tre cose avvengono in parallelo:

  • Rimozione di riempitivi e false partenze. Um, quindi, in pratica, dovremmo — anzi aspetta, ricomincio — dovremmo mettere questo in cache diventa Dovremmo mettere questo in cache. La correzione a metà frase viene rispettata; il rumore introduttivo sparisce.
  • NER per vocabolario tecnico. Il layer impara nomi di librerie comuni, framework, famiglie di modelli, estensioni file, comandi terminale e superfici API idiomatiche. React query diventa @tanstack/react-query quando il contesto circostante e un file JavaScript. Il nostro target interno e riconoscimento high-90s su vocabolario tecnico in-domain curato, così gli identificatori escono corretti senza imporre un dizionario personale per ogni termine comune.
  • Modellazione strutturale. Che l'output sia una frase, una lista puntata, una tabella markdown o un commento al codice viene deciso qui in base a ciò che il layer successivo, il contesto multimodale, dice sulla destinazione.

Questo è il modello più piccolo dello stack per numero di parametri, ma quello con l'impatto più alto sulla user experience. Abbiamo speso più ore-team qui che sugli altri due layer messi insieme.

Layer 3: contesto multimodale

Stato app + schermo + cursore → direttiva di formato. Questo è il layer omni-modale, ed e il motivo per cui non chiamiamo Loqua semplicemente un'app di dettatura. Il lavoro di Loqua non è trascrivere; e scrivere ciò che intendevi, dove lo intendevi.

Il layer di contesto legge l'app attiva via macOS Accessibility, il testo selezionato se presente, il testo visibile adiacente e gli indizi strutturali della destinazione (Gmail compose vs thread Slack vs file Python in VS Code vs pannello chat di Cursor). Produce una direttiva di formato che il layer linguistico usa per modellare il testo finale.

L'intuizione più profonda, cioe perché le architetture omni-modali cambiano il voice typing invece di limitarsi a migliorarlo, merita un pezzo a parte. Vedi voice meets vision: come i modelli omni-modali sbloccano la dettatura consapevole del contesto se vuoi seguire quel filo.

I numeri che monitoriamo

MetricaTarget interno attualePerche conta
Latenza end-to-endClasse 200 ms su Apple SiliconSotto il punto in cui la dettatura inizia a sembrare attesa
Time-to-first-token (TTFT)Sub-200 ms nei casi di streaming comuniLe prime parole appaiono mentre le utterance più lunghe sono ancora in corso
Accuratezza NERHigh 90s su vocabolario tecnico in-domain curatoIdentificatori, librerie e nomi di modelli devono uscire giusti
WER multilingueSingole cifre basse nelle condizioni di test supportateInglese / cinese misti e inglese accentato devono funzionare nei workflow reali

Questi sono numeri di benchmark interno e dogfooding, non una suite benchmark di terze parti. I test set includono il nostro vocabolario tecnico, esempi di code-switching, campioni di inglese accentato e ambienti quotidiani rumorosi. Il prossimo passo sul contenuto dovrebbe essere una pagina pubblica di metodologia, così questi numeri potranno essere citati senza vaghezze.

Come lo usiamo noi

La cosa più importante che posso dire su questo stack e che l'abbiamo scritto perché lo usiamo. Ogni membro del team detta ogni giorno: commit, PR, Slack interno, scrittura tecnica più lunga e, nel mio caso, gran parte della prosa per post di blog come questo. Le decisioni che hanno modellato l'architettura vengono dall'uso reale, non da una product spec.

Tre punti in cui la distinzione architettura-vs-feature si vede nell'uso quotidiano:

  • Dettatura di codice. La qualità NER fa la differenza tra voce come interfaccia possibile per il codice e voce come giocattolo. Vedi la guida alla dettatura di codice per ciò che abilita.
  • Code-switching multilingue. Meta del nostro Slack interno mescola mandarino e inglese. Il layer linguistico e addestrato su dati code-switched, non aggirandoli; i cambi a metà frase funzionano senza toggle di modalità.
  • Formattazione consapevole dell'app. La stessa frase vocale che diventa un commento di codice in VS Code e una descrizione PR strutturata su GitHub e la differenza tra voice typing e prodotto utile.

Siamo un team piccolo. La versione onesta di questa storia e che non abbiamo le risorse per mantenere un prodotto wrapped-Whisper E uno stack di ricerca a tre modelli. Abbiamo scommesso sulla strada strutturale perché avevamo bisogno di quella qualità per noi, e preferiamo spedire qualcosa di più stretto ma di qualità che qualcosa di più ampio senza qualità.

Come ogni layer e stato ricostruito nel 2026

Layer 1 — speech recognition. Il recognizer e stato stretto intorno a streaming, parlato a bassa ampiezza e vocabolario tecnico; la spiegazione più profonda e in inside our omni-modal voice stack e i dettagli di post-training sono in RL in our voice stack.

Layer 2 — intelligenza linguistica. Il layer linguistico ora tratta pulizia, preservazione delle entita e struttura consapevole dell'app come un unico stack di modelli di dettatura invece che come post-processor separati. E qui che il reinforcement learning aiuta di più: scegliere l'output che gli utenti editano meno.

Layer 3 — contesto multimodale. Il layer di contesto e stato ricostruito intorno a evidenza locale dello schermo: app attiva, testo selezionato, identificatori visibili e dintorni del cursore. Vedi building a listener that sees what you see per l'architettura.

La prossima frontiera e l'audio non verbale: AED e audio captioning come contesto opzionale, local-first. Copriamo quel lavoro in fase prototipo in sounds with meaning.

Letture consigliate

Se vuoi andare più a fondo di questo trattamento blog-level:

Se hai domande sull'architettura o vuoi scavare più a fondo in uno di questi layer, scrivici. Siamo un team piccolo e leggiamo ogni email.

Domande frequenti

Perche tre modelli invece di un unico grande LLM?
Un singolo modello end-to-end ha un problema strutturale: la loss surface per "trascrivere correttamente i fonemi" punta in una direzione diversa rispetto alla loss surface per "formattare l'output per Slack". Abbiamo provato a unificare i layer 2 e 3 in un transformer addestrato su dati multi-task, e l'accuratezza e calata su entrambi. Tre modelli specializzati, ciascuno bravo in un lavoro, battono un modello che prova a farli tutti e tre.
Perche non limitarsi a wrappare Whisper?
Whisper e un ottimo modello ASR, ma non è un prodotto di dettatura. L'approccio wrap-Whisper resta corto su vocabolario tecnico (niente NER in-context), formattazione consapevole dell'app (richiede un post-processor pesante) e streaming on-device (Whisper e ottimizzato per batch). A noi servivano tutti e tre per l'uso quotidiano.
Avete addestrato modelli da zero?
Si, per i layer di speech recognition e intelligenza linguistica. Il layer di contesto multimodale si basa su pattern di ricerca omni-modale (vedi il post omni-modale per la linea evolutiva), con i nostri dati di training e fine-tuning specifico per la dettatura.
Quanto e grande ogni modello?
Non pubblichiamo i conteggi esatti dei parametri: sono tarati per rientrare nel budget del Neural Engine e raggiungere i target di latenza e accuratezza. Tutti e tre i layer insieme girano nella porzione on-device dello stack. Il cloud e riservato a casi specifici (riscritture più lunghe, alcune traduzioni) ed e attivabile dall'utente.
Come valutate l'accuratezza?
Con suite benchmark interne per ogni layer più dogfooding quotidiano del team. Lo speech recognition e misurato con protocolli stile WER nelle condizioni supportate. La NER e misurata su vocabolario tecnico curato. Dovremmo pubblicare una metodologia prima di trattare qualunque numero come claim benchmark esterno.
Renderete open source qualcosa di tutto questo?
Al momento non è previsto per lo stack di produzione: il team e piccolo e mantenere una release pubblica pulita accanto al prodotto ci rallenterebbe. Pubblichiamo note come questa quando c'e qualcosa che vale la pena dire. Se vuoi collaborare sulla ricerca, mandaci un'email.

Prova Loqua oggi

Gratis per iniziare. Nativa per Mac. Costruita da ricercatori di algoritmi che la usano ogni giorno.

Scarica per Mac

Altro dal blog di Loqua

Engineering
Digitazione vocale omni-modale: comprensione multimodale, MoE e output testuale in streaming
Engineering
Reinforcement learning per digitazione vocale: GRPO, DPO e distillazione on-policy nel nostro stack voce
Engineering
Riconoscimento vocale multimodale: costruire un ascoltatore che vede ciò che vedi
Produttività
Voice productivity stack: 9 strumenti che usiamo davvero per scrivere, spedire e pensare
Guida
Note riunione vocali su Mac: dalla voce al lavoro fatto, con note e action item