Universal-3.6 Pro Realtime transcribes 32 languages for voice agents, and it does it without being told which one to expect. The model is multilingual by default, follows callers who switch languages mid-sentence, and can report the detected language on every turn if you ask for it.
Below: the full list with codes, how code-switching and detection behave, and how to steer a session. For design questions, see our guide to multilingual voice agents.
The 32 supported languages
These are the languages Universal-3.6 Pro Realtime code-switches across, as listed in the multilingual transcription docs. universal-3-6-pro is the default speech_model on the streaming endpoint, so a session gets all 32 unless you pin something else.
| Language | Code | Language | Code |
|---|---|---|---|
| Afrikaans | af | Korean | ko |
| Arabic | ar | Mandarin | zh |
| Cantonese | yue | Marathi | mr |
| Catalan | ca | Norwegian | no |
| Danish | da | Norwegian Nynorsk | nn |
| Dutch | nl | Persian | fa |
| English | en | Portuguese | pt |
| Estonian | et | Romanian | ro |
| Finnish | fi | Russian | ru |
| French | fr | Spanish | es |
| Galician | gl | Swedish | sv |
| German | de | Turkish | tr |
| Hebrew | he | Urdu | ur |
| Hindi | hi | Vietnamese | vi |
| Italian | it | Xhosa | xh |
| Japanese | ja | Zulu | zu |
Thirteen of these are new with Universal-3.6 Pro: Afrikaans, Cantonese, Estonian, Galician, Korean, Marathi, Norwegian Nynorsk, Persian, Romanian, Russian, Urdu, Xhosa and Zulu. If you pinned an integration to universal-3-5-pro, those languages need the newer model.
How code-switching and language detection work
Code-switching needs no configuration. The model follows speakers who shift between languages mid-sentence and keeps each word in the language it was spoken in, rather than translating everything into one language. On code-switched speech it posts 7.20% WER, against 17.13% for Nova-3 Multi.
Language detection is opt-in. Set language_detection to true and each Turn message carries a language_code and a language_confidence between 0 and 1, populated when an utterance is complete or the turn is final. It reports the language without changing how the model transcribes, which makes language_code the field to route your LLM prompt or reply voice on.
Steering is optional. language_codes biases the model toward the languages you expect:
- A subset, such as English and Spanish, still allows code-switching, biased toward those languages.
- A single code suits a monolingual line.
- Leaving it out keeps native code-switching across all 32 languages.
Here’s the connection config from the docs for an English and Spanish line:
CONNECTION_PARAMS = {
"sample_rate": 16000,
"speech_model": "universal-3-6-pro",
"language_codes": ["en", "es"],
}You can change it mid-session with an UpdateConfiguration message, for example once the caller has picked a language. An empty list clears the steering.
{"type": "UpdateConfiguration", "language_codes": ["es"]}For comparison, Universal-Streaming Multilingual covers six languages and switches per turn rather than mid-sentence. Details are on the model selection page.
Get an API key and test Universal-3.6 Pro Realtime on your own multilingual calls. The free tier includes 333 hours of streaming.
What about the language the agent replies in?
Input coverage is only half of a voice agent. The language your agent can answer in depends on your LLM and your text-to-speech voices. AssemblyAI’s Text-to-Speech API launches on October 28, 2026, so speech in and speech out can come from one vendor. Check its docs at launch for output language coverage before you promise a market a native-language reply.
Two practical tips, whatever you use:
- Match the voice to the language. Transcribing Spanish and replying in an American English voice is jarring for callers.
- Write the system prompt in the target language, or tell the LLM explicitly which language to answer in. language_code makes that a per-turn decision.
Universal-3.6 Pro Realtime drops into LiveKit and Pipecat, or your own loop, at $0.45/hr base, billed per second.
Hear how a voice agent built on AssemblyAI handles real callers.
Frequently asked questions
What languages does Universal-3.6 Pro Realtime support?
32: Afrikaans, Arabic, Cantonese, Catalan, Danish, Dutch, English, Estonian, Finnish, French, Galician, German, Hebrew, Hindi, Italian, Japanese, Korean, Mandarin, Marathi, Norwegian, Norwegian Nynorsk, Persian, Portuguese, Romanian, Russian, Spanish, Swedish, Turkish, Urdu, Vietnamese, Xhosa and Zulu.
Can callers switch languages mid-conversation?
Yes. Universal-3.6 Pro Realtime code-switches natively, including mid-sentence, with no configuration. It keeps each word in the language it was spoken in rather than translating.
How do I detect which language the caller is speaking?
Set language_detection to true. Each Turn message then includes language_code and a language_confidence score between 0 and 1 when the utterance is complete or the turn is final. Detection reports the language; it doesn’t change the transcription.
How do I lock a session to one language?
Pass a single code in language_codes, such as es, at connection time or mid-session with UpdateConfiguration. A list of several codes biases toward that set while still allowing code-switching, and an empty list clears the steering.
Which languages can the agent reply in?
That depends on your LLM and text-to-speech. AssemblyAI’s Text-to-Speech API launches on October 28, 2026; check its documentation at launch for output language coverage.