Voice Interfaces: Speech-to-Text to LLM to TTS Pipelines
Under 1 second of perceived latency for a voice agent. Break down the STT -> LLM -> TTS pipeline, learn when streaming beats speech-to-speech, and engineer the latency budget line by line.
Published on • August 8, 2026
AI Assistant

A voice agent that makes you wait a vocal pause feels like a phone tree. The gap between “feels instant” and “feels like a bot” is about 300–1000 ms of engineered latency — and almost all of it is orchestration, not model quality. This post breaks down the STT → LLM → TTS pipeline, where the milliseconds go, and when to skip the pipeline entirely.
The three-stage pipeline
A “cascaded” voice agent chains three specialized models:
graph LR
Start[Microphone] --> VAD[VAD]
VAD --> STT[STT]
STT --> Text1[text]
Text1 --> LLM[LLM]
LLM --> Text2[text]
Text2 --> TTS[TTS]
TTS --> End[Speaker]
style Text1 fill:#f9f,stroke:#333,stroke-width:2px,color:black
style Text2 fill:#f9f,stroke:#333,stroke-width:2px,color:black
- STT (speech-to-text): transcribes audio. Streaming STT emits partial transcripts while the user is still speaking.
- LLM: the reasoning layer. It consumes partial transcript + context/stystem prompt.
- TTS (text-to-speech): synthesizes audio from the model’s text. Streaming TTS starts speaking from the first sentence fragment.
The reason to cascade instead of one Big Model: control. In an entry you can mix and match providers (best STT, best LLM, best TTS), swap any stage independently, keep an exact transcript for compliance, and do function calling. The cost: latency per stage and more moving parts.
The naive (sequential) pipeline
Wait for full utterance → send whole audio to STT (150–500ms) → wait for full LLM response (350ms-1s+) → send full text to TTS (100–500ms) → play. That adds up to 600ms–2s before a word is heard. Fine for a prototype, not for production.
Streaming is the real optimization
The single biggest latency win is overlapping the stages: streaming STT emits partial transcripts, the LLM starts on the partial, TTS begins speaking on the first sentence. In practice, streaming saves 300–600ms end-to-end depending on the provider’s streaming support.
A realistic budget once everything streams:
| Stage | Time budget |
|---|---|
| STT finalization | 50–100ms |
| LLM time-to-first-token | 100–200ms |
| TTS time-to-first-byte | 50–80ms |
| Transport (WebRTC) | 20–50ms |
| Total (target) | 300ms |
The sentence buffer is the crucial orchestration primitive: it accumulates LLM tokens and only hands whole sentences to TTS, so the synth starts cleanly mid-stream instead of choking on partial words.
Picking models for voice is picking TTF-by-budget
For voice, the binding constraint is time-to-first-token, not benchmark score. Fast models land in the 50–300ms band (Groq-hosted, gemini flash-lite; gpt-4o-mini ~120–200ms), while frontier reasoning models are measured in seconds — they’re off the table for live voice. If you need capability + liveness, hedge: run two LLMs in parallel and use whichever returns a usable first token first.
Endpointing matters too: naive VAD waits ~600ms of silence before deciding the user finished — that alone blows a 400ms budget. Semantic turn detection (pitch + energy + lexical cues) brings end-of-turn under 300ms and cuts false interruptions ~45%.
When to skip it: speech-to-speech models
Gemini Live, OpenAI Realtime, Nova Sonic, and friends accept raw audio and return raw audio: one model, no text in between. Latency drops under ~500ms total and prosody is natural. The tradeoffs:
- No transcript by default — you’ll want parallel STT for display, compliance, RAG.
- Provider lock-in: the LLM and the voice are the same model; you can’t swap one without the other.
- Function calling is less mature than in a text-based cascade.
Production reality (from the arXiv tutorial): native Qwen2.5-Omni reached ~13-second time-to-first-audio, whereas a streaming cascade (Deepgram + vLLM + ElevenLabs) delivered a measured 755ms with working function calls — ~17× faster. So “simplest to build” (speech-to-speech) is not yet “simplest to control”: choose realtime for raw speed in narrow tasks, cascade when you need control, and hybrid when you need both (S2S conversation + a parallel STT stream for transcripts/audit).
Putting It All Together
Whatever architecture, capture two streams on every call:
- the conversation audio, and
- a transcript stream from the same audio (even when the realtime model is speech-to-speech), because transcripts power eval, compliance, and your RAG retrieval.
Conclusion & Next Steps
Map your budget: pick an STT, an LLM, and a TTS that each meet their line item, then make every stage streaming. Add semantic endpointing instead of VAD-only silence detection, and wrap the whole loop in an eval harness that measures time-to-first-audio — not just overall quality — since that’s the number your users feel. Next: wire function calling into your LLM stage so the voice agent can act (book, order, transfer) without special-casing audio in your product layer.
References / Sources
- Google Cloud Speech-to-Text. https://cloud.google.com/speech-to-text/docs
- LiveKit voice agent architecture explainer. https://livekit.com/blog/voice-agent-architecture-stt-llm-tts-pipelines-explained
- Building enterprise realtime voice agents (arXiv tutorial). https://arxiv.org/html/2603.05413
- Voice AI production latency engineering. https://tianpan.co/blog/2026-04-09-voice-ai-production-300ms-latency-budget