Skip to main content

Universal Speech to Text: pipeline sotto i 120 ms

Un'analisi approfondita della costruzione di una pipeline ASR ibrida a bassa latenza con Conformer-CTC e Faster-Whisper.

Digvijay Singh Shekhawat
Digvijay Singh Shekhawat
July 26, 2026
10 min read
Universal Speech to Text: pipeline sotto i 120 ms

Lo speech to text in spagnolo è più difficile da eseguire in tempo reale rispetto all'inglese, e non perché i modelli siano più deboli. Il costo sta nella pipeline che li circonda: identificazione della lingua prima della prima parola, un secondo modello acustico in memoria e il code-switching a metà frase quando chi chiama passa dallo spagnolo all'inglese. È questo che una pipeline multilingue sotto i 120 ms deve assorbire.

Se impieghi più di 120 millisecondi per elaborare un blocco di audio, il tuo utente ha già parlato sopra il tuo agent. Avviare un'API di terze parti come Deepgram o AssemblyAI ti dà un prototipo in dieci minuti. Scalalo a milioni di chiamate simultanee e multilingue e ti manderà in bancarotta il budget di calcolo oppure distruggerà i tuoi SLA di latenza. La via d'uscita è una pipeline ASR personalizzata a topologia ibrida — una che faccia da ponte tra i vincoli dell'hardware locale e i runtime neurali ottimizzati.

Ecco l'architettura, i compromessi e i dettagli implementativi per il riconoscimento vocale automatico (ASR) ad alto throughput in spagnolo, tedesco e inglese con accento indiano.

L'evoluzione dell'architettura del riconoscimento vocale

I vecchi stack vocali erano legati al desktop. Su Windows si sceglieva tra due API: System.Speech e Microsoft.Speech.Recognition. System.Speech si appoggia al motore condiviso a livello di sistema operativo, pensato per l'accessibilità desktop. Microsoft.Speech.Recognition esegue runtime server isolati con concorrenza più elevata. Entrambe sono saldate al sistema operativo sottostante, il che le esclude per deployment telecom containerizzati e cloud-native.

Il settore si è spostato dai classici Hidden Markov Model abbinati ai Gaussian Mixture Model (HMM-GMM) alle reti neurali end-to-end (E2E). Le pipeline HMM-GMM richiedevano tre modelli distinti: acustico, di pronuncia e linguistico. Architetture E2E come Conformer-CTC e i Transducer (RNN-T) racchiudono tutto questo in un'unica rete. Meno overhead di inferenza. Nessun errore di allineamento.

Una latenza sotto i 120 ms significa togliersi di mezzo dal routing audio a livello di sistema operativo. Le librerie audio standard aggiungono da sole fino a 50 ms di latenza di scheduling. Scrivendo binding personalizzati direttamente su Advanced Linux Sound Architecture (ALSA) o Windows Audio Session API (WASAPI) in modalità esclusiva, puoi inviare i frame audio PCM grezzi direttamente nello spazio di memoria del tuo modello. È per questo che i motori universal speech to text seri saltano i livelli di astrazione che la maggior parte dei tutorial dà per scontati.

Per il runtime di esecuzione la scelta è netta: runtime open-source come Sherpa-ONNX o Faster-Whisper, oppure API cloud enterprise. Sherpa-ONNX esegue modelli Conformer-CTC quantizzati senza alcuna dipendenza da rete esterna. Faster-Whisper usa CTranslate2 per eseguire modelli Whisper quantizzati fino a 4 volte più velocemente di PyTorch standard — trascrizione multilingue robusta su una frazione dell'hardware.

Scomporre il budget di latenza di 120 ms

Un voice agent conversazionale risulta naturale solo se il round trip resta sotto i 500 ms. Restano esattamente 120 ms per l'intera pipeline ASR: Voice Activity Detection (VAD), suddivisione acustica in chunk, inferenza del modello e formattazione del testo. Il Large Language Model (LLM) a valle e i motori text-to-speech (TTS) si mangiano il resto.

+------------------------------------------------------------+
| Total Conversational Budget: ~500ms                        |
+---------------------+------------------+-------------------+
| ASR: 120ms          | LLM TTFT: 180ms  | TTS & Network: 200ms
+---------------------+------------------+-------------------+
| VAD | Chunk | Infer |
+-----+-------+-------+

Il VAD è il primo guardiano. Se aspetti che l'utente finisca l'intera frase prima di eseguire l'inferenza, hai aggiunto da 400 ms a 800 ms di silenzio morto. Eseguendo Silero VAD o WebRTC VAD in locale con chunk da 30 ms–80 ms, cogli l'inizio del parlato quasi istantaneamente. L'agent smette di parlare sopra l'utente e i tuoi buffer di memoria restano piccoli.

