Ingegneria

Digitazione vocale omni-modale: comprensione multimodale, MoE e output testuale in streaming

Un walkthrough tecnico di come Loqua combina ascolto, comprensione multimodale del task e rendering del testo senza far sembrare lenta la voce.

TL;DR

La digitazione vocale omni-modale non è un unico enorme modello audio. Loqua è uno strumento di digitazione vocale nativo per Mac che separa riconoscimento vocale, pianificazione multimodale dell'istruzione e rendering del testo in una pipeline di output testuale in streaming. Questa separazione ci dà spazio per un MoE sull'encoder audio, contesto locale dello schermo e interazioni nell'ordine dei 200 ms, senza implicare che il prodotto sia un wrapper intorno a un modello di terze parti.

Sono Shuran, founder di Loqua.ai. Questa è la nota ingegneristica più profonda dietro il nostro stack di digitazione vocale omni-modale: perché separiamo il riconoscimento acustico dalla comprensione multimodale del task e dal rendering del testo, dove gli esperti condizionali hanno aiutato, dove non hanno aiutato e perché lo streaming ha dettato quasi ogni scelta architetturale.

Perché gli audio LM monolitici colpiscono un muro su Mac

Un modello linguistico audio monolitico è attraente sulla carta: gli dai audio, frame dello schermo e testo, e gli chiedi di emettere la dettatura finale. Nell'uso quotidiano su Mac, questo design colpisce tre muri insieme. Primo, il budget di latenza è brutale. Se il primo token utile arriva dopo che chi parla ha fatto una pausa, la digitazione vocale sembra trascrizione batch invece che digitazione.

Questo è il budget a cui ci vincoliamo. Dal microfono al primo carattere visibile abbiamo circa 200 millisecondi. Di questi, circa 40 ms sono overhead di piattaforma (buffering Core Audio, consegna inter-processo e rendering finale), 60 ms sono estrazione di feature acustiche e inferenza front-end, 70 ms sono decoding dell'instruction planner per il primo parziale e 30 ms restano al text renderer per emettere un commit iniziale sicuro. Un singolo audio LM da oltre 1B parametri che esegue ogni passaggio dentro quella finestra è plausibile su una macchina da benchmark, ma inaffidabile su un laptop reale con browser, IDE e Zoom già aperti.

Secondo, il lavoro visibile all'utente non è solo automatic speech recognition. Lo stesso enunciato deve diventare un paragrafo Slack, un oggetto di Git commit, un prompt Cursor o un commento Python. Un modello monolitico può essere addestrato a fare tutto questo, ma deve reimparare le convenzioni di formato per ogni app e riscoprirle ogni volta che il cursore si sposta. Terzo, il modello deve restare dentro l'inviluppo termico e di memoria di un laptop. Caricare in VRAM un modello audio-visione-testo da 7B accanto all'indice di un IDE è una ricetta per thermal throttling e ventole rumorose. Lavori pubblici come Whisper e report recenti su omni-model hanno aiutato il campo a capire audio robusto e modellazione multimodale, ma spedire un prodotto locale costringe a scelte più strette e più opinabili.

La nostra conclusione è stata semplice: la digitazione vocale omni-modale dovrebbe essere una pipeline, non un blocco unico all-purpose. La pipeline permette a ogni livello di mantenere un obiettivo piccolo, una modalità di errore misurabile e un costo runtime delimitato.

La pipeline di istruzioni multimodale

Loqua non ha un livello di risposta vocale o TTS in questo percorso di prodotto. L'instruction planner consuma feature audio in streaming, contesto dello schermo selezionato, metadati dell'app attiva, testo recente intorno al cursore e prompt di istruzione attivo. Produce un piano compatto di output testuale: intento, entità, modalità di modifica, formato di destinazione e incertezza.

Il text renderer converte quel piano in testo. Non genera audio, risposte parlate o output TTS. Decide se il piano diventa una checklist Markdown, una frase, un commento di codice o un'istruzione strutturata. Questa separazione tiene il ragionamento cross-modale costoso fuori dal percorso caldo quando l'utente sta semplicemente dettando prosa.

Cosa ogni livello non deve fare

La disciplina sta in ciò che abbiamo rimosso. Il front end acustico non prova a essere intelligente sul formato di destinazione; espone token audio con timing e confidenza. L'instruction planner non scrive la prosa finale; crea un piano strutturato abbastanza piccolo da revisionare a basso costo. Il text renderer non rilegge l'audio e non sintetizza voce; si fida del piano, del contesto di destinazione e del prompt di istruzione. Lasciare che un livello attraversasse questi confini è stata la causa più comune delle regressioni di latenza nei primi prototipi, perché i loop di feedback tra livelli trasformano lo streaming in batch processing senza che nessuno se ne accorga finché non legge la trace.

LivelloInput primarioOutputErrore che monitoriamo
Front end acusticoFrame microfonici in streamingToken audio con timingVoce bassa e mancate in stanza rumorosa
Instruction plannerToken audio + contesto schermo + prompt di istruzioneIntento e piano di output testualeAssunzione sbagliata sulla destinazione
Text rendererPiano + vincoli dell'appSolo testo finaleOver-formatting o correzione tardiva

