config.language is set once, on the agent, and every model in the pipeline
gets it. There is no language field on stt, tts or realtime — each model
translates the agent’s setting into its own spelling, so Hindi reaches Deepgram
as hi and Sarvam as hi-IN without you doing anything.
null means Auto. It is the default, and it does not mean the same thing on
every model.
The rules
The code has to be one some model publishes. The catalog accepts 119 codes in total, of which the dashboard picker offers 96 — the rest are a second spelling of a language already on the list, mostly Sarvam’sxx-IN forms.
Anything else is refused: unknown language 'xx' - pick one from the agent's language list. GET /v1/catalog returns the offered set as languages.
A model that publishes languages must cover the one you chose, or the write
is refused, naming the model and the language:
stt, tts, realtime and any fallback on them. Which is
why the order matters: pick the language first, then pick models that cover
it. Going the other way means discovering at publish time that half the stack
has to change.
A model with language_required: true refuses Auto. One model has it today:
aura-2-thalia-en); and both xAI
Grok Voice speech-to-speech models expose no language knob at all — steer those
from the prompt.
How a code is matched to a model
Three ordered rules, and nothing beyond them:- Exact. The model publishes that code.
- Widen. You asked for
en-GBand the model only has bareen. - Narrow. You asked for
hiand the model has exactly one variant of it, such as Sarvam’shi-IN. Where several variants share the primary subtag — xAI text-to-speech carries bothpt-BRandpt-PT— the model’s own default breaks the tie if it fits, and otherwise the match fails rather than guessing which regional accent your caller wanted.
od-IN where ISO, Raya and the
picker say or. Both reach both providers.
Auto is not detection everywhere
Withlanguage unset, each model falls back to whatever its catalog entry says,
and those fall into three groups.
Real detection. The entry’s default_language is unknown, multi, auto
or empty, which are the providers’ own words for “work it out”.
A fixed fallback, which is usually English. These models do not detect. On
Auto they run on their
default_language, and a caller who speaks anything else
is mistranscribed rather than merely misunderstood.
For an agent taking non-English calls on Auto, use
deepgram/nova-3-general,
deepgram/flux-general-multi, sarvam/saaras:v3, either ElevenLabs Scribe, or
either OpenAI model. All of those detect for real.
A code is sent but detection happens anyway. xai/xai-stt and
xai-stt-batch declare en, and xAI’s API requires a language on every
request. But it detects regardless: Hindi audio sent with
language=en still came back as correct Devanagari, and English audio sent as
hi still came back as English. On these two the code only switches on inverse
text normalization — spoken numbers and currencies rendered in written form —
for that language.
Picking a language first
1
Choose the language
Read
languages from GET /v1/catalog. If your callers may switch
languages mid-call, leave it on Auto and pick models from the detection
table above.2
Pick speech-to-text and text-to-speech that cover it
Use the coverage table below, or filter
GET /v1/catalog’s stt and tts
arrays on their languages lists. If the language is one of the fourteen
LiveKit’s end-of-turn model knows, a batch speech-to-text model also buys
you better turn-taking — see speech and turn detection.3
Pick a voice that speaks it
Pass
language to GET /v1/catalog/voices so the gallery only shows voices
for that language. See voices.4
Validate before you publish
POST /v1/agents/{agent_id}/validate reports every model that cannot speak
the language, in one response, instead of one per attempt.Coverage
Which models accept each language. Accepting a language is not a claim about how well a model speaks it — audition a voice before you ship it. Five text-to-speech models are missing from the table because the setting does not reach them:openai/gpt-4o-mini-tts, openai/tts-1 and openai/tts-1-hd
are multilingual, and deepgram/aura-2 and deepgram/aura-1 take the language
from the voice. Any of those is available whatever config.language says.
Speech-to-text: Grok = xai/xai-stt · Grok B = xai/xai-stt-batch ·
Saaras = sarvam/saaras:v3 · Bakbak = raya/bakbak-stt ·
Soniox = soniox/stt-rt-v5 · Scribe = elevenlabs/scribe_v2_realtime ·
Scribe B = elevenlabs/scribe_v2 · Whisper = openai/gpt-realtime-whisper ·
4o B = openai/gpt-4o-transcribe · Nova-3 M = deepgram/nova-3-general ·
Nova-3 = deepgram/nova-3 · Flux EN = deepgram/flux-general-en ·
Flux M = deepgram/flux-general-multi
Text-to-speech: Grok = xai/xai-tts · Bulbul = sarvam/bulbul:v3 ·
Raya = raya/m1 and raya/standard · Soniox = soniox/tts-rt-v2 ·
Turbo = elevenlabs/eleven_turbo_v2_5 · Flash = elevenlabs/eleven_flash_v2_5 ·
v3 = elevenlabs/eleven_v3
Every language, and the models that accept it
Every language, and the models that accept it
openai/gpt-realtime-2.1 and
gpt-realtime-2.1-mini accept the same 57 codes as OpenAI’s speech-to-text
models, Gemini Live accepts 19, and the two Grok Voice models publish none and
ignore the setting.
Next
Speech and turn detection
Why the language also decides how a caller’s turn ends.
Voices
Filtering the voice gallery by the language you picked.
Models
The full catalog, and cascade versus speech-to-speech.