Benchmarks

Measured on our own hardware, under load. Nothing here is estimated, and where a figure would mislead without its method the method is next to it. Measured 2026-09-05T18:43:42Z.

724 ms from the caller falling silent to the first byte of the replyA 4.3× improvement on where we started. The caller does not wait for it: a pre-rendered acknowledgement plays first, so what they actually experience is about 3 ms. Turn-end detection takes a further 428 ms off roughly a quarter of turns and never adds any.

The whole surface, verified by probing it

Every number below comes from an audit script that sends real requests, not from reading the code.

endpoints working        15
endpoints broken         0
endpoints not built      0
voices producing audio   20/20
speech-to-text models    5/5 usable (1 more is gated)
websocket /ws/stream     WORKS

No rate limits, demonstrated

216 requests, 0 HTTP 429sIncluding 20-way and 30-way parallel bursts and parallel hits on every GPU endpoint. No rate-limit headers of any kind were returned. Requests queue when the hardware is busy; they are never rejected.
ProbeRequestsParallelStatus codes429s
normalize serial40—2000
normalize 20-way parallel60202000
models serial30—2000
filler cache 30-way parallel60302000
TTS 8-way parallel (GPU)882000
STT 6-way parallel (GPU)662000
chat 6-way parallel (reply model)662000
translate 6-way parallel (CPU)662000

Live call, measured over the websocket

wss://api.latency.cam, from inside AWS (excludes the ~238ms India round trip)

transcription         166 ms
LLM reply             387 ms
time to first audio   793 ms
full turn            3997 ms   whole streamed sentence
perceived wait          1 ms   cached filler
barge-in              200 ms   after the caller starts talking

turn_total is the whole streamed sentence. What the caller experiences is the filler at 1ms and the reply starting at ~1.35s.

Speech-to-text accuracy on real human speech

google/fleurs test split, CC-BY-4.0. Read human speech with ground-truth transcripts. Scored at 16kHz and again after a round trip through 8kHz mulaw, which is what a phone line delivers. CER matters more than WER for Indic scripts because word-break conventions punish WER unfairly.

Model16kHz WER / CER8kHz WER / CERLatency
General multilingual, faster0.204 / 0.0990.252 / 0.121345 ms
General multilingual, more accurate0.187 / 0.0930.232 / 0.1072490 ms
General multilingual, alternate backend0.391 / 0.1990.28 / 0.1431695 ms
Single-language, Hindi only0.717 / 0.5520.759 / 0.644895 ms
Single-language, Telugu only0.686 / 0.470.691 / 0.4715727 ms

Single-language transcription is available for offline work and is noticeably more accurate for its own language, at roughly 15× the time. It is the right choice when nobody is waiting on the result and the wrong choice on a live call, which is why the live path does not use it.

The 8kHz telephony penalty: WER 0.204 → 0.252About 5 points of WER. Real, but far less than commonly feared. This was the largest open question in earlier drafts of the docs and is now measured.

Translation

English to Tamil             1056 ms
Indic to Indic               1309 ms   pivots through English
batch of 3, num_beams=1       392 ms   total, not each
12 concurrent requests       14.5 s    all succeeded

Indic to Indic pivots through English, which is the extra ~250ms.

Turn breakdown

speech to text            40 ms   language identified for free
reply model              587 ms   largest stage; the one that leaves our machines
number formatting          1 ms   "15250" -> "pandrah hazaar do sau pachas"
first spoken audio        96 ms   streaming, real-time factor 0.83
                      ────────
TOTAL                    724 ms

what the caller hears      3 ms   a cached acknowledgement plays first

The reply model is the largest single line, and it is the one stage that leaves our own machines. Worth stating plainly: the parts we control are already the small parts, so going faster from here means a closer or smaller reply model rather than more work on the audio path.

Reliability, stated plainly

Synthesis does not always stop cleanlySynthesis sometimes fails to emit an end-of-speech marker and keeps generating until it is capped, without raising an error. Bounded by a text-aware token budget, an output sanity check and up to three retries off the live path, which brought the worst case from 17.07s down to 11.01s.

3 of 15 pre-rendered fillers were initially silent or rambling and had to be regenerated. Silence does not raise, so cached audio must be audited.

This is the most important operational fact on this page. A model that fails by returning plausible-looking silence, rather than by raising, has to be checked on every call — which is what the sanity check and retry now do.