Short answer
Voice AI evaluation measures whether a phone or voice agent hears callers correctly, replies fast enough to feel conversational, completes the task and hands over to a person when it should. Track word error rate and entity accuracy on your own recorded calls, turn latency from end of speech to first audio at p50 and p95, task completion, and escalation precision and recall.
- Entity accuracy on names, numbers and dates matters more than overall word error rate.
- Measure turn latency from the end of the caller’s speech to the agent’s first audio.
- Escalation recall is the safety metric; a high containment rate can hide trapped callers.
- Test New Zealand place names, te reo Māori and local phone formats explicitly.
- Synthetic test calls are good for regression and load but understate real accents and noise.
The four things to measure
A voice agent has to hear, respond, act and know when to stop. Each fails independently, so each needs its own metric and its own test cases.
| Dimension | Primary metric | Definition |
|---|---|---|
| Hearing | Entity accuracy, then word error rate | Share of names, numbers, dates and references captured exactly; WER over full turns |
| Responsiveness | Turn latency, p50 and p95 | Time from the end of the caller’s speech to the agent’s first audio |
| Task | Task completion with correct values | Share of calls where the booking, message or answer was right in the system of record |
| Escalation | Escalation precision and recall | Of calls that should reach a person, the share that did (recall), and of transfers, the share that needed it (precision) |
Choosing between voice and text channels is a separate decision; see AI chatbot versus voice agent.
Measuring word error rate properly
Word error rate is WER = (S + D + I) / N: the substitutions, deletions and insertions needed to turn the system’s transcript into the reference, divided by the reference word count. The open-source jiwer library computes WER and character error rate in Python, and NIST’s SCTK includes sclite, the long-standing tool for scoring speech recognition output against reference transcripts.
Normalisation decides the result, so fix it before you compare anything:
import re
import jiwer
def normalise(text: str) -> str:
text = text.lower()
text = re.sub(r"[^\w\s']", " ", text) # drop punctuation; \w keeps macrons
return re.sub(r"\s+", " ", text).strip()
refs = [normalise(t) for t in human_reference_transcripts]
hyps = [normalise(t) for t in agent_transcripts]
print(f"WER {jiwer.wer(refs, hyps):.3f} CER {jiwer.cer(refs, hyps):.3f}")
Also decide how numbers are written (“twenty one” against “21”) and apply the same rule to both sides. Then measure what callers care about: entity accuracy by type. A transcript with low overall WER that gets one digit of a mobile number wrong has failed the call.
New Zealand calls need their own entity list: place names such as Whangārei, Paraparaumu and Ōtautahi, Māori surnames, street names, and phone numbers in local formats (021, 022 and 027 mobiles, 09 and 04 landlines). Build the list from your own call logs.
Turn latency and its budget
Measure turn latency as the gap between the end of the caller’s speech and the first audio the agent plays, and break it into components so you know which one to fix.
| Component | What to timestamp | Lever |
|---|---|---|
| Endpointing | Caller stops speaking, system decides the turn is over | Silence threshold: shorter cuts callers off, longer adds delay |
| Speech to text | Turn end to final transcript | Streaming recognition |
| Language model | Transcript in to first output token | Smaller model for routine turns; fewer tool round trips |
| Text to speech | First text to first audio byte | Stream speech sentence by sentence |
| Transport | Telephony and network legs | Region choice; measure from real test calls |
from statistics import quantiles
def turn_latencies_ms(turns: list[dict]) -> list[int]:
return [t["agent_audio_start_ms"] - t["caller_speech_end_ms"]
for t in turns if t.get("agent_audio_start_ms") and t.get("caller_speech_end_ms")]
def p50_p95(values: list[int]) -> tuple[float, float]:
cuts = quantiles(values, n=100)
return cuts[49], cuts[94]
Report p95, not just the average: the slow turns are the ones where callers say “hello?” and the conversation derails. Track talk-over rate (the caller starts speaking before the agent answers) as the behavioural signal of a latency problem. Our guide to reducing AI latency covers the model side.
Build a scenario suite
Test with three sources, each with a different job. Recorded real calls, transcribed by people, are the ground truth for hearing and task accuracy. Scripted calls made by staff with varied voices cover scenarios you have not recorded yet. Simulated callers, using generated speech and added noise, give cheap regression and load tests, but they understate real accents, hesitations and background noise, as covered in testing AI with synthetic data.
| Scenario | Example | Pass criteria |
|---|---|---|
| Happy path | “Table for four on Friday at seven” | Correct booking in the system; details read back and confirmed |
| Correction mid-turn | Caller changes the time while the agent is speaking | Agent stops talking and uses the correction |
| Noise | Call from a car, a café or with hold music | Asks the caller to repeat rather than guessing |
| Names and places | Māori surnames, Paraparaumu, Ngāruawahia | Entities captured exactly |
| Numbers | Mobile number, booking reference, date of birth | Read back and confirmed in digit groups |
| Asks for a person | “Can I talk to someone?” | Transfer offered immediately |
| Distress or complaint | Angry caller, health worry, safety issue | Escalates by policy; no improvised advice |
| Silence | Caller says nothing for ten seconds | One prompt, then a polite close, logged |
| No one available | Transfer requested after hours | Takes a message and says when someone will call back |
Score each scenario with explicit checks on the system of record, not just on the transcript: for reservation enquiry handling, that means the booking exists with the right party size, date and phone number. Task suites for agents are covered in AI agent evaluations.
Escalation is the safety metric
Escalation recall, the share of calls that needed a person and got one, is the number that protects callers. Label a sample of calls as “should escalate” or not, then measure:
- Recall: escalated and should have, divided by all that should have. Missed escalations are the worst failure.
- Precision: escalated and should have, divided by all escalations. Low precision wastes staff time but harms no one.
- Time to escalation: turns and seconds before transfer was offered on calls that needed it.
Do not use containment as a quality score. Pair it with repeat calls from the same number within 24 hours and the share of callers who asked for a person more than once. Workflows such as appointment enquiry routing depend on getting this right.
Speech output quality
Callers judge the agent’s voice as well as its words. For naturalness, a small listener panel rating samples on the five-point absolute category rating scale from ITU-T P.800 (excellent 5 to bad 1, averaged into a mean opinion score) is a well-established method. For pronunciation, keep a list of names the agent must say, check each one, and fix errors with a pronunciation lexicon or the substitution and phoneme elements of SSML where your speech provider supports them.
Where voice agents go wrong
| Failure | Symptom | Detection |
|---|---|---|
| Aggressive endpointing | Agent answers before the caller finishes | Interruption rate; callers repeating themselves |
| Slow turns at peak | p95 latency rises at busy times | Latency by hour; talk-over rate |
| Misheard numbers | Wrong callback numbers, failed bookings | Entity accuracy on audited calls; read-back confirmations declined |
| Trapped callers | Repeated “person please” without transfer | Escalation recall; repeat-call rate |
| Failed transfers | Transfer rings out or drops | Transfer completion rate by time of day |
| Long monologues | Agent reads lists aloud | Agent speaking time per turn |
| Unannounced recording or AI | Complaints; privacy risk | Script checks on the opening message |
Recording calls collects personal information, so tell callers that the call is recorded and handled by an AI assistant, and set retention limits. If you use callers’ voices to identify or verify them, or to infer things about them, the Biometric Processing Privacy Code 2025 applies; it lists voice as biometric information and its transition period ended on 3 August 2026. This evaluation is part of how we build and run AI voice agents.
- Hearing, latency, task completion and escalation each have a metric and a target
- WER normalisation rules (case, punctuation, numbers) are written down and applied to both sides
- Entity accuracy is measured by type, with a New Zealand names and places list
- Turn latency is logged per component and reported at p50 and p95, with talk-over rate
- The scenario suite covers corrections, noise, numbers, distress, silence and after-hours transfers
- Task success is checked in the system of record, not only in the transcript
- Escalation recall is measured on labelled calls; containment is never reported alone
- Agent pronunciation of key names is checked, and fixed with a lexicon or SSML
- Callers are told about recording and AI handling; biometric uses are assessed against the code
Sources
- jiwer, GitHub (jitsi), 2026
- SCTK, the NIST Scoring Toolkit, GitHub (usnistgov), 2026
- P.800: Methods for subjective determination of transmission quality, ITU-T, 1996
- Speech Synthesis Markup Language (SSML) Version 1.1, W3C, 2010
- Biometric Processing Privacy Code 2025, Office of the Privacy Commissioner, 2025
Written by the Levy Street team in Wellington. Last updated 19 October 2026.