Choosing an STT vendor shouldn't be a one-way door
Stream audio once and receive one event schema. VoiceRun handles provider integrations, routing, failover, usage, and billing behind the socket.
Realtime STT Router for voice agents
Stream live audio to the best STT models for voice agents. Switch models with one string; keep the same key, socket, events, and balance.
Stream audio once and receive one event schema. VoiceRun handles provider integrations, routing, failover, usage, and billing behind the socket.
# one VoiceRun key, one connection — only the model string changes {"type": "session.update", "model": "nova-3"} {"type": "session.update", "model": "gpt-4o-mini-transcribe"} {"type": "session.update", "model": "scribe_v2_realtime"} {"type": "session.update", "model": "voicerun-asr-realtime-v1"} # everything downstream is identical: the same audio frames in, # the same delta / final-turn events back out ▶ {"type": "input_audio_buffer.append", "audio": "<base64 PCM16>"} ◀ {"type": "transcription.delta", "text": "I'd like a table for four"} ◀ {"type": "turn.ended", "text": "I'd like a table for four.", "reason": "provider"}
OpenRouter's STT endpoint accepts a complete audio file over POST. VoiceRun streams live audio over WebSocket and returns accepts finished files over POST. VoiceRun streams live audio and returns partials immediately.
Speech, transcript, and turn events arrive in one shape across every provider.
Move new sessions to your fallback model when a provider becomes unavailable.
One VoiceRun API key and credit balance across every enabled model.
Compare accuracy and latency on the production audio that actually matters.
VoiceRun STT Model is selectable through the same protocol, with audio kept inside VoiceRun.
Routing adds a hop, and latency matters in every voice conversation. VoiceRun STT Router is built in Rust and keeps billing checks off the per-turn audio path, so a warmed provider connection can forward live audio with little typical overhead.
Local benchmark: 200 measured turns—100 direct and 100 routed—alternated over persistent, warmed connections to VoiceRun STT Model. Each turn used the same 3.8-second spoken fixture, streamed in realtime, and compared time to the first partial transcript. The direct and routed p50 measurements were within 1.5 ms of each other—inside measurement noise. Setup and end-to-end latency vary by model, provider, and region. This measurement is directional, not a latency guarantee.
Every provider below is available through the same STT Router protocol. Voice activity detection, partial and final transcripts, and context biasing are normalized across their models, so switching is a string change rather than a rewrite.
| Provider | Models |
|---|---|
| VoiceRun | voicerun-asr-realtime-v1 First-party, self-hosted — per-turn context and semantic turn-taking |
| Deepgram | flux-general-en · flux-general-multi · nova-3 Low-latency workhorse for English and multilingual |
| OpenAI | gpt-4o-transcribe · gpt-4o-mini-transcribe · whisper-1 Strong general accuracy; prompt biasing supported |
| ElevenLabs | scribe_v2_realtime Realtime scribe with broad language coverage |
| Cartesia | ink-whisper Fast streaming transcription |
| Soniox | stt-rt-v4 Realtime multilingual recognition |
chirp_3 Chirp 3 speech recognition | |
| Qwen | qwen3-asr-flash · qwen3-asr-flash-realtime Low-latency multilingual recognition with contextual biasing |
| xAI | grok-stt Grok speech-to-text |
| Inworld | inworld/inworld-stt-1 Conversational speech recognition |
| Gradium | gradium-default-stt Gradium speech recognition |
| Tencent | tencent-16k 16 kHz recognition for China-region workloads |
Model availability evolves as vendors ship and retire snapshots; the API reference carries the current list and per-model capabilities.
STT Router is the shared access layer. Select VoiceRun STT Model for our first-party model—with per-turn context, semantic turn-taking, hallucination and language-drift guards, and audio that stays inside VoiceRun—or select an external model with the same VoiceRun key. The socket, audio format, event schema, and credit balance stay the same.
Integrate once, compare models on your own calls, and move between them by changing the model string.