La decodifica è un compromesso diretto tra velocità e accuratezza:

  • Connectionist Temporal Classification (CTC): altamente parallelizzabile, non autoregressiva, velocissima. Predice sequenze di token senza allineamento, ma non ha un modello linguistico forte, quindi ogni tanto scrive le parole foneticamente.
  • Autoregressive Attention-based Encoder-Decoder (AED): ciò che usa Whisper. Molto accurato e sensibile al contesto, ma la latenza cresce in modo quadratico man mano che la sequenza di output si allunga.

Il decoding speculativo fa da ponte tra i due. Eseguendo un modello CTC leggero e non autoregressivo — per esempio un Conformer da 100M di parametri — accanto a un modello AED più grande, puoi passare trascrizioni preliminari all'LLM prima che la beam search più pesante finisca. L'LLM inizia a redigere mentre la pipeline ASR affina i token finali.

Una configurazione Python per un modello Faster-Whisper quantizzato ad alto throughput, ottimizzato per lo streaming a bassa latenza:

from faster_whisper import WhisperModel

# Initialize model with INT8 quantization on CUDA for optimal latency/throughput balance
model_path = "large-v3"
model = WhisperModel(
    model_size_or_path=model_path,
    device="cuda",
    compute_type="int8_float16",
    local_files_only=False
)

# Configure streaming parameters for 80ms chunks
streaming_options = {
    "beam_size": 1,
    "best_of": 1,
    "temperature": 0.0,
    "condition_on_previous_text": False,
    "initial_prompt": "Use concise, natural spoken language formatting."
}

Risolvere le sfumature multilingue e la formattazione contestuale del testo

Le trascrizioni acustiche grezze sono spesso illeggibili. Un utente dice "centoventi dollari" — inviare quella stringa grezza a un'API o a un database è uno spreco. Serve una formattazione contestuale del testo, nello specifico l'Inverse Text Normalization (ITN), per trasformare le parole pronunciate in output strutturato come "$120". Numeri, valute e date con locale misti tra lingue diverse rendono la cosa davvero difficile.

È con il tedesco che i sostantivi composti mordono. Chi parla tedesco incolla abitualmente le parole tra loro — Kraftfahrzeug-Haftpflichtversicherung — e se il tuo vocabolario è troppo piccolo il modello le frantuma in più token. Più token significa più latenza di inferenza e una peggiore comprensione da parte dell'LLM a valle. Addestra un tokenizer Byte-Pair Encoding (BPE) a livello di byte su corpora tedeschi proprio per mantenere ragionevole la lunghezza dei token.

Lo spagnolo è un problema di dialetti. Un modello ottimizzato per lo spagnolo iberico fallisce regolarmente sullo spagnolo colloquiale messicano o statunitense. Instrada l'audio verso specifici adattatori acustici in base al prefisso internazionale di chi chiama, così le pronunce regionali mappano sugli stessi token semantici.

[Caller Country Code] 
   |--> +34 (Spain)   --> Load Iberian Spanish Adapter
   |--> +52 (Mexico)  --> Load Mexican Spanish Adapter
   |--> +91 (India)   --> Load Hinglish Pronunciation Lexicon

L'India porta con sé il code-switching — l'"Hinglish", hindi e inglese intrecciati in un'unica frase. Qui i modelli monolingue crollano, completamente. La soluzione sono lessici di pronuncia personalizzati più tokenizer in stile Whisper affinati che trattano le transizioni Hinglish comuni come singoli token, così il modello non allucina né si blocca al cambio di lingua.

Nel valutare l'accuratezza della trascrizione multilingue, il Word Error Rate (WER) da solo è una metrica ingannevole. Un modello può avere un WER del 5% e fallire completamente su entità critiche come numeri di telefono o importi in valuta. Valuta sempre usando l'Entity-Weighted Word Error Rate (E-WER).

Aggirare i colli di bottiglia dei sistemi operativi mobile ed edge

Ottenere bassa latenza su mobile significa aggirare le astrazioni standard del sistema operativo. Su Android, la finestra di dialogo nativa di riconoscimento vocale aggiunge latenza visiva e blocca la UI. Costruisci invece un servizio in background sull'API di basso livello AudioRecord.

// Configuring AudioRecord for low-latency PCM capture on Android
int bufferSize = AudioRecord.getMinBufferSize(
    16000, 
    AudioFormat.CHANNEL_IN_MONO, 
    AudioFormat.ENCODING_PCM_16BIT
);

AudioRecord audioRecord = new AudioRecord(
    MediaRecorder.AudioSource.VOICE_RECOGNITION,
    16000,
    AudioFormat.CHANNEL_IN_MONO,
    AudioFormat.ENCODING_PCM_16BIT,
    bufferSize
);

Il riconoscimento offline su hardware limitato richiede una compressione aggressiva. La quantizzazione INT8 insieme a ONNX Runtime Mobile esegue un modello Conformer-CTC da 150M di parametri su un dispositivo Android di fascia media in meno di 15 ms per frame — senza alcuna rete cellulare nel ciclo.

