VoiceRun STT Model
VoiceRun's first-party speech-to-text model, available through the shared realtime STT API. VoiceRun STT Router is the access layer for this model and external providers; VoiceRun STT Model is the model itself, hosted on VoiceRun infrastructure so your audio never leaves our boundary.
The interface is realtime: an OpenAI-Realtime-style WebSocket for streaming transcription with incremental results, per-turn context, and server-side turn-taking. Live calls and decoded recordings stream through the same socket.
Endpoint & authentication. One endpoint, geo-routed: VoiceRun STT Model is globally available, and every connection automatically lands in the nearest healthy region — no region picking, no per-region hostnames. Authenticate with
Authorization: Bearer <API_KEY>; open your VoiceRun profile, click Add PAT under Personal Access Tokens, then use the generated token as your API key and keep it server-side. The unified endpoint isapi.voicerun.com/v1/sttfor both VoiceRun STT Model and external models, using the same VoiceRun API key.
Why VoiceRun STT Model#
Per-turn context biasing (context / prompt) | A free-text string — menu items, product SKUs, caller and place names — conditions the decode toward your domain. It is the accuracy lever: in controlled testing it resolves homophones that a language pin cannot touch (pinning a language inside the supported set is accuracy-neutral). On the realtime API the string is re-applied at every turn's decode, so you can send a fresh session.update between turns as the conversation moves — the options your agent just offered, the name being spelled — with no reconnect. |
Server-side semantic turn-taking (turn_detection: "server") | A lightweight end-of-turn model runs beside the ASR and scores each moment of silence, so a turn closes when the utterance reads finished (typically 250–400 ms after end-of-speech) rather than when a fixed timer expires. eou_threshold sets the acceptance point and accepts a per-language map, vad_stop_ms sets when scoring begins, and eot_timeout_ms is the hard cap. Each turn.ended reports which path closed it (acoustic, text, timeout, vad). |
| Context-hallucination guard | Conditioning a model on your text creates a specific failure: on low-information audio — a silent gap, a cough, faint speech — it can return that text as though the caller had said it. Every turn is checked for this regurgitation; the echoed span is removed, any genuine speech the caller appended is preserved, and a pure echo yields an empty turn rather than a fabricated transcript. This is what makes aggressive per-turn biasing safe in production. See Reliability guardrails. |
| LID (language-drift) guard | Short, accented, or code-switched utterances make raw STT models land on the wrong language and script entirely — an English "two people" returned in Devanagari. Detections falling outside allowed_languages are re-decoded against your set, which corrects the language without altering the audio: unintelligible speech stays unintelligible, just in the right script. An explicit language pin always wins, since that is the translation path. See Reliability guardrails. |
| Language targeting that changes per turn | language can be re-sent at any turn boundary on a live session. A caller who switches languages mid-call is handled turn by turn; clearing the pin returns to auto-detect, and pinning a language outside the supported set turns the request into a translation into that language. |
| Multilingual, constrained to a list you set | Broadly multilingual, code-switched speech included. allowed_languages (CSV) bounds what auto-detect may return, while the model still chooses within that set by listening to the audio — so a caller's language is recognised rather than assumed, and recognition cannot wander outside languages you support. |
| OpenAI-Realtime-style WebSocket | One socket carries session config, audio frames, incremental hypotheses, and turn events. Live calls and decoded recordings use the same realtime protocol. |
| One geo-routed hostname | The service is globally available behind a single anycast address; each connection is routed to the nearest healthy region automatically. There is no region to choose, no per-region hostname to configure, and inference happens close to your callers. |
| First-party model on VoiceRun infrastructure | The model runs on VoiceRun's own GPUs rather than proxying a third-party STT vendor, so audio and transcripts stay inside VoiceRun's boundary — the data-residency posture enterprise deployments already rely on. |
Models#
| Model | Description | Languages |
|---|---|---|
voicerun-asr-realtime-v1 | Built on the open Qwen3-ASR foundation; served and tuned by VoiceRun for telephony and conversational audio | Multilingual; language allow-list configurable |
VoiceRun STT Model builds on the open Qwen3-ASR model family — its published multilingual benchmarks give recognition accuracy a public baseline — and runs entirely on VoiceRun's infrastructure, with the dynamic context, turn-taking, and guardrail layers documented here added on top.
Pass the model name as model in session.update.
Languages#
VoiceRun STT Model is multilingual and handles code-switched speech. You control which languages it may output with a language allow-list — auto-detect is constrained to the set you provide, so recognition never drifts outside it.
- Language allow-list:
allowed_languages(CSV) is the set auto-detect may choose from. The model still chooses within the set by listening to the audio. Set your list explicitly for your callers, or""to disable the guard entirely. - Auto-detect (default): with no
languagepin — or withlanguagesent explicitly as"auto"or""— the model identifies the language per utterance from the allow-list. - Pin a language: set
languageto an ISO code or full name to force it. Within the allow-list this is accuracy-neutral (the model already listens); pinning a language outside the set turns the request into a translation into that language. - Change it dynamically: on the realtime API, send
language(orallowed_languages) on anysession.update— or on a per-turn commit — to change targeting mid-session with no reconnect.
Language is a routing/translation control — the accuracy lever is context, not language.
Reliability guardrails#
Two guardrails run automatically to keep transcripts trustworthy on hard, real-world audio — the kind of failures a raw STT model produces on silence, noise, and accented or code-switched speech.
Context-hallucination guard#
When you bias decoding with a context/prompt, an ASR model conditioned on that text can, on
low-information audio (a silent gap, background noise, a cough), emit your prompt back as the transcript
instead of what was said — so the caller "says" your menu or your instructions. VoiceRun STT Model detects this
prompt regurgitation and suppresses it: the offending span is stripped, any genuine speech the caller
appended is preserved, and a pure echo yields an empty result rather than a fabricated one. You get the real
utterance or nothing — never your own context handed back as speech.
LID (language-drift) guard#
Short, accented, or code-switched utterances make raw STT models drift into the wrong language and script — an
English "two people" coming back as Devanagari, a name in Urdu script, a Cantonese filler tagged Japanese.
The LID guard constrains recognition to your allowed_languages while the model still chooses within the
set by listening — so output stays in the right language, at no latency cost. It corrects the language,
never the audio: unintelligible audio stays unintelligible, just in the right script. An explicit language
pin always wins (that's the translation path).
Audio format#
| Encoding | Raw PCM16 little-endian, base64 in each input_audio_buffer.append |
| Channels | Mono |
| Sample rate | 16 kHz |
| Chunking | ~100–200 ms per chunk (any size works) |
The Router accepts PCM16 or μ-law input from 8–48 kHz and converts it to the rate required by the selected model. For recorded files, decode the file and stream its audio through the same socket.
Next steps#
- Realtime WebSocket — streaming transcription, per-turn context, and server-side turn-taking.
- STT Router message reference — shared configuration, audio, transcript, warning, and fallback events.
