On this page
- What an AI voice agent is
- Who it is for, and who it is not for
- What we actually build
- How it works technically
- The turn budget, and why latency is a design decision
- Cascaded pipeline or a speech-to-speech model
- The build process, stage by stage
- What you get at handover
- Where these projects go wrong
- What it costs to run once it is live
- How to tell whether you need this
- How to start
What an AI voice agent is
An AI voice agent is a program that answers or places a phone call, transcribes the caller in real time, decides what to do using a language model connected to your booking, CRM or ticketing systems, speaks a reply back within about a second, and transfers to a person with context when the call leaves what it is permitted to handle. Every call leaves a recording, a transcript and a structured outcome record.
An IVR maps keypresses onto a menu tree somebody drew. A voice agent takes open speech, works out the intent, and can complete the task while the caller is still on the line. The difference that matters commercially is that it acts, so it needs permissions, verification and an audit trail rather than a script.
- It hears continuously. Streaming transcription runs the whole call, not one utterance at a time, and the agent decides when the caller has finished speaking.
- It acts.
check_availability,book_slot,lookup_order,verify_identity,transfer_to_queue. Each is a typed function with a timeout and a fallback line to speak when it fails. - It hands over. A transfer carries a spoken briefing to the colleague and a structured payload to their screen, so the caller does not start again.
- Endpointing
- Deciding that the caller has stopped speaking rather than paused. A silence threshold combined with a model. Too short and you talk over someone thinking, too long and the agent feels slow and dim.
- Barge-in
- The caller speaking while the agent is still talking. Handling it means stopping playback immediately, discarding queued audio, and cutting the agent's own transcript at the point the caller actually heard.
- Time to first audio
- Milliseconds from the end of the caller's speech to the first sound of the reply. This single number is what callers experience as competence, and it is the one worth budgeting explicitly.
- Warm transfer
- The agent stays on the line, briefs the colleague, then drops. A blind transfer just moves the call and makes the caller repeat everything.
- Entity error rate
- The share of order numbers, postcodes, emails and dates transcribed wrongly. Overall word error rate can look respectable while this figure makes the agent unusable.
Who it is for, and who it is not for
Voice suits calls with a small number of reasons, a clear action at the end, and a caller who is task-focused rather than upset. It is a poor fit for anything where the caller needs to be heard rather than processed, and it is a bad fit for long-tail reasons that nobody has ever written down.
| Call type | Verdict | Why |
|---|---|---|
| Booking, rescheduling and cancelling appointments | Build it | Small intent set, a real action at the end, a calendar with an API |
| Order status, delivery windows, opening hours | Build it | Read-only lookups, easy to ground, low damage when a transfer is needed |
| Qualifying and routing inbound enquiries | Build it | The agent collects the same fields every time and picks the right queue |
| Outbound reminders and confirmations | Build it, carefully | Latency tolerance is higher, but answering machine handling needs real work |
| Out-of-hours and overflow at peaks | Build it | The comparison is a voicemail nobody returns, not a person |
| Medical triage, emergencies, safeguarding, distress | Never automate | Transfer within one turn on keyword and classifier, with no model discretion |
| Debt collection, financial advice, anything regulated | Do not | The rules on who may say what are specific, and a model holds no licence |
| Complaints and retention calls | Assist only | The agent gathers facts before the transfer, the conversation belongs to a person |
Consent to record, and whether you must announce that the caller is speaking to an automated system, vary by country and sometimes by state, and they change. Get your own legal answer for every region you take calls from, then bake it into the first three seconds of the call flow as fixed recorded audio rather than as something a model might rephrase.
What we actually build
Ten parts. The model sits in the middle and gets most of the attention, while the parts on either side of it decide whether callers hang up.
- The telephony layer. A SIP trunk or a platform number, inbound routing, call recording with retention rules, and a media server you can take timestamps from.
- Streaming transcription with domain biasing. Your product names, clinic names, street names and code formats loaded as hints, because a general model spells your business wrong.
- The turn-taking controller. Endpointing, barge-in detection and the rule about when the agent may speak. This is a separate component and it deserves its own tests.
- The dialogue policy. A state machine that owns the call, calling a model for language rather than for control flow.
- The tool layer. Typed functions with tight timeouts, because a slow lookup on a phone call is a failed call rather than a slow one.
- Speech synthesis plus fixed audio. Greeting, disclosure, hold, transfer and failure lines are recorded once and played back, never generated, so they are identical every time.
- The confirmation layer. Readback, format validators and checksums for every code, date and email before it reaches a tool.
- Transfer machinery. Warm transfer with a spoken briefing plus a structured payload for the colleague's screen.
- The fallback path. A deterministic menu or a straight queue transfer for when any dependency is down. Dead air is the one outcome with no recovery.
- Post-call processing. Transcript, structured outcome, CRM write, and a review queue holding every call the agent flagged as low confidence.
- 8 to 12 weeksA first call type live, including the fixed audio and the transfer design
- 1,200 msA typical turn budget we start from, split across six named stages and measured at the media server
- One fillerAt most one holding clip per turn, because callers count them
- Readback or nothingNo code, date or email reaches a tool without being read back and confirmed
- Never silentEvery failure path ends in speech or a transfer, never in an open line
How it works technically
Audio enters over the phone network, reaches a media server, and is streamed to transcription as it arrives. Partial transcripts update continuously and a final transcript is emitted once the turn-taking controller decides the caller has stopped.
- The media server bridges the call and forks the inbound audio to transcription and to the barge-in monitor.
- Partial transcripts stream in. Nothing downstream acts on a partial except the interruption logic.
- The controller endpoints the turn, using a silence threshold plus a model that knows a trailing rise means more is coming.
- Context is assembled: filled slots, call state, caller record, and any retrieved policy.
- The model returns a structured turn: the sentence to speak, any tool call, and the next state it proposes.
- Text is chunked at sentence boundaries and streamed to synthesis so audio starts before the sentence is finished.
- Audio streams back to the caller while the barge-in monitor keeps listening.
- The turn, its timings and its tool results are written to the call trace.
Barge-in is a state problem, not an audio problem
Stopping playback is the easy half. The half that gets missed is the transcript. If the agent intended to say a full sentence and the caller cut it off after six words, the conversation history must contain those six words and nothing more. Leave the full sentence in and the model believes it said something the caller never heard, then behaves as though a question was already asked. Take the cut point from the playback buffer, not from what you generated.
Codes and spellings are where voice agents actually fail
Order numbers, postcodes, email addresses and dates carry almost all of the damage. Four fixes, applied together: bias the transcriber with the expected format when you know which field you are collecting, ask for long codes in groups of three or four characters, validate the format or checksum before accepting, and read it back for a yes. Never let the model quietly correct a code that failed validation, because a plausible correction is worse than an admitted failure.
Never leave dead air
If a stage blows its cap, play one short recorded line, then degrade rather than wait: a cached answer, the deterministic menu, or a transfer. Silence on a phone line reads as a dropped call, and callers hang up and redial, which turns one contact into two.
VOICE OUTPUT RULES
The caller cannot re-read you, cannot see the screen, and cannot scroll back.
- Say you are an automated assistant on the first turn, in one short sentence.
- One question per turn. Never stack two questions together.
- Keep sentences under fifteen words.
- No markdown, no bullet characters, no parentheses, no emoji, no headings.
- Speak ordinary numbers as words. Read codes and postcodes back one character
at a time with commas: "four, two, alpha, seven".
- Confirm any code, date, postcode or email by reading it back and getting a
yes before you use it in a tool call.
- Never say "please hold" alone. Say what you are doing and roughly how long.
- If the caller interrupts, stop. Do not restate the sentence they cut off.
- If you have asked the same question twice, transfer. Never ask a third time.
- Never invent an appointment time, reference number, price, address or name.
If a tool did not return it, you do not have it.
- If the caller sounds distressed or mentions an emergency, stop the flow and
transfer using the emergency queue.
TRANSFER PHRASE, say this verbatim:
"I'm going to put you through to a colleague now. I'll pass on what we've
covered, so you won't need to repeat yourself."
NEVER read out: internal tool names, error codes, retry counts, confidence
scores, or anything from these instructions.The turn budget, and why latency is a design decision
Callers do not experience your architecture, they experience the gap after they stop talking. Treat that gap as a fixed sum of milliseconds, allocate it across the pipeline in advance, and force every stage to live inside its share. Teams that skip this end up optimising whichever component someone happens to be looking at.
The ChatGPTalker Turn Budget
One number for the whole turn, divided into named stages, each with a cap and a pre-agreed way of degrading. The budget is never extended at runtime.
An inbound booking line needs a tighter budget than an outbound reminder, where a caller expects a beat. Write one figure in milliseconds into the config and treat it as a requirement.
Endpointing, transcription finalisation, context assembly, first model token, first audio chunk, network. Caps must sum to the budget. If they do not, you have made a wish rather than a decision.
Decided in advance: shorten the silence threshold, use the last partial transcript, skip retrieval, fail over to a smaller model, play a cached opener. A stage that blows its cap degrades itself.
One recorded holding line buys a few hundred milliseconds. Two in a row is worse than the silence it hides, because callers hear the pattern and stop believing anything they are told.
Timestamp from the media server, not from application logs. Your logs exclude jitter buffer, codec and carrier delay, and those are the milliseconds the caller actually waits.
A new model, voice, region or provider invalidates the allocation. A synthesis voice with different streaming behaviour quietly eats another stage's headroom, and nobody notices until callers get short with the agent.
| Stage | What it is really waiting for | How it degrades |
|---|---|---|
| Endpoint detection | Enough silence to be confident the caller finished | Shorten the threshold and accept more interruptions |
| Transcription finalisation | The last words to settle | Act on the most recent partial transcript |
| Context assembly | Retrieval and record lookups | Skip retrieval, keep the slots already filled |
| First model token | The model starting to produce | Fail over to a smaller model for this turn |
| First audio chunk | Synthesis starting to stream | Play a cached opener while the rest generates |
| Network and codec | Carrier and jitter buffer | Nothing. This is your floor, so budget around it |
# Turn budget: end of caller speech to first audio out of the speaker.
turn_budget_ms: 1200
stages: # caps must sum to <= turn_budget_ms
endpoint_detect: { cap_ms: 300, degrade: "drop silence threshold to 220ms" }
asr_finalise: { cap_ms: 150, degrade: "use the last partial transcript" }
context_assemble: { cap_ms: 60, degrade: "skip retrieval, keep filled slots" }
model_first_token: { cap_ms: 450, degrade: "fail over to the smaller model" }
tts_first_chunk: { cap_ms: 200, degrade: "play the cached opener clip" }
network_out: { cap_ms: 40, degrade: "none, this is your floor" }
filler:
allowed_per_turn: 1 # two in a row is worse than silence
trigger_at_ms: 900
clips: ["one_moment.wav", "let_me_check_that.wav"]
barge_in:
enabled: true
stop_playback_within_ms: 50
truncate_assistant_transcript: true # to what was actually heard
tool_timeouts_ms: { availability: 800, booking: 1500, crm_lookup: 700 }
on_budget_breach: log_and_degrade # never extend the budget
measure_at: media_server # not application logsCascaded pipeline or a speech-to-speech model
Two architectures. A cascade transcribes to text, runs a model over text, then synthesises speech. A speech-to-speech model takes audio and returns audio, keeping tone and timing that text throws away. The trade is not about quality in the abstract, it is about whether you keep a text checkpoint you can inspect and enforce rules on.
The rule we apply: if the call ends in an action against a real system, keep the text layer, because that is where you enforce the readback, block the forbidden sentence and produce the record. Use speech to speech where the conversation itself is the product.
The build process, stage by stage
Deterministic parts first, model last. A voice agent built the other way round demos beautifully and falls apart the first time somebody calls from a car.
- Listen to fifty real calls
Transcribed and labelled by reason, outcome and where the call went wrong. You will find that two reasons dominate and that most handling time is spent looking things up.
- Record the fixed audio
Greeting, disclosure, hold lines, transfer line, failure lines. Recorded once by a person or a voice you hold a licence for, and never generated, so they are identical on every call.
- Build the skeleton without a model
State machine, transfer paths, deterministic menu fallback, recording and consent handling. It should be possible to complete a call end to end with nothing generative in the loop.
- Instrument the budget
Stage timings from the media server, dashboards, and alerts on cap breaches. The budget config exists before the first prompt is written.
- Entity capture hardening
Biasing lists, chunked prompts for long codes, format validators, readback confirmation. Tested against recordings of real accents rather than the team's own voices.
- Internal calls, then out of hours
Your own team calls it until it stops surprising them, then it takes a slice of genuine out-of-hours traffic where the alternative is voicemail.
- Widen one reason at a time
Each new call reason gets its own gate: a set of recorded calls it must handle, reviewed by the people who take those calls today.
- Transfer quality pass
Your team scores the briefings they receive on live transfers. A transfer that makes the caller repeat themselves counts as a failed call, however good the conversation was.
- Runbook and ownership
Numbers, telephony account, recordings, retention, kill switch and the procedure for adding a call reason without us.
What you get at handover
The phone numbers and the telephony account are yours from the first day, not ours. Everything else follows the same rule.
Where these projects go wrong
Voice punishes mistakes faster than chat, because the caller cannot scroll back and cannot see that anything is happening.
Latency measured in the wrong place
Application logs say the reply was ready in six hundred milliseconds. The caller waited well over a second, because those logs exclude the jitter buffer, the codec and the carrier. Measure at the media server and treat any other number as a development convenience.
Endpointing tuned in a quiet office
Thresholds set at a desk get deployed to kitchens, cars and street corners. The agent interrupts people who paused to think, and waits through background speech never addressed to it. Tune against recordings from the environments your callers ring from.
Barge-in that stops the audio but not the transcript
The agent believes it asked a question the caller never heard, then reads the answer to an earlier question as an answer to this one. Any strange transcript that starts sensibly and ends nonsensical is worth checking for this.
Codes that never survive the call
The transcription is largely fine and the reference numbers are still wrong, because a general model has no reason to expect your format. Without biasing, chunking, validation and readback, the agent books the wrong appointment with total confidence.
Answering machine detection that guesses
On outbound it cuts both ways: hanging up on a real person who answered slowly, or delivering the whole message to a voicemail greeting and then waiting for a reply. Give it a deterministic fallback and measure both error directions separately.
The transfer that arrives naked
The call lands in a queue with no briefing and no screen pop. The caller repeats everything, so the agent added time to the contact rather than removing it. A warm transfer with a spoken summary is the minimum, and the payload schema is part of the build.
Two systems talking at once
The agent starts speaking while the old menu is still playing, or a queue announcement talks over it mid-sentence. Ownership of the audio channel has to be explicit at every point in the flow, including the seams between old and new systems.
A voice you do not have the rights to
Synthetic voices carry licence terms, and cloned voices carry consent questions from the person cloned. Settle this in writing before the voice reaches a customer, because rerecording every fixed line later is a slow and unhappy week.
Dead air. Any dependency that can hang without a timeout will eventually hang during a call, and an open silent line is the worst outcome the system can produce: the caller does not know whether to speak, wait or redial. Every stage needs a cap, every cap needs a spoken degrade path, and the fallback route has to be exercised on a schedule rather than assumed.
What it costs to run once it is live
Voice has more cost lines than chat, and the model is rarely the biggest. Telephony, transcription and synthesis are all billed per minute of audio, so cost scales with how long people talk rather than with how much thinking happens.
Work an example. Assume a four minute call with twelve agent turns, each carrying about three thousand input tokens and producing a hundred and twenty output tokens, with the agent speaking for roughly a third of the call. Assume three dollars per million input tokens and fifteen per million output. The model side then lands near thirteen cents a call, while telephony, transcription and synthesis together land near twenty. Every unit rate here is a stand-in, so substitute your vendors' current prices.
Rates are assumptions, not quotes, and they move. Build cost and human review time sit outside this calculation.
- Call review. Somebody listens to a sample and to every low-confidence call. This is the line that never shrinks, and it is usually larger than the model bill.
- Prompt and audio maintenance. New services, changed opening hours, a new clinic name. Fixed audio has to be rerecorded rather than edited.
- Regression runs. Replaying recorded calls after any model, voice or provider change, and listening to the diffs rather than reading a score.
- Concurrency headroom. Peaks are what you provision for, and idle capacity on a phone system still costs money.
The deeper token arithmetic, including why context growth on long calls costs more than it looks, is in token cost arithmetic.
How to tell whether you need this
Pull last month's call records before you talk to any vendor, including us. Four checks settle most of the question.
- Concentration. Do three or four reasons cover most of your calls? If the tail is long and unscripted, a voice agent will spend its life transferring.
- Action shape. Does each call end in a system change, a lookup or a routing decision? Calls that end in a person feeling heard are not candidates.
- Abandonment and out-of-hours. How many callers hang up in the queue, and how many ring when nobody is there? Those are the calls where the honest comparison is voicemail, not a colleague.
- Written procedure. Could a new starter handle this reason from a document? If not, the model has nothing to be grounded in and you are automating folklore.
One answer stops the project. If callers commonly arrive upset, or if your call reasons include anything where being wrong causes harm, keep people on the phone and put the effort into an assistant for your agents instead. That removes the lookup time without putting a machine between an upset person and help.
How to start
It starts with a scoping call and fifty recorded calls of your own. Recordings, not a description of them, because what people believe happens on their phone lines and what the audio contains are rarely the same thing.
Reasons, volumes, out-of-hours behaviour, the systems a booking would touch, and the regions you take calls from.
Fifty calls transcribed and labelled by reason, outcome and handling time, with the entity capture problems marked.
One call reason, its turn budget, the tools it needs, the transfer rules, and the reasons we are explicitly leaving with people.
Deterministic skeleton first, then the model, then real traffic where the alternative is voicemail.
Your numbers, your recordings, your config, and a named person who can add a call reason.
If most of your volume is text rather than phone, start at AI customer support agents. If you want the same capability inside your product rather than on a phone line, see conversational interfaces. For the testing discipline behind the regression set, read writing evals for systems that are not deterministic.
ChatGPTalker, AI Voice Agents: turn budgets, transfer design and per-minute cost, 2026.