Skip to main content

Universal speech to text: pipelines under 120 ms

En djupdykning i hur man bygger en hybrid ASR-pipeline med låg latens med hjälp av Conformer-CTC och Faster-Whisper.

Digvijay Singh Shekhawat
Digvijay Singh Shekhawat
July 26, 2026
9 min read
Universal speech to text: pipelines under 120 ms

Spanska speech to text är svårare att köra i realtid än engelska, och det beror inte på att modellerna är sämre. Kostnaden ligger i pipelinen runt dem: språkidentifiering före första ordet, ytterligare en akustisk modell i minnet och kodväxling mitt i meningen när en uppringare rör sig mellan spanska och engelska. Det är detta en flerspråkig pipeline under 120 ms måste absorbera.

Tar det mer än 120 millisekunder att bearbeta ett ljudsegment har din användare redan pratat i mun på din agent. Att snabbt koppla in ett tredjeparts-API som Deepgram eller AssemblyAI ger dig en prototyp på tio minuter. Skala det till miljontals samtidiga, flerspråkiga samtal så kommer det antingen att spränga din compute-budget eller förstöra dina latens-SLA:er. Vägen ut är en skräddarsydd ASR-pipeline med hybridtopologi — en som överbryggar lokala hårdvarubegränsningar och optimerade neurala runtimes.

Här är arkitekturen, avvägningarna och implementationsdetaljerna för automatisk taligenkänning (ASR) med hög genomströmning på spanska, tyska och indiskt accentuerad engelska.

Utvecklingen av arkitekturen för taligenkänning

Äldre talstackar var bundna till skrivbordet. På Windows valde man mellan två API:er: System.Speech och Microsoft.Speech.Recognition. System.Speech förlitar sig på den delade motorn på OS-nivå som byggdes för tillgänglighet på skrivbordet. Microsoft.Speech.Recognition kör isolerade server-runtimes med högre samtidighet. Båda är fastsvetsade i det underliggande operativsystemet, vilket utesluter dem för containeriserade, molnbaserade telekomdriftsättningar.

Fältet har lämnat klassiska Hidden Markov-modeller kombinerade med Gaussian Mixture Models (HMM-GMM) och gått över till end-to-end (E2E) neurala nätverk. HMM-GMM-pipelines krävde tre separata modeller — akustisk, uttals- och språkmodell. E2E-arkitekturer som Conformer-CTC och Transducers (RNN-T) samlar allt detta i ett enda nätverk. Mindre inferensoverhead. Inga justeringsfel.

Latens under 120 ms innebär att man måste komma undan ljudroutning på OS-nivå. Vanliga ljudbibliotek lägger på upp till 50 ms schemaläggningslatens helt på egen hand. Skriv egna bindningar direkt mot Advanced Linux Sound Architecture (ALSA) eller Windows Audio Session API (WASAPI) i exklusivt läge, så kan du mata råa PCM-ljudramar direkt in i modellens minnesutrymme. Det är därför seriösa universal speech to text-motorer hoppar över de abstraktionslager som de flesta guider utgår från.

För exekverings-runtimen är valet skarpt: runtimes med öppen källkod som Sherpa-ONNX eller Faster-Whisper, eller moln-API:er för företag. Sherpa-ONNX kör kvantiserade Conformer-CTC-modeller utan några externa nätverksberoenden. Faster-Whisper använder CTranslate2 för att köra kvantiserade Whisper-modeller upp till 4× snabbare än standard-PyTorch — robust flerspråkig transkribering på en bråkdel av hårdvaran.

Latensbudgeten på 120 ms i detalj

En konversationell röstagent känns naturlig endast om tur-och-retur-tiden håller sig under 500 ms. Det lämnar exakt 120 ms för hela ASR-pipelinen: Voice Activity Detection (VAD), akustisk chunkning, modellinferens och textformatering. Den nedströms liggande stora språkmodellen (LLM) och text-to-speech-motorn (TTS) äter upp resten.

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

VAD är den första grindvakten. Väntar du på att användaren ska avsluta hela sin mening innan du kör inferens har du lagt till 400 ms till 800 ms av tystnad. Kör Silero VAD eller WebRTC VAD lokalt med segment på 30–80 ms så fångar du talets början nästan omedelbart. Agenten slutar prata i mun på användaren, och dina minnesbuffertar förblir små.

Avkodning är en direkt avvägning mellan hastighet och noggrannhet:

  • Connectionist Temporal Classification (CTC): Mycket parallelliserbar, icke-autoregressiv, blixtsnabb. Förutsäger tokensekvenser utan justering men saknar en stark språkmodell, så den stavar ibland saker fonetiskt.
  • Autoregressiv Attention-based Encoder-Decoder (AED): Det som Whisper använder. Mycket noggrann och kontextmedveten, men latensen skalar kvadratiskt när utdatasekvensen växer.

Spekulativ avkodning överbryggar de två. Kör en lättviktig, icke-autoregressiv CTC-modell — säg en Conformer med 100M parametrar — parallellt med en större AED-modell, så kan du överlämna preliminära transkript till LLM:en innan den tyngre beam search-processen är klar. LLM:en börjar formulera medan ASR-pipelinen finslipar de slutgiltiga tokens.

En Python-konfiguration för en kvantiserad Faster-Whisper-modell med hög genomströmning, avstämd för streaming med låg latens:

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."
}

Att lösa flerspråkiga nyanser och kontextuell textformatering

Råa akustiska transkript är ofta oläsbara. En användare säger "etthundratjugo dollar" — att skicka den råa strängen till ett API eller en databas är slöseri. Du behöver kontextuell textformatering, närmare bestämt Inverse Text Normalization (ITN), för att förvandla talade ord till strukturerad utdata som "$120". Siffror, valutor och datum blandade över flera språkvarianter gör detta genuint svårt.

Tyskan är där sammansatta substantiv biter till. Tysktalande klistrar rutinmässigt ihop ord — Kraftfahrzeug-Haftpflichtversicherung — och om ditt vokabulär är för litet splittrar modellen dem i flera tokens. Fler tokens innebär högre inferenslatens och sämre förståelse i LLM:en nedströms. Träna en byte-nivå Byte-Pair Encoding-tokenizer (BPE) specifikt på tyska korpusar för att hålla tokenlängderna rimliga.

Spanskan är ett dialektproblem. En modell som är avstämd för iberisk spanska misslyckas rutinmässigt på vardaglig mexikansk eller USA-spanska. Dirigera ljudet till specifika akustiska adaptrar baserat på uppringarens landskod så att regionala uttal mappas till samma semantiska tokens.

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

Indien för med sig kodväxling — "hinglish", hindi och engelska flätade till en och samma mening. Enspråkiga modeller faller helt samman här. Lösningen är egna uttalslexikon plus finjusterade tokenizers av Whisper-typ som behandlar vanliga hinglish-övergångar som enskilda tokens, så att modellen inte hallucinerar eller stannar upp vid språkbytet.

När man utvärderar flerspråkig transkriberingsnoggrannhet är Word Error Rate (WER) ensamt ett vilseledande mått. En modell kan ha 5 % WER men misslyckas fullständigt med kritiska entiteter som telefonnummer eller valutabelopp. Utvärdera alltid med Entity-Weighted Word Error Rate (E-WER).

Att kringgå flaskhalsar i mobil- och edge-operativsystem

Låg latens på mobil innebär att gå runt de vanliga OS-abstraktionerna. På Android lägger den inbyggda dialogrutan för taligenkänning till visuell latens och blockerar användargränssnittet. Bygg i stället en bakgrundstjänst på det lågnivå-API:et 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
);

Offline-igenkänning på begränsad hårdvara kräver aggressiv komprimering. INT8-kvantisering plus ONNX Runtime Mobile kör en Conformer-CTC-modell med 150M parametrar på en Android-enhet i mellanklassen på under 15 ms per ram — utan något mobilnät alls inblandat.

Äldre Android (API 16, JellyBean) och kraftigt begränsade enheter klarar inte moderna neurala nät. Fall tillbaka på lättviktiga bibliotek som pocketsphinx eller vosk-api. De saknar de djupa nätverkens semantiska djup, men minnesavtrycket är försumbart och nyckelordsdetektering förblir tillförlitlig.

