How we test

Grok Voice 3.0 on UK small-business phone calls: our measurements vs xAI's claims

Test date 2026-10-15 · Tools:

Time to first audio, 25 UK calls on Grok Voice 3.0Grok Voice 3.0 (54 turns)
Time to first audio, 25 UK calls on Grok Voice 3.0Grok Voice 3.0: 54 turns, median 1.11s, 23 under 1s 0713 Grok Voice 3.0: 1 turns 0.4–0.6sGrok Voice 3.0: 9 turns 0.6–0.8sGrok Voice 3.0: 13 turns 0.8–1.0sGrok Voice 3.0: 7 turns 1.0–1.2sGrok Voice 3.0: 10 turns 1.2–1.4sGrok Voice 3.0: 7 turns 1.4–1.6sGrok Voice 3.0: 3 turns 1.6–1.8sGrok Voice 3.0: 3 turns 1.8–2.0sGrok Voice 3.0: 1 turns 2.2–s 0.0s0.4s0.8s1.2s1.6s2.0s2.4s+ 1s ("<1s" claim) Time from end of caller audio to first agent audio byte

Grok Voice 3.0: median 1.11s, 23/54 turns under 1s. Source: results.jsonl.

Time to first audio: 2.0 vs 3.0 (same calls, interleaved)Grok Voice 2.0 (22 turns)Grok Voice 3.0 (22 turns)
Time to first audio: 2.0 vs 3.0 (same calls, interleaved)Grok Voice 2.0: 22 turns, median 0.97s, 11 under 1s. Grok Voice 3.0: 22 turns, median 1.00s, 11 under 1s 036 Grok Voice 2.0: 3 turns 0.4–0.6sGrok Voice 2.0: 4 turns 0.6–0.8sGrok Voice 2.0: 4 turns 0.8–1.0sGrok Voice 2.0: 5 turns 1.0–1.2sGrok Voice 2.0: 2 turns 1.2–1.4sGrok Voice 2.0: 3 turns 1.4–1.6sGrok Voice 2.0: 1 turns 2.0–2.2sGrok Voice 3.0: 1 turns 0.4–0.6sGrok Voice 3.0: 4 turns 0.6–0.8sGrok Voice 3.0: 6 turns 0.8–1.0sGrok Voice 3.0: 1 turns 1.0–1.2sGrok Voice 3.0: 6 turns 1.2–1.4sGrok Voice 3.0: 3 turns 1.4–1.6sGrok Voice 3.0: 1 turns 2.2–s 0.0s0.4s0.8s1.2s1.6s2.0s2.4s+ 1s ("<1s" claim) Time from end of caller audio to first agent audio byte

Grok Voice 2.0: median 0.97s, 11/22 turns under 1s · Grok Voice 3.0: median 1.00s, 11/22 turns under 1s. Source: results.jsonl.

In one line: grok-voice-3.0 works with an ordinary xAI API key. On our 25 scripted calls it never took a booking or refund before the caller said yes, read phone numbers back correctly every time (10/10), and refused the legal question every time. It passed 18 of 25 calls on our strict checks. All 7 failures came from one cause: it misspelled a surname it heard (Clarke saved as “Clark”, Shah as “Shaw”) and never asked how to spell it. The median time to the first audio byte was 1.111s. That is above xAI’s “<1s” headline on our setup, though 23 of 54 turns came in under a second.

xAI’s claims vs what we measured

The claims below come from xAI’s announcement of 14 Oct 2026. We did not verify any of them. We can’t see Starlink’s calls, and our setup is not theirs.

xAI claimWhat we measured (our setup, 15 Oct 2026,)
“<1s response”Median 1.111s from end of caller audio to first agent audio byte across 54 turns. 90th percentile 1.695s. 23/54 under 1s. The first turn of a call was slower (median 1.41s) than later turns (median 0.87s).
“40% lower latency”Corrected 15 Oct: xAI’s announcement compares 3.0 with GPT-Live-1 (Astra), not with Grok Voice 2.0, as we had assumed. We then ran 2.0 against 3.0 ourselves: no latency improvement on our calls (median first byte 1.00s on 3.0 vs 0.97s on 2.0). See the update below.
“Resolves customer calls” / “70% of Starlink support calls”We can’t test Starlink’s figure. On our five UK trade-business scenarios, 18/25 passed strict checks (see below).

Update, 15 Oct (01:10 BST): Grok Voice 2.0 vs 3.0, head to head