Android legacy (API 16, JellyBean) e i dispositivi fortemente limitati non riescono a reggere le reti neurali moderne. Ripiega su librerie leggere come pocketsphinx o vosk-api. Mancano della profondità semantica delle reti profonde, ma l'impronta di memoria è trascurabile e il keyword spotting resta affidabile.

La memoria sui gateway edge è un gioco di equilibri. Un modello acustico da 300M di parametri richiede circa 300MB di RAM. Eseguilo accanto alla soppressione locale del rumore (RNNoise) e alla cancellazione dell'eco acustica (AEC) e la banda di memoria diventa rapidamente il vero collo di bottiglia. Fissa questi modelli su core CPU specifici e condividi i buffer di memoria per evitare il thrashing della cache.

Il costo della voce: self-hosting vs. API cloud

Su volumi di milioni di minuti, sono le unit economics a dettare l'infrastruttura. Ecco i numeri concreti per ospitare i propri modelli rispetto al pagare API di terze parti.

MetricaSelf-hosted (GPU NVIDIA L4)API cloud gestita
Costo al minuto~$0,0018 (al 70% di utilizzo)$0.0110 to $0.0150
Limite di concorrenzaLegato alla VRAM (circa 40 stream/L4)Limitato in modo flessibile dalla quota API
Latenza media80ms - 120ms (rete locale)250ms - 450ms (internet pubblica)
Penalità di cold startConfigurabile tramite warm poolingGestita dal provider

Un'istanza NVIDIA L4 su AWS (g6.xlarge) costa circa $1,21 all'ora. Faster-Whisper-large-v3 quantizzato a INT8 su quella macchina gestisce fino a 40 stream simultanei senza degrado della latenza. Mantieni un tasso di utilizzo moderato del 70% e il costo effettivo si attesta intorno a $0,0018 al minuto — contro gli standard $0,0110 al minuto che applicano le API cloud premium.

Il rovescio della medaglia: il self-hosting conviene solo oltre una certa soglia di volume. I costi fissi per tenere le istanze GPU calde fanno sì che il self-hosting superi le API cloud solo sopra i 150.000 minuti di chiamata al mese. Al di sotto, il tempo di GPU inattiva si mangia ogni risparmio teorico.

Monthly Cost ($)
  |
  |      / Managed Cloud API ($0.011/min)
  |     / 
  |    /   <-- Break-even point at ~150,000 mins
  |   / 
  |  /___________ Self-Hosted NVIDIA L4 ($1.21/hr fixed + scaling)
  |______________________
                         Volume (Minutes/Month)

Far girare ASR self-hosted in produzione senza picchi di latenza significa eliminare i cold start su Kubernetes (EKS o GKE). Triton Inference Server permette di pre-allocare la memoria GPU e di tenere pronto un warm pool di istanze del modello per l'audio in arrivo. Questo evita lo stallo di 5-10 secondi che un container subisce quando carica dinamicamente un file di modello da 1GB nella VRAM.

Il grosso del lavoro, per noi, l'ha fatto il tuning del VAD. Abbiamo abbassato la soglia di rilevamento del silenzio da 500ms a 250ms, ottimizzato le dimensioni dei chunk per l'elaborazione locale e ridotto del 34% l'utilizzo di calcolo complessivo nelle nostre prime implementazioni enterprise. Più stream per GPU, costi infrastrutturali più bassi, e il profilo di latenza sotto i 120ms ha retto.

Man mano che i runtime locali con accelerazione hardware continuano a maturare, il confine tra elaborazione vocale edge e cloud si dissolve del tutto. I team che padroneggiano oggi le pipeline universal speech to text a topologia ibrida opereranno a una frazione della latenza e del costo di chiunque continui a limitarsi a incapsulare un'API di terze parti.

Domande frequenti

Quanto è accurato lo speech to text in spagnolo rispetto all'inglese? Vicino, su audio pulito. Il divario si apre su audio in banda telefonica, accenti regionali e code-switching, che è dove si colloca la maggior parte delle chiamate di un contact centre.

Un solo modello può gestire entrambe le lingue? I modelli multilingue possono farlo, a un certo costo in termini di accuratezza per singola lingua. Usare un modello dedicato per ogni lingua è più accurato, ma richiede di identificare la lingua abbastanza presto da non consumarci il budget di latenza.

Cos'è il code-switching e perché manda in crisi il riconoscimento? È il passaggio da una lingua all'altra all'interno di uno stesso enunciato. Una pipeline che ha scelto una lingua all'inizio della chiamata, a quel punto, si è già impegnata.

Digvijay Singh Shekhawat
Digvijay Singh Shekhawat

Founder, Finn AI

Digvijay sta costruendo Finn — il livello di orchestrazione vocale enterprise che ragiona durante le chiamate, estrae dati e aggiorna i tuoi sistemi in tempo reale. Scrive di AI vocale, go-to-market e di cosa serve per portare in produzione agenti autonomi su larga scala.