Minne på edge-gateways är en balansgång. En akustisk modell med 300M parametrar vill ha ungefär 300 MB RAM. Kör den bredvid lokal brusreducering (RNNoise) och akustisk ekosläckning (AEC) så blir minnesbandbredden snabbt den verkliga flaskhalsen. Lås dessa modeller till specifika CPU-kärnor och dela minnesbuffertar för att undvika cache-thrashing.

Vad rösten kostar: egen drift kontra moln-API:er

Vid miljontals minuter är det enhetsekonomin som styr infrastrukturen. Här är de konkreta siffrorna för att köra egna modeller jämfört med att betala för tredjeparts-API:er.

MåttEgen drift (NVIDIA L4 GPU)Hanterat moln-API
Kostnad per minut~0,0018 USD (vid 70 % utnyttjande)$0.0110 to $0.0150
Gräns för samtidighetBunden till VRAM (cirka 40 strömmar/L4)Mjukt begränsad av API-kvot
Genomsnittlig latens80 ms–120 ms (lokalt nätverk)250 ms–450 ms (publikt internet)
Straff för kallstartKonfigurerbart via warm poolingHanteras av leverantören

En NVIDIA L4-instans på AWS (g6.xlarge) kostar ungefär 1,21 USD per timme. Faster-Whisper-large-v3 kvantiserad till INT8 på den maskinen klarar upp till 40 samtidiga strömmar utan att latensen försämras. Håll en måttlig utnyttjandegrad på 70 % så hamnar din faktiska kostnad nära 0,0018 USD per minut — mot de 0,0110 USD per minut som moln-API:er i premiumsegmentet normalt tar.

Haken: egen drift lönar sig först över en viss volymtröskel. De fasta kostnaderna för att hålla GPU-instanser varma gör att egen drift slår moln-API:er först över 150 000 samtalsminuter per månad. Under den nivån äter GPU-tid i tomgång upp varenda teoretisk besparing.

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)

Att köra egen ASR i produktion utan latenstoppar innebär att man måste få bort kallstarter på Kubernetes (EKS eller GKE). Med Triton Inference Server kan du förallokera GPU-minne och hålla en varm pool av modellinstanser redo för inkommande ljud. Det hoppar över de 5–10 sekunders stopp som en container drabbas av när den dynamiskt läser in en 1 GB stor modellfil i VRAM.

Det som gjorde störst skillnad för oss var att finjustera VAD. Vi sänkte tröskeln för tystnadsdetektering från 500 ms till 250 ms, justerade chunk-storlekar för lokal bearbetning och minskade den totala beräkningsanvändningen med 34 % i våra första enterprise-driftsättningar. Fler strömmar per GPU, lägre infrastrukturkostnad — och latensprofilen under 120 ms höll.

I takt med att hårdvaruaccelererade lokala runtimes mognar löses gränsen mellan tal­bearbetning i edge och moln upp helt. De team som redan nu behärskar universella speech to text-pipelines med hybridtopologi kommer att köra med en bråkdel av latensen och kostnaden jämfört med alla som fortfarande bygger ett skal runt ett tredjeparts-API.

Vanliga frågor

Hur träffsäker är speech to text på spanska jämfört med engelska? Nära nog. Glappet öppnar sig vid ljud i telefonibandet, regionala dialekter och kodväxling — vilket är precis där de flesta kontaktcentersamtal ligger.

Kan en och samma modell hantera båda språken? Flerspråkiga modeller kan det, till viss kostnad för träffsäkerheten per språk. Att köra en dedikerad modell per språk är mer träffsäkert, men kräver språkidentifiering tillräckligt tidigt för att inte förbruka latensbudgeten på det.

Vad är kodväxling och varför bryter det igenkänningen? Att växla mellan språk inom ett och samma yttrande. En pipeline som valde språk i början av samtalet har redan låst sig vid det laget.

Digvijay Singh Shekhawat
Digvijay Singh Shekhawat

Grundare, Finn AI

Digvijay bygger Finn – lagret för röstorkestrering för företag som resonerar sig genom samtal, extraherar data och uppdaterar dina system i realtid. Skriver om röst-AI, go-to-market och vad som krävs för att leverera autonoma agenter i stor skala.