Benchmarks

Measured on our own hardware — NVIDIA A10G (g5.2xlarge), us-east-1. Nothing here is estimated. Measured 2026-09-05T14:30:00Z.

Turn latency: 3,135 ms → 1,488 msA 2.1× improvement, almost entirely from moving text-to-speech onto vLLM. With a pre-rendered filler played first, the caller perceives about 50 ms.

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        14
endpoints broken         0
endpoints not built      1   (/v1/clone, honest 501)
voices producing audio   38/38
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 serial402000
normalize 20-way parallel60202000
models serial302000
filler cache 30-way parallel60302000
TTS 8-way parallel (GPU)882000
STT 6-way parallel (GPU)662000
chat 6-way parallel (Bedrock)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
faster-whisper-large-v3-turbo0.204 / 0.0990.252 / 0.121345 ms
faster-whisper-large-v30.187 / 0.0930.232 / 0.1072490 ms
whisper-large-v3-turbo0.391 / 0.1990.28 / 0.1431695 ms
whisper-hindi-large-v20.717 / 0.5520.759 / 0.644895 ms
whisper-telugu-large-v20.686 / 0.470.691 / 0.4715727 ms

The two single-language fine-tunes are the most accurate option for their language by a wide margin — Hindi WER 0.047 against 0.104 for the default — and roughly 15× slower. Use them for transcription nobody is waiting on. They only decode their own language; anything else returns garbage.

The 8kHz telephony penalty: WER 0.2040.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           220 ms   faster-whisper int8
LLM (nova-lite)          485 ms   Bedrock
normalize                  1 ms   no model
TTS first audio          782 ms   svara via vLLM
                      ────────
TOTAL                   1488 ms

before this work        3135 ms

What changed, and by how much

ComponentBeforeAfterGain
TTS first audio (streaming)2,473 ms782 ms3.16×
Speech to text307 ms220 ms1.4×
Concurrent capacity~1 call~6 calls measured6.02×
Repeated phrases (fillers)~2,400 ms1.2 ms~1,200×

The vLLM time-to-first-audio result

782 ms median, with a range of 782783 ms. A 1 ms spread across runs, which is unusually stable for autoregressive generation and makes the number safe to design around.

But real-time factor is still above 1.0vLLM 1.282 versus in-process 2.099 — a 1.64× throughput gain, but both above 1.0. even on vllm, svara cannot sustain continuous real-time speech on an a10g. Streaming hides this because playback starts before generation finishes, and it stops mattering once the caller is listening.

Concurrency

The result that decides cost per call. Note how the vLLM per-request median barely moves as load rises — that is continuous batching working.

ConcurrentvLLM medianvLLM wallin-process medianin-process wall
13,639 ms3.6 s6,529 ms6.5 s
34,385 ms4.5 s16,738 ms18.5 s
64,242 ms13.9 s82,246 ms83.7 s

vLLM reports 21.99× maximum internal concurrency with a 4.81 GB KV cache. We measured 6 in parallel with zero errors; the ceiling is higher than we pushed it.

The network tax nobody sees

GPU regionRound trip from India
us-east-1 (Virginia) — current238 ms
ap-south-1 (Mumbai)25 ms

213 ms per turn, thrown away, and invisible in every on-box benchmark above. It is a launch problem rather than a testing one, but it is the single largest remaining item and no amount of code fixes it.

Memory and cold start

VRAM total23.69 GB
vLLM (weights + KV cache + graphs)13.1 GB
Free for the API's other models9.2 GB
vLLM cold boot147 s
vLLM warm cache32 s

Verified across a real instance stop/start: every service came back unattended. Allow about three minutes after switching the box on before the API answers.

Reliability, stated plainly

svara does not always stop talkingsvara often fails to emit end-of-speech and generates until capped, WITHOUT erroring. Mitigated by a text-aware token budget (1.6x expected duration), an output sanity check, and up to 3 retries on the non-streaming path. Worst case bounded from 17.07s 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.