Il beneficio è la debuggabilità. Quando l'output è sbagliato, possiamo capire se il recognizer ha sentito la parola sbagliata, se l'instruction planner ha scelto l'intento sbagliato o se il text renderer ha scritto nel registro sbagliato. È molto più facile che interpretare una lunga traiettoria nascosta. Nella nostra triage interna, circa due terzi dei fix di qualità post-lancio si sono isolati pulitamente a un singolo livello; il resto ha richiesto modifiche cross-layer, ma solo dopo una diagnosi chiara.

MoE sull'encoder audio

L'encoder audio è dove il calcolo condizionale ha dato risultati. Non ogni enunciato richiede lo stesso trattamento acustico. Parlato piano, inglese con accento, inglese e cinese mescolati, identificatori di codice e rumore di fondo da sala riunioni stressano parti diverse del modello. Un piccolo router mixture-of-experts consente all'encoder di spendere più capacità sulle regioni difficili senza rendere costoso ogni frame.

Abbiamo mantenuto il routing conservativo. Il router è condizionato su statistiche acustiche e indizi lessicali superficiali, non su profili personali dell'utente. Gli esperti si specializzano in pattern come parlato a bassa ampiezza, dettatura tecnica veloce e code-switching. Abbiamo rifiutato un pool di esperti più grande perché l'instabilità del routing peggiorava lo streaming: un modello accurato che cambia stile a metà enunciato non è utilizzabile per digitare.

Cosa abbiamo provato e abbandonato

Due idee sembravano attraenti in ricerca e hanno fallito nel prodotto. Primo, adattamento degli esperti per utente: addestrare un piccolo adapter per ogni utente pesante. Migliorava l'accuratezza cold-start di alcuni punti sul nostro test set interno, ma raddoppiava il footprint di memoria al cold launch e rendeva più confusi i confini di privacy. Secondo, un router che usava l'identificatore dell'app attiva come segnale forte. Si sovradattava a poche app comuni e degradava silenziosamente in quelle nuove. Lo abbiamo sostituito con il router acustico-lessicale attuale e spostato il comportamento app-aware più in alto, nell'instruction planner e nel text renderer, dove appartiene.

In pratica, il MoE sull'encoder audio aiuta Loqua a mantenere veloce il percorso comune rendendo meno fragile la coda. Questo è il valore di prodotto: non un trucco da benchmark, ma meno momenti in cui un nome di libreria, una frase detta piano o un frammento bilingue spezzano il flusso.

Streaming: token per token o frase per frase

Lo streaming è stato il tradeoff più difficile. L'output token per token sembra reattivo, ma può esporre ipotesi premature. L'output frase per frase è più pulito, ma sembra tardivo. Usiamo un ibrido: parziali precoci per span a basso rischio, commit ritardati per entità e modifiche che richiedono il contesto dello schermo.

Per esempio, quando dici "change the fetch profile function to return early if the auth client is missing", il sistema può streammare rapidamente le parole ordinarie. Ma i token intorno a fetchProfile e authClient aspettano che il livello di contesto confermi gli identificatori visibili. Ecco perché il rendering del testo è separato dal riconoscimento: può revisionare un piccolo span prima di confermare il testo, senza riavviare l'intero enunciato.

L'input bilingue a metà frase è un caso collegato. Quando dici "把这个 retry 函数改成指数退避," l'instruction planner produce un piano di output testuale che intreccia span cinesi con un token di codice inglese. Il text renderer emette i caratteri cinesi appena superano una soglia interna di confidenza e aspetta qualche millisecondo in più sull'identificatore inglese per confermarlo contro il buffer visibile dell'IDE. L'utente vede prima il flusso cinese, poi l'identificatore, poi il resto. Riordinare l'output sarebbe stato più veloce, ma sembrava sbagliato: l'occhio si aspetta digitazione da sinistra a destra.

I confini di commit sono l'altra manopola. Un confine di commit è il momento in cui il text renderer promette di non revisionare più. Li fissiamo su pause naturali, terminatori di frase e transizioni strutturali come paragrafo, elemento di lista o blocco di codice. Dentro un confine di commit il text renderer è libero di revisionare; una volta confermato, il testo è finale dal punto di vista dell'utente. Questo contratto fa sembrare lo streaming onesto invece che tremolante.

Il risultato è uno stack vocale in streaming che sembra immediato ma non tratta ogni ipotesi acustica iniziale come finale. Per la digitazione vocale, questo compromesso conta più della velocità della trascrizione grezza.

Contesto di ricerca aperto

Seguiamo da vicino la ricerca aperta perché affina il vocabolario per i problemi che vediamo nel prodotto. Paper e report su modellazione audio-linguistica, encoder multimodali e preference optimization mostrano il campo convergere su responsabilità separate, vincoli di streaming e allineamento cross-modale. Per il background, parti da Whisper, dal report tecnico Qwen2 e dalla panoramica pubblica Qwen2.5-Omni.

