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.
Language is voice and video only. Setting it on a text agent is cleared on save — a chat has no speech models to configure, and the prompt sets the tone.

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’s xx-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:
This is checked for 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:
On Soniox text-to-speech the language is not a label — it is the phonetic system the text is read through. English text sent as es comes back as English words pronounced through Spanish phonics, which is not accented English, it is unintelligible. The same sentence read as de turned “2024 dollars” into “12,047”. Get this one right.
Models that publish no languages ignore the setting entirely. OpenAI’s three text-to-speech models are multilingual and take no language parameter; Deepgram Aura encodes the language in the voice id (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:
  1. Exact. The model publishes that code.
  2. Widen. You asked for en-GB and the model only has bare en.
  3. Narrow. You asked for hi and the model has exactly one variant of it, such as Sarvam’s hi-IN. Where several variants share the primary subtag — xAI text-to-speech carries both pt-BR and pt-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.
One deliberate alias exists: Sarvam spells Odia od-IN where ISO, Raya and the picker say or. Both reach both providers.

Auto is not detection everywhere

With language 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.
Raya is the one to watch. None of its three entries detect anything, and the failure is asymmetric. English audio transcribed as hi comes back transliterated with its meaning intact, but Hindi audio transcribed as en loses content outright — one clip returned as “Namaste, I have to say, order number.” It arrives as a successful transcript with nothing to flag it, so the agent never learns it misheard. An Indic agent on Raya must set config.language.On Raya speech-to-text the language also selects the output script, and it is obeyed strictly: one Hindi clip came back in Devanagari on hi, in Tamil script on ta, and romanized on en.

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
Speech-to-speech models publish their own lists: 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.