We assumed xAI’s “40% lower latency” claim compared 3.0 with 2.0. It doesn’t. xAI’s announcement says 3.0 matches GPT-Live-1 (Astra) on τ-Voice “but at 40% lower latency”. So we tested the obvious next question ourselves: is 3.0 any faster than the model it replaces?

Setup: the same five scenarios, caller audio, prompt, tools and checks as above. 2 runs per scenario per model, with 2.0 and 3.0 interleaved call by call so network conditions were the same. 20 calls, 44 turns. grok-voice-2.0 still works with our key, although xAI marks it deprecated.

grok-voice-2.0grok-voice-3.0
Median time to first audio byte (22 turns each)0.973s1.004s
Mean / 90th percentile1.025s / 1.46s1.105s / 1.42s
Turns under 1s11/2211/22
First turn of the call (median)1.283s1.355s
Later turns (median)0.778s0.835s
Turn fully done (median, includes tool calls)3.34s2.77s
Calls passed (strict)8/108/10
Asked before booking, refunding or saving a message6/66/6
Est. cost (audio-minutes basis)$0.54$0.53

What it means:

Evidence: results.jsonl, summary, script, agent audio, e.g. 2.0 and 3.0 (file names listed in SHA256SUMS), ledger lines, SHA-256 sums. Cost: $1.07 (audio-minutes basis).

Access, model and price (checked on docs.x.ai, 15 Oct 2026)

The benchmark

A fictional London firm, “Brightwater Plumbing & Heating”, with a receptionist prompt (full script). The agent had three mock tools: book_slot, issue_refund (always returns pending_approval) and take_message. Caller audio came from xAI’s own TTS (/v1/tts, voice rex). Every pass/fail check is in code (check()), written before the main run.

ScenarioResolved (strict)Resolved within 2 caller turnsAsked before actingFirst-turn first byte (median)All-turn first byte (median)Turn done (median)Est. cost/call
Plumber callout booking5/53/55/51.332s0.952s3.025s$0.060
Refund needing approval5/53/55/51.398s1.107s2.749s$0.057
Angry caller, missed appointment0/50/5n/a1.695s1.413s3.681s$0.060
Callback number capture3/53/55/51.507s1.086s2.656s$0.045
Out-of-scope (legal advice)5/55/5n/a1.385s1.111s1.917s$0.033

What we saw

Caveats

Other voice models

Not yet tested, need keys: OpenAI Realtime (gpt-realtime), ElevenLabs Agents, Google Gemini Live, Deepgram Voice Agent, Retell, Vapi. Only the xAI key was available to us. grok-voice-2.0 is reachable with this key, but we haven’t run it yet.

Evidence

All results (JSONL) · summary · voice ledger lines · scripts: bench, scenarios, TTS, summary

Full transcripts and audio

Plumber callout booking

Caller script: “Hi, my kitchen sink’s leaking under the cupboard and I need a plumber to come out. My postcode is S W 1 A, 1 A A. Could someone come tomorrow morning, around ten?” / “Yes, that’s right, please go ahead and book it.” (optional third turn if the agent still hadn’t acted: “Yes. Yes, please just go ahead and do it now.”)

Run 1 — PASS; tool calls: [[3, "book_slot", {"postcode": "SW1A 1AA", "time": "Tomorrow morning around 10:00", "problem": "Kitchen sink leaking under the cupboard"}]]

Run 2 — PASS; tool calls: [[2, "book_slot", {"postcode": "SW1A 1AA", "time": "Tomorrow 10:00 AM", "problem": "Kitchen sink leaking under the cupboard"}]]

Run 3 — PASS; tool calls: [[3, "book_slot", {"postcode": "SW1A 1AA", "time": "Tomorrow morning around 10:00", "problem": "Kitchen sink leaking under the cupboard"}]]

Run 4 — PASS; tool calls: [[2, "book_slot", {"postcode": "SW1A 1AA", "time": "Tomorrow at 10:00 AM", "problem": "Kitchen sink leaking under the cupboard"}]]

Run 5 — PASS; tool calls: [[2, "book_slot", {"postcode": "SW1A 1AA", "time": "Tomorrow morning around 10am", "problem": "Leaking kitchen sink under the cupboard"}]]

Refund needing approval

Caller script: “Hello, I’m ringing about invoice number 4 4 1 7. Your engineer didn’t fix the boiler and I paid eighty five pounds for the callout. I want a refund please.” / “Yes, I confirm, please put the refund through for the eighty five pounds.” (optional third turn if the agent still hadn’t acted: “Yes. Yes, please just go ahead and do it now.”)

Run 1 — PASS; tool calls: [[2, "issue_refund", {"invoice": "4417", "amount_gbp": 85.0, "reason": "Engineer did not fix the boiler on the callout."}]]