Il confine di prodotto importante: questi riferimenti sono contesto di letteratura. Lo stack di produzione di Loqua è ricerca originale addestrata e ottimizzata internamente per la dettatura Mac. Citiamo lavori aperti per spiegare il campo, non per suggerire provenienza.

Cosa abbiamo costruito e cosa viene dopo

Ciò che è stato spedito da questa direzione è un sistema stretto: digitazione vocale Mac che ascolta, legge contesto locale dello schermo e scrive testo consapevole dell'app. Il prossimo lavoro è una valutazione più rigorosa. Servono metodologie pubbliche per latenza, NER tecnica, WER multilingue e disambiguazione tramite contesto dello schermo, così le affermazioni siano verificabili fuori dal nostro dogfooding.

La seconda direzione è una calibrazione migliore. Quando il modello è incerto su un identificatore visibile, dovrebbe chiedere meno all'utente scegliendo una forma di output sicura o preservando la frase grezza. Stiamo anche esplorando indicatori di incertezza leggeri nel text renderer, così l'UI a valle possa evidenziare span a bassa confidenza per una rapida correzione da tastiera senza spezzare il ritmo della dettatura.

La terza direzione è l'audio non verbale. Quel lavoro è ancora in fase prototipale e lo copriamo separatamente in Sounds with meaning. Insieme al nostro lavoro sul reinforcement learning e sull'ascoltatore multimodale, forma l'agenda per il prossimo anno del nostro stack di digitazione vocale omni-modale.

Domande frequenti

Che cos'è la digitazione vocale omni-modale?
Digitazione vocale omni-modale significa che il sistema di dettatura considera più dell'audio. Può combinare parlato con contesto locale dello schermo, metadati dell'app attiva, testo selezionato e ciò che circonda il cursore. In Loqua, quel contesto aiuta il sistema a decidere se la stessa frase pronunciata debba diventare prosa, un commento di codice, una lista o una modifica.
Perché Loqua separa comprensione e rendering del testo?
La separazione rende la pipeline più veloce e più facile da debuggare. L'instruction planner risolve intento, entità, contesto di destinazione e prompt di istruzione attivo. Il text renderer scrive il testo finale nella forma giusta. Non genera parlato o output TTS. Se l'output fallisce, possiamo ispezionare se la responsabilità è dell'ascolto, della comprensione del task o del rendering del testo, invece di indovinare dentro un singolo modello monolitico.
Il MoE rende troppo pesante la digitazione vocale locale?
Può succedere se il pool di esperti è grande o il routing è instabile. Loqua mantiene conservativo il MoE dell'encoder audio: esperti piccoli, segnali di routing semplici e un percorso di default veloce. L'obiettivo non è la massima capacità. L'obiettivo è spendere compute extra solo sulle regioni acustiche difficili.
Perché non streammare subito ogni token?
Lo streaming immediato può esporre ipotesi costose da correggere, soprattutto intorno a identificatori e formattazione specifica per app. Loqua streamma rapidamente gli span a basso rischio e ritarda quelli rischiosi finché il contesto non li conferma. Questo dà reattività evitando le correzioni a metà enunciato più frustranti.
Questa architettura è utile solo per Mac?
La separazione generale può funzionare altrove, ma Mac è il luogo in cui possiamo fare assunzioni di prodotto forti: Apple Silicon, contesto delle app desktop, API di Accessibilità e workflow guidati da tastiera. Restringere la piattaforma permette al modello e al runtime di ottimizzarsi per un ambiente quotidiano invece che per un compromesso cross-platform generico.
Come dovrebbero valutare gli ingegneri uno stack vocale come questo?
Non misurate solo il word error rate. Misurate anche tempo al primo testo utilizzabile, preservazione delle entità, accuratezza della formattazione app-aware, tasso di correzione e comportamento dei confini di privacy. Uno stack di digitazione vocale può avere buon ASR e comunque scrivere testo poco utile nell'app di destinazione.
Che cosa significa confine di commit in uno stack vocale in streaming?
Un confine di commit è il punto in cui il text renderer promette di non revisionare più il testo già emesso. Loqua posiziona i confini su pause naturali, terminatori di frase e transizioni strutturali. Dentro un confine il text renderer può revisionare liberamente; una volta confermato, il testo è finale dal punto di vista dell'utente, ed è questo che fa sembrare onesto lo streaming.
Perché non personalizzare l'encoder audio per utente?
Ci abbiamo provato e lo abbiamo abbandonato. Gli adapter per utente miglioravano l'accuratezza cold-start di alcuni punti sui set interni, ma raddoppiavano il footprint di memoria all'avvio e indebolivano la storia di privacy. Loqua mantiene generico l'encoder e spinge il comportamento specifico dell'utente più in alto nello stack: instruction planner, text renderer e dizionari locali che non lasciano mai il dispositivo.

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

Guida
Come dettare codice su Mac: guida completa per Cursor, VS Code e Claude Code
Confronto
Loqua vs Wispr Flow: un'alternativa a Wispr Flow pensata per Mac, contesto, coding e privacy
Engineering
Dettatura vocale privata per Mac: come lo stack ibrido di Loqua mantiene i tuoi dati dalla tua parte