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 is api.voicerun.com/v1/stt for 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 guardConditioning 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) guardShort, 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 turnlanguage 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 setBroadly 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 WebSocketOne socket carries session config, audio frames, incremental hypotheses, and turn events. Live calls and decoded recordings use the same realtime protocol.
One geo-routed hostnameThe 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 infrastructureThe 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#

ModelDescriptionLanguages
voicerun-asr-realtime-v1Built on the open Qwen3-ASR foundation; served and tuned by VoiceRun for telephony and conversational audioMultilingual; 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 language pin — or with language sent explicitly as "auto" or "" — the model identifies the language per utterance from the allow-list.
  • Pin a language: set language to 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 (or allowed_languages) on any session.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#

EncodingRaw PCM16 little-endian, base64 in each input_audio_buffer.append
ChannelsMono
Sample rate16 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#

asrsttspeech-to-texttranscriptionrealtimewebsocket