
Hey guys, Mr. Technology here.
Last Tuesday I called a pharmacy to refill a prescription. The voice on the other end was not a human. It asked me for my date of birth, my prescription number, and the pickup time. It handled my "actually, can you transfer me to a pharmacist" redirect without breaking stride. It confirmed the order in under 90 seconds. I only knew it was not human because I had spent the previous week building the same stack myself and I recognized the pause pattern. The pharmacy confirmed two days later that the refills were already running through their production voice agent and had been since January. They are processing 14,000 calls a day on it. The hold time dropped from 11 minutes to 22 seconds. Picking up at the counter went from 30% of customers to 71%.
That is the 2026 voice agent story. Not "AI can talk." Not "AI sounds human." AI voice agents are now production infrastructure inside mid-market and enterprise call centers, and the architecture that makes them work is one of the most underappreciated stacks in the agent ecosystem. The tools are not the obvious ones. The patterns are not what Twilio, Google CCAI, or Amazon Connect are selling. And the conversation you are about to have with a customer service agent on a phone line is, with non-trivial probability, going to be a 1.2-1.8 second-latency multi-model pipeline stitched together with WebRTC, gRPC, and a state machine that looks nothing like the agent loop you have been building for chat.
This is the technical map of what a production voice agent stack actually looks like in August 2026 — the four models you need, the order you need them in, the latency budget that makes the conversation feel human, the failure modes that kill production deployments, and the production stack I would ship today if you gave me a budget and a deadline. Then I am going to tell you why full-duplex is a lie, why streaming STT is overrated, and why the people who are winning voice agents right now are not the people who are winning chat agents.
If you are building voice agents, you are about to waste a lot of money unless you read this first.
If you build chat agents, you have a generous latency budget. A 1.5-second response time for a chat agent is fine — users read while the model thinks. The model can take 4-8 seconds to generate a long answer. It can call 12 tools. It can hit a vector database. It can do a fresh retrieval for every turn. The user does not care. The chat UI hides the latency. Words stream in. The cognitive load is on the user, not the system.
Voice agents are the opposite. The cognitive load is on the system, not the user. The user is talking. The agent has to listen, decide it is done listening, decide what to say, say it, and say it in a way that does not break the conversational turn. The latency budget is not 1.5 seconds. It is between 800 milliseconds and 1.2 seconds from end-of-user-speech to start-of-agent-speech. Anything above 1.5 seconds and the conversation collapses. The user thinks the agent is broken. They repeat themselves. The agent thinks the user is still talking. The turn-taking breaks. The whole thing unwinds.
This single constraint — the latency budget — eliminates most of the architecture you would use for a chat agent. You cannot call a 70B model with a 5-second first-token latency. You cannot do a vector retrieval on every turn. You cannot do a multi-step agent loop with tools. You cannot reason in extended thinking mode and stream the response. The architecture has to be different. The models have to be different. The state machine has to be different. And the playbook that the chat-agent ecosystem built over the last 18 months — large models, big context, lots of tools, generous thinking — will not work. It is the wrong stack.
Here is what works.
A production voice agent in 2026 is not one model. It is four models chained together in a streaming pipeline, each with its own latency profile and its own specific job. The pipeline looks like this:
[User audio] → [STT] → [Turn detection / endpointing] → [LLM] → [TTS] → [User audio]
Each stage has constraints that dictate the architecture.
The job of the STT model is to turn the user's audio into text as fast as possible. The constraint is partial — it should produce incremental transcripts as the user is speaking, not wait for the end of the utterance. The model needs to support streaming, partial hypotheses, and low first-token latency.
The winners in 2026:
The rule: do not run your own STT. The hosted models are too good and too cheap. Self-hosting Whisper-large-v3-turbo gets you 280ms latency and 9.4% WER. Deepgram Nova-3 is faster, more accurate, and costs $0.0043/min. There is no engineering reason to self-host STT in 2026.
This is the stage that the demos skip and the production systems obsess over. The job is to decide when the user is done talking. Get this wrong and the agent either interrupts the user (because it thinks they are done when they are actually pausing mid-sentence) or waits 4 seconds after the user stops talking before responding (because it thinks they are still going to continue).
There are three approaches in production. Almost everyone is converging on the third.
Approach 1: VAD-only (silence detection) — measure when the audio energy drops below a threshold for N milliseconds. Cheap. Fast. Wrong. People pause mid-sentence to think. People take breaths. People say "uh" while they are formulating the next sentence. Pure VAD treats every pause as the end of the turn. Production voice agents with VAD-only endpointing interrupt users 18-22% of the time.
Approach 2: Full LLM-based endpointing — feed the audio to a small model that predicts whether the user is done. Better accuracy (interrupt rate around 6-8%). But you add 200-300ms to the latency budget on every turn, which is a non-starter for production.
Approach 3: VAD + small turn-detection model + prosody features — the winning pattern. Use a low-latency VAD (Silero VAD is the default) to detect silence, then route the audio to a small turn-detection model (usually a 200-400M parameter model trained on conversational data) that looks at prosody, syntax, and acoustic cues to confirm the user is done. The turn-detection model runs in parallel with the LLM's response generation. If it confirms the turn is over, the LLM response fires immediately. If it does not, the LLM response is delayed until the model confirms.
The models that matter here in 2026:
The rule: do not use VAD alone. The interrupt rate alone will kill your customer satisfaction score. Use a VAD + small turn-detection model. This is one of the few places in the agent stack where a small, specialized model beats a large general model because the task is narrow and the latency budget is brutal.
The LLM is the brain. It gets the (now-complete) user transcript, decides what to say, and streams the response out to the TTS model. The constraint is: first token out in under 400ms, sustained throughput that streams at 3-5x real-time, and the ability to handle partial responses (because the TTS is going to start speaking before the LLM has finished generating).
The model choices in 2026 have converged on a few specific patterns:
Pattern 1: Small open-weights model on dedicated GPU — DeepSeek V4-Flash-0731, Muse Glimmer 30B, Qwen3.8-72B. 200-400ms first-token latency, streaming at 150 tokens/sec. Cost per call is $0.001-0.003 depending on the model. The default for production runs above 5,000 calls/day.
Pattern 2: Hosted API with explicit low-latency tier — GPT-5.6-mini, Claude 5.5 Haiku, Gemini 3.7 Flash. 350-500ms first-token latency on the realtime tier. Cost per call is $0.005-0.012. The default for production runs below 5,000 calls/day.
Pattern 3: Speculative-decoding cascade — run a small model (1B-3B) for the first 200ms of the response, then hand off to a larger model if the complexity demands it. Used by the highest-volume production voice agents (above 50,000 calls/day) where the cost-per-call matters and the savings compound.
The mistake I see most often: teams bringing their 70B production reasoning model to voice. The latency kills the conversation. The model is also wrong for the task — you do not need a model that can write a 1,500-word essay to answer "yes, my address is the same." You need a model that can produce a 12-word response with a 350ms first-token latency. Smaller is better. Faster is better. The reasoning depth goes into the planning stage (which runs before the call), not the runtime stage.
The TTS model takes the LLM's streaming text output and produces audio that is played back to the user. The constraint is: first audio out within 200ms of the LLM's first token, prosody that does not sound robotic, and the ability to handle partial text (the LLM is still generating while the TTS is speaking).
The winners in 2026:
The rule: streaming TTS is non-negotiable. The TTS model has to start speaking before the LLM has finished generating the response. If you wait for the full response before synthesizing audio, you are adding 1-3 seconds to the latency budget. That is the entire conversation broken.
The rule: do not use non-streaming TTS. Cartesia Sonic, ElevenLabs Turbo, and OpenAI gpt-4o-mini-tts all support streaming. Any TTS that requires a full-text-in/audio-out interface is wrong for voice agents.
Here is the production stack I would ship today if you gave me a budget and a deadline:
# voice-agent-stack.yaml — production voice agent, ~5,000 calls/day
ingress:
transport: livekit_sfu
codecs: [opus_48k, pcmu]
srtp: true
sip: true # for PSTN termination
stt:
provider: deepgram
model: nova-3
endpointing: 280ms
interim_results: true
smart_format: true
turn_detection:
vad: silero_v5
vad_threshold: 0.4
smart_turn_model: livekit_turn_detector_v3
confirmation_threshold: 0.85
llm:
primary: vllm-serve-deepseek-v4-flash-0731
fallback: claude-5-5-haiku
first_token_timeout: 400ms
max_tokens: 180
temperature: 0.3
response_template: |
Respond in 8-20 words. Be direct. No filler.
If you do not know, say "I don't know" and offer a callback.
tts:
primary: cartesia_sonic
fallback: elevenlabs_turbo_v3
voice_id: brnad_voice_clone
speed: 1.05
emotion: neutral_professional
barge_in:
enabled: true
detection: energy_threshold
threshold: 0.55
cooldown_ms: 600
orchestration:
framework: pipecat_0_8
transport: livekit
state_machine: pipecat_flows
observability: langfuse_realtime
costs_per_minute:
stt: 0.0043
llm: 0.0018
tts: 0.024
total: 0.030
acceptable_total_latency_p95: 920msThe orchestration framework matters. Most voice-agent stacks I see in 2026 are built on one of three:
For production at scale, Pipecat is the right choice. It has the cleanest abstraction for the four-model pipeline, the best handling of barge-in, and the most production deployments.
Here is the p95 latency budget for a production voice agent that feels human:
| Stage | p95 Latency | Notes |
|---|---|---|
| Network ingress (SIP/PSTN) | 60ms | Carrier-side jitter |
| STT first partial | 80ms | Streaming, partial transcripts |
| VAD silence detection | 250ms | Endpointing window |
| Smart turn detector | 30ms | LiveKit turn-detector v3 |
| LLM first token | 380ms | First token only |
| TTS first audio | 110ms | Streaming, partial text |
| Network egress | 50ms | Carrier-side jitter |
| Total p95 | 960ms | Within human-feel window |
If you go above 1.2 seconds p95, the conversation starts to feel broken. You can recover from a single 1.5-second pause. You cannot recover from consistent 1.5-second pauses. The cognitive load on the user tips over.
The optimization is not "make the LLM faster." The LLM is 380ms of the 960ms budget. The optimization is in the parallelism. The turn detection runs in parallel with the LLM. The TTS starts the moment the LLM produces its first token. The STT is streaming partial transcripts during the user's speech. The plumbing is 80% of the latency budget. The LLM is 40%.
Here are the failure modes that kill production voice agents in 2026, in order of how often they show up:
The user is going to interrupt the agent. They realize the agent is going to the wrong place. They cut in. "Wait, no, I meant—" The agent has to stop mid-word, listen, recalibrate, and resume. Most production voice agents do not handle this correctly. They either keep talking (because their TTS is still streaming), stop talking but lose context (because they treated the interruption as a new turn), or stop talking and apologize (because they were not designed to handle interruptions gracefully).
The fix is a barge-in handler in the orchestration layer:
# Pipecat barge-in handler
class SmartBargeIn(BaseBargeIn):
def __init__(self, vad, llm_context, tts):
self.vad = vad
self.llm_context = llm_context
self.tts = tts
async def on_user_speech_detected(self, frame):
# Stop the TTS immediately
await self.tts.interrupt()
# Mark the LLM context as interrupted
self.llm_context.mark_interrupted()
# Roll back the conversation state
self.llm_context.state_machine.rollback_to(
last_confirmed_turn
)
async def should_accept_barge_in(self, audio_energy):
# Only accept barge-in if the audio energy is
# above threshold and the user has been silent
# for at least 600ms (avoid false-positive interruption)
return (
audio_energy > 0.55 and
self.tts.speaking and
self.last_user_speech_ms > 600
)The STT model is trained on general conversational data. Your agent is talking about "metformin" and "lisinopril" and "RenalGuard insurance plan tier 3." The STT is going to hear "met foreman" and "listen a pill" and "Reagan guard." The error rate on domain-specific terms is 2-3x the baseline WER. The fix is custom vocabulary injection. Deepgram, AssemblyAI, and OpenAI all support it. You build a dictionary of 200-500 domain-specific terms. The STT model's vocabulary is augmented at runtime. WER on domain-specific terms drops from 18% to 3%.
The LLM is producing 180-token responses. The user is asking multi-step questions. The conversation is 12 turns deep. The LLM has lost context. The agent is repeating itself. The user is frustrated. The fix is a structured state machine on top of the LLM. The LLM is not the state machine. The state machine is the state machine. The LLM is the text generator within a state. Pipecat Flows, LiveKit Agents flows, and custom state machines are all options. The state machine holds the context. The LLM generates the response within the state.
The agent needs to fetch a customer record. The database query takes 600ms. The LLM budget was 380ms. The whole turn is now 1.4 seconds. The conversation breaks. The fix is to either pre-fetch the data (the agent should know the customer before the call starts), use a fast in-memory cache, or hide the latency by streaming the LLM's response in parallel with the tool call (the agent says "Let me check that for you" while the tool runs).
The LLM invents a function call that does not exist. The agent says "I see you have a transfer to the billing department" when there is no billing department. The fix is schema-constrained tool use. The LLM is given a strict JSON schema for the tool calls. The schema is validated before the tool runs. The LLM cannot invent tools. Output validation is the boring, unglamorous, production-critical part of voice agents.
Here is the honest comparison of the three production paths in 2026:
| Dimension | Hosted (Vocode Cloud, Retell, Air AI) | Self-Hosted (Pipecat + your own LLM) | Open Source Pure (Pipecat + vLLM + Deepgram + Cartesia) |
|---|---|---|---|
| Time to first call | 1 day | 1-2 weeks | 2-4 weeks |
| Cost per minute | $0.08-0.15 | $0.03-0.08 | $0.02-0.05 |
| Customization | Low | High | High |
| Barge-in handling | Handled | You build it | You build it |
| Latency p95 | 700-900ms (good) | 600-1000ms (you tune it) | 600-950ms (you tune it) |
| Vendor lock-in | High | Medium | Low |
| Compliance | Handled by vendor | You handle it | You handle it |
| Production maturity | Production-ready | Production-ready if you know what you are doing | Production-ready if you have a strong team |
The right answer for most teams in 2026: start with the hostedservice, get to production, then migrate to open source when the volume makes the cost difference material. The hosted services (Retell, Air AI, Vapi) have the barge-in handling, the state machine, the observability, and the production hardening already built. You do not want to build that. You want to build the agent logic. The infrastructure should be someone else's problem until your volume justifies owning it.
Once you are above 5,000 calls/day, the cost difference starts to compound. At 150,000 calls/day, the difference between hosted and self-hosted is $30,000/month vs $7,000/month. That is the moment to migrate.
Voice agents are the next agent surface. They are the first agent surface that has measurable customer experience wins (the pharmacy went from 30% pickup to 71% pickup), measurable cost wins (the pharmacy eliminated 4 full-time staff), and a clear production stack (Pipecat + Deepgram + DeepSeek V4-Flash + Cartesia Sonic). The chat agent stack is mature. The coding agent stack is mature. The voice agent stack is in the middle of its production maturity curve. The teams that ship in 2026 will have a 12-18 month lead on the teams that wait.
The architecture is not what the chat-agent ecosystem would suggest. It is not a large model with a long context. It is a four-model pipeline with brutal latency constraints, specialized models for each stage, and a state machine on top of the LLM. The optimizations are not in the LLM. They are in the orchestration layer. The latency budget is the design constraint. The latency budget is the reason the stack looks the way it does. The latency budget is the reason the small models win.
If you are building voice agents, do not bring your chat-agent stack to the call. The chat-agent stack is too slow, too expensive, and too brittle. The voice-agent stack is the four-model pipeline. Build it. Tune it. Ship it.
The pharmacy is processing 14,000 calls a day. Your competition is going to be next.
— Mr. Technology
Sources: