How to Measure AI Voice Agent Latency in Amazon Connect, Turn by Turn
Average response time hides the pauses callers hate. This guide shows which latency data Amazon Connect, Lex and Bedrock already give you, what they leave out, and how to build a turn-by-turn report.
By Naeem Akhtar · 12 min read
In short
- Callers feel the gap between the end of their sentence and the first word of the reply. Measure that per turn, not as one average per call.
- Lex, Bedrock and Connect each report part of the delay, but we found no single AWS turn-latency metric. You assemble it from logs and metrics.
- Report p50 and p95 per stage and per turn number. A slow tail on turn three is invisible in an average.
- Turn on Lex conversation logs before launch. They hold timestamps, silence, barge-in and transcripts, and cannot be recovered afterwards.
What latency means on a phone call
On a call, latency is not how long a request takes. It is the silence the caller hears between finishing a sentence and hearing the first word of the answer. People notice that gap quickly. Research on conversation across ten languages (Stivers and colleagues, 2009) found the typical gap between speakers is only around 200 milliseconds, so anything the caller perceives as a pause is long by human standards. You do not need to hit that number, since callers know they are talking to a system, but it explains why a two-second pause feels like something went wrong.
A single average hides most of the problem. A call can average 1.2 seconds per turn and still contain one eight-second silence that makes the caller hang up. That is why this guide is about a turn-by-turn view: one row per caller turn, with the delay split into the stages that cause it.
We checked the AWS documentation referred to below on 10 November 2026. Metric names and log fields change, so verify them against your own account before building dashboards. If you are still building the agent, start with How to Add an AI Voice Agent to Amazon Connect.
Where the time goes in one turn
Each turn passes through the same stages. Knowing them lets you assign a number, and an owner, to each part of the pause.
| Stage | What happens | What controls it | Where you can see it |
|---|---|---|---|
| End-of-turn detection | The system decides the caller has finished speaking | Speech settings: end-of-turn confidence and silence timeout | Lex conversation logs (audio silence), flow and bot settings |
| Speech recognition | Audio becomes text | Speech model, language, audio quality | Lex logs: transcript, confidence, input mode |
| Reasoning | The model or intent logic picks the reply | Model, prompt length, tokens produced | Bedrock InvocationLatency, TimeToFirstToken, token counts |
| Tool calls | Lookups and actions in your systems | Your APIs, Lambda, network | Lambda duration, your own API timings, Lex Lambda metrics |
| Speech synthesis | Text becomes audio | Voice provider and voice | Lex Polly error metric, call recording |
| Telephony | Audio travels to and from the caller | Carrier, region, mobile network | Call recording compared with logs |
One setting is a hidden floor under every turn. AWS documents default speech settings for the advanced speech model of a 0.7 end-of-turn confidence threshold and a 640 millisecond silence timeout, adjustable between 500 and 10,000 milliseconds. The silence timeout is time the system waits to be sure you have finished, so lowering it shortens every turn but raises the risk of cutting callers off. Measure before and after you change it.
What AWS already measures for you
| Source | What it gives you | Good for |
|---|---|---|
| Lex runtime metrics in CloudWatch (AWS/Lex) | RuntimeSucessfulRequestLatency in milliseconds, RuntimeRequestCount, RuntimeRequestLength for streaming conversations, throttling and error counts, split by operation, input mode and locale | Spotting a slow or throttled bot across all calls |
| Lex conversation logs | Per-utterance timestamp, request ID, transcript and confidence, whether the caller interrupted, audio total, voice and silence durations, and why each response was produced | Rebuilding what happened on a specific call, turn by turn |
| Amazon Bedrock runtime metrics (AWS/Bedrock) | InvocationLatency to the last token, TimeToFirstToken for streaming calls, input and output token counts, throttles and errors, by model | Separating model time from everything else |
| Connect bot metrics | Average bot conversation time, average turns, completed conversations and outcomes: success, failed or dropped | Outcome and length trends, not pauses |
| Connect conversational analytics | Talk time and non-talk time, sentiment and transcripts for self-service calls | Finding calls where customers went quiet or got frustrated |
Two notes from the documentation matter in practice. The Lex runtime latency metric is spelled RuntimeSucessfulRequestLatency, with that spelling, and AWS calls this out. And the Connect Bot Analytics page only shows conversations triggered from flows, not bots invoked directly through Lex APIs.
What AWS does not give you in one place
We did not find a single AWS metric that reports 'time from the caller stopping to the agent speaking' for an Amazon Connect call, and none that splits it into the stages above for agentic self-service. The pieces exist in different places, with different clocks. That is not a flaw in your setup. It simply means the turn-by-turn view is something you build, and the rest of this guide shows how.
If AWS has added such a metric since our check, use it, but still keep the per-stage numbers, because the stages are where you find the fix.
Step 1: Turn on logging before launch
Conversation logs are configured per bot alias, and they only record conversations that happen after you enable them. You cannot reconstruct last week's calls later, so switch them on in the test environment and keep them on in production.
- Open the bot alias you route calls to and enable text logs, which store transcripts and metadata in CloudWatch Logs.
- Enable audio logs as well if you are allowed to store caller audio. They go to Amazon S3, and the log entry records the audio duration, how much of it was speech and how much was silence.
- Encrypt both with a customer-managed KMS key.
- Use Lex's option to obscure slot values so names, numbers and dates do not sit in plain text in the logs.
- Set a retention period for the log group that matches your data policy.
Logs hold personal data. AWS notes that conversation logs cannot be used with bots subject to COPPA, and you should treat the rest as you would any call recording: restrict access, redact where you can, and delete on schedule. See Logging conversations with conversation logs.
Step 2: Chart the Lex and Bedrock metrics
Start with a dashboard of the aggregate metrics, because it tells you whether a problem is everywhere or only in some calls.
- Lex: RuntimeSucessfulRequestLatency at p50 and p95, RuntimeRequestCount, RuntimeThrottledEvents, RuntimeLambdaErrors and RuntimePollyErrors, split by InputMode so speech is separate from text.
- Bedrock: InvocationLatency and TimeToFirstToken at p50 and p95 for the model you use, plus OutputTokenCount and InvocationThrottles. Long answers take longer, so compare latency against output tokens, which AWS also documents a way to do.
- Lambda or your tool APIs: duration at p95 for each function the agent calls.
- Connect: average bot conversation time and turns, filtered by outcome, to see whether slow calls end badly.
For voice, TimeToFirstToken is usually more informative than InvocationLatency, because speech can start once the first words arrive. That only holds if your design streams the reply to the voice layer. Check how your own architecture uses the model before reading too much into either number.
Step 3: Build the per-turn report
The report is one row per caller turn. Take the Lex conversation log as the spine, because it gives each turn an ID and a timestamp, then attach the other timings to it by session and time.
| Column | Where it comes from |
|---|---|
| Session ID, turn number, request ID | Lex conversation log |
| Turn start time | Log timestamp |
| Caller audio total, speech and silence seconds | Log audio properties (needs audio logs) |
| Barge-in (caller interrupted the agent) | Log barge-in field |
| Response reason | Log response reason: for example a timeout prompt or a fulfilment-progress message |
| Transcript and confidence | Log input transcript and transcription confidence |
| Model time and first-token time | Bedrock metrics or your own application logging for the same request |
| Tool time per call | Lambda or API logs, joined on session or request ID |
| Total turn gap | Measured from the call recording, or from your own timestamps |
A starting point in CloudWatch Logs Insights, against the Lex text log group for your alias, is a query that lists each turn in order with its audio and barge-in fields. Field names depend on how your log group is parsed, so treat this as a sketch to adapt.
fields @timestamp, sessionId, requestId, inputMode, inputTranscript,
audioProperties.duration.total, audioProperties.duration.silence,
bargeIn, responseReason, missedUtterance
| filter inputMode = "Speech"
| sort sessionId, @timestamp asc
| limit 500The one number the logs do not hand you is the real gap the caller heard. The most reliable way to get it is from the call recording: find where the caller's speech ends and the agent's begins, either by listening on a test set or with a small script that detects speech boundaries in the two channels. If you control the application layer, you can also log your own timestamps at three points, when the transcript arrives, when the model starts to answer, and when audio is handed to the voice layer. Either route works. What matters is using one method consistently, so before and after numbers compare fairly.
Step 4: Report percentiles, by stage and by turn number
- Report p50, p90 and p95, not the mean. The mean hides the pauses that make people hang up.
- Split by turn number. The first turn often carries extra work such as identity lookup or a greeting, and later turns can slow down as the conversation history grows.
- Split by whether a tool was called. Turns with tool calls will be slower, and that is the cost your tool design controls.
- Split by voice option and by channel. A mobile caller in a noisy place and a landline caller will not see the same numbers.
- Show the worst ten turns each week with their transcripts. Reading them tells you more than any chart.
A short weekly table is usually enough: turns measured, p50 and p95 gap overall, p95 per stage, share of turns with barge-in, and share of calls that ended with a transfer or a drop. Keep the same layout from week to week so the trend is obvious.
What a finished report looks like
Here is a layout for one call, with invented numbers to show the shape. The point is the pattern a report makes visible, not the values.
| Turn | Caller said | Tool called | Gap heard (s) | Model first token (s) | Tool time (s) | Barge-in |
|---|---|---|---|---|---|---|
| 1 | Greeting and reason for calling | No | 1.1 | 0.5 | 0 | No |
| 2 | Name and date of birth | No | 1.0 | 0.4 | 0 | No |
| 3 | Asks to move an appointment | Yes: look up booking | 3.4 | 0.6 | 2.1 | No |
| 4 | Confirms Thursday afternoon | Yes: change booking | 2.8 | 0.5 | 1.6 | Yes |
| 5 | Thanks, goodbye | No | 0.9 | 0.4 | 0 | No |
Read it the way you would at review. The model is steady at about half a second, so it is not the problem. Turns 3 and 4 are slow, and the tool time explains most of the gap. The barge-in on turn 4 suggests the caller started talking because the wait felt too long. The fix is in the booking lookup, not the model or the voice. Without a per-turn view, the call would simply have averaged to about two seconds and nobody would know why it felt slow.
Add one more column once you have it: the transcript confidence. A turn that is slow and also low confidence often means the system waited for the caller to repeat themselves, which is a recognition problem wearing a latency costume.
Alarms: catch it before callers do
Once the metrics exist, put alarms on the ones that change first. CloudWatch alarms can watch the Lex and Bedrock metrics directly.
| Watch this | Alarm when | Why |
|---|---|---|
| Lex request latency, p95 | It rises above your baseline for several periods in a row | Early sign of a slow tool, a throttled model or a regional issue |
| Lex throttled events | Above zero for a sustained period | You are exceeding the account limit and callers are paying for it |
| Bedrock TimeToFirstToken, p95 | Above your baseline | The model, not the rest of the system, got slower |
| Bedrock throttles | Above zero | Capacity or quota problem; the SDK may be retrying, which adds delay |
| Lambda duration, p95, per tool | Above your tool budget | One backend is dragging every call that uses it |
| Lambda and Polly error counts | Any sustained increase | Errors often show up as long pauses before a fallback |
Choose thresholds from your own week-one baseline, not from a number in a blog post. An alarm that fires all day gets muted, and then it protects nobody. Start loose, tighten as you learn what normal looks like, and send alerts to the person who can actually change the tool or the prompt.
Reading the results: symptom, cause, fix
| What you see | Likely cause | What to try |
|---|---|---|
| Every turn has a similar delay before anything happens | End-of-turn silence timeout | Review the silence timeout and end-of-turn confidence settings, and re-test for cut-offs |
| Slow only on turns with a lookup | Tool or API time | Cache, trim the response, or return quickly and finish in the background. MCP tools time out at 30 seconds |
| First-token time high, tools fast | Model or prompt size | Shorten the prompt and tool descriptions, or try a faster model, and compare on your call set |
| Latency rises with answer length | Long spoken replies | Tell the model to answer in one or two sentences for voice |
| Spikes at busy times | Throttling | Check Bedrock and Lex throttle metrics and your quotas |
| Callers repeat themselves or interrupt a lot | Pauses feel like failure, or reply is too long | Look at barge-in rate and transcripts together |
| Fine in tests, slow in production | Carrier, region or load | Compare Regions and test from the networks callers actually use |
Change one thing at a time and re-run the same call set. If you change the model and the prompt together you will not know which one moved the number.
Setting targets and running a fair test
We do not quote a universal target, because the right gap depends on the task and the caller. A simple intake call tolerates a little more than a quick yes or no. What we do recommend is deciding your own thresholds from listening. Record a test set of realistic calls, play them to people who were not involved in the build, and ask at which point a pause feels wrong. Use that to set a p95 target, then track against it.
- Write a script of 15 to 20 caller turns that includes names, numbers, a correction and one question that needs a lookup.
- Call from a mobile phone, at least twice at different times of day, and once from a noisy place.
- Run the script a few dozen times so p95 means something. A handful of calls cannot show a tail.
- Keep the script, the voice, the model and the prompt fixed while you change only the setting under test.
- Record every call, and keep the logs, so you can go back to a bad turn.
For the architecture choices that move these numbers, see our architecture and build guide, the voice options guide, and Amazon Lex vs AI Agent in Amazon Connect. To have latency measured and tuned on your own call flow, see our AI voice agent development service.
A pre-launch latency checklist
- Conversation logs are on for the live alias, with a customer-managed key, slot obscuring and a retention period.
- A dashboard shows Lex, Bedrock and tool latency at p50 and p95, with speech separated from text.
- You know your silence timeout and end-of-turn settings, and have tested one change in each direction.
- Every tool has a time budget, and the slowest one has been reviewed for caching or an asynchronous path.
- The prompt tells the model to keep spoken answers short.
- You have a recorded test set and a baseline p95 gap from it.
- Alarms exist for throttling and for p95 drift, and someone owns them.
- A failed or slow tool leads to a spoken holding message or a transfer to a person, never to silence.
If you can tick every line before launch, the first week of real calls will teach you something. If you cannot, the first week will teach you only that callers hang up.
Frequently asked questions
What is a good latency for an AI voice agent?
There is no single standard. Human conversation has gaps of about 200 milliseconds, but callers accept longer from a system, especially for a task that needs a lookup. Set your own p95 target by playing recorded calls to people who were not involved in the build and noting where the pause starts to feel wrong, then measure against it every week.
Does Amazon Connect report voice agent response time?
Connect reports bot conversation time, turns and outcomes, and conversational analytics reports talk and non-talk time. Amazon Lex reports request latency in CloudWatch and Amazon Bedrock reports model latency and time to first token. We did not find one AWS metric for the gap the caller hears, so you combine logs, metrics and the call recording.
Which Amazon Lex metric shows latency?
RuntimeSucessfulRequestLatency in the AWS/Lex CloudWatch namespace, which reports the time between a request being made and the response being passed back, in milliseconds. AWS notes the metric name is spelled with that spelling. Use InputMode to separate speech from text, and chart percentiles rather than averages.
Should I use InvocationLatency or TimeToFirstToken for a voice agent?
TimeToFirstToken is usually more useful for voice when your design streams the reply, because speech can begin once the first words arrive. InvocationLatency measures until the last token and grows with answer length. Track both along with output token count so you can tell a slow model from a long answer.
Can I measure latency without storing call audio?
Partly. Text conversation logs give timestamps, transcripts and barge-in without storing audio, and Bedrock and Lambda give model and tool timings. Audio logs add speech and silence durations per turn, and the recording lets you measure the real gap. If you cannot store audio, log your own timestamps in your application layer instead.
How many test calls do I need before trusting p95?
Enough that the slowest few percent contains several real turns. A few dozen calls with 15 to 20 turns each gives hundreds of turns, which is a reasonable start. A handful of calls cannot show a slow tail, so a clean-looking test can still hide the pauses real callers will meet.
Need help with AI Voice Agents? Talk to the engineers.
Tell us what you want to build. You'll get a straight answer on scope, approach and cost from the people who do the work.
Keep reading
Related guides
Voice AI
AI Voice Agent for Amazon Connect: Architecture and Build Guide
A practical guide to building an AI voice agent on Amazon Connect — the build options, the call flow, what drives cost, and the mistakes that sink pilots.
17 min read
Voice AI
How to Add an AI Voice Agent to Amazon Connect: Step-by-Step Setup Guide
Every step to put an AI voice agent on a phone number in Amazon Connect: instance, number, orchestrator AI agent, tools, bot, voice, contact flow and a test call, checked against the current AWS documentation.
15 min read
Voice AI
Amazon Connect Custom Voice: Every Voice Option for an AI Voice Agent
What 'custom voice' can mean in Amazon Connect, and how to set up each option: agentic voice, Amazon Polly, Nova Sonic, ElevenLabs and Brand Voice, with the security setup and the traps that cost time.
11 min read