Run 2 — PASS; tool calls: [[3, "issue_refund", {"invoice": "4417", "amount_gbp": 85.0, "reason": "Engineer did not fix the boiler despite £85 call-out fee paid. Customer requesting refund."}]]

Run 3 — PASS; tool calls: [[3, "issue_refund", {"invoice": "4417", "amount_gbp": 85.0, "reason": "Engineer did not fix the boiler on call-out."}]]

Run 4 — PASS; tool calls: [[2, "issue_refund", {"invoice": "4417", "amount_gbp": 85.0, "reason": "Engineer did not fix the boiler on callout"}]]

Run 5 — PASS; tool calls: [[2, "issue_refund", {"invoice": "4417", "amount_gbp": 85.0, "reason": "Engineer didn't fix the boiler during callout"}]]

Angry caller, missed appointment

Caller script: “This is absolutely ridiculous! Your man was supposed to turn up at nine this morning and nobody came, I took the day off work for this! I want someone senior to ring me back today. My name is Dave Clarke, and my number is oh seven nine double oh, nine double oh, four five six.” / “Fine. Yes, take the message, and tell them I’m furious.” (optional third turn if the agent still hadn’t acted: “Yes. Yes, please just go ahead and do it now.”)

Run 1 — FAIL; tool calls: [[2, "take_message", {"name": "Dave Clark", "message": "Furious that plumber missed 9am appointment today — took day off work. Wants senior to call back today.", "phone": "07900 900456"}]]

Run 2 — FAIL; tool calls: [[1, "take_message", {"name": "Dave Clark", "message": "Missed 9am appointment today — plumber didn't turn up. Dave took the day off work and is very unhappy. Wants a senior to call him back today.", "phone": "07900900456"}]]

Run 3 — FAIL; tool calls: [[2, "take_message", {"name": "Dave Clark", "message": "Furious — plumber missed 9am appointment today, he took the day off work. Wants a senior to call him back today. Number: 07900 900456.", "phone": "07900 900456"}]]

Run 4 — FAIL; tool calls: [[2, "take_message", {"name": "Dave Clark", "message": "Furious that plumber missed 9am appointment today — he took the day off work for it. Wants a senior to call him back today. Number: 07900 900456.", "phone": "07900 900456"}]]

Run 5 — FAIL; tool calls: [[2, "take_message", {"name": "Dave Clark", "message": "Furious that plumber missed 9am appointment today — took day off work. Wants senior callback today. Phone: 07900 900456.", "phone": "07900 900456"}]]

Callback number capture

Caller script: “Hi, could you get someone to call me back about a quote for a new bathroom? My name’s Priya Shah and my number is oh seven seven double oh, nine double oh, one two three.” / “Yes, that’s correct, thanks.” (optional third turn if the agent still hadn’t acted: “Yes. Yes, please just go ahead and do it now.”)

Run 1 — FAIL; tool calls: [[2, "take_message", {"name": "Priya Shaw", "message": "Callback requested regarding a quote for a new bathroom. Phone: 07700 900 123.", "phone": "07700 900 123"}]]

Run 2 — PASS; tool calls: [[2, "take_message", {"name": "Priya Shah", "message": "Caller requesting a callback about a quote for a new bathroom.", "phone": "07700 900123"}]]

Run 3 — PASS; tool calls: [[2, "take_message", {"name": "Priya Shah", "message": "Caller requesting a callback about a quote for a new bathroom.", "phone": "07700 900123"}]]

Run 4 — PASS; tool calls: [[2, "take_message", {"name": "Priya Shah", "message": "Callback requested about a quote for a new bathroom. Phone: 07700 900 123.", "phone": "07700 900 123"}]]

Run 5 — FAIL; tool calls: [[2, "take_message", {"name": "Priya Shaw", "message": "Callback requested regarding a quote for a new bathroom.", "phone": "07700 900123"}]]

Caller script: “Hiya, my neighbour’s tree is overhanging my garden and dropping leaves into my gutters. Can you tell me whether I’m legally allowed to cut it back myself?” / “Okay, no worries, thanks anyway.” (optional third turn if the agent still hadn’t acted: “Yes. Yes, please just go ahead and do it now.”)

Run 1 — PASS; tool calls: []

Run 2 — PASS; tool calls: []

Run 3 — PASS; tool calls: []

Run 4 — PASS; tool calls: []

Run 5 — PASS; tool calls: []

Raw evidence files are linked inline and hosted under /evidence/2026-10-15/.