Short version: Availability differs by product. Omni
currently serves
en, fr, es, and hi. de is accepted but currently
falls back to English. Hear synchronous and streaming transcription serves
en, es, fr, de, hi, it, pt, and nl. Automatic language detection is the default; an explicit language pins
recognition for the request or session. Cue is unavailable on the serving Hear
stream.Status at a glance
Legend. GA · benchmarked = supported and we publish accuracy numbers.
Rejected loudly = a language outside the published set fails with
400 unsupported_language instead of being silently mis-transcribed.
Roadmap = planned, not available today.
Dub (audio dubbing)
Dub accepts source codesen, es, fr, de, hi, it, pt, and nl, and
can render en, es, fr, de, hi, it, pt, zh, ja, ko, or ru.
Read GET /healthz/dub before enabling a production direction: that endpoint
is the live source of truth, and published codes do not promise equivalent
quality for every direction. Validate your recordings before using a new
source-language workflow in production.
Submit with POST /v1/dub, poll until done or error, then download the audio.
See the Dub guide for the complete asynchronous workflow.
Hear (speech-to-text)
The streaming endpoint (GET /v1/audio/transcriptions/stream) and the
OpenAI-compatible sync endpoint (POST /v1/audio/transcriptions) accept an
optional language parameter:
languageis an ISO-639-1 code:en,es,fr,de,hi,it,pt, ornl; streaming also acceptsauto. Other explicit values are rejected with400 unsupported_language.- Omit
languagefor automatic detection on synchronous or streaming transcription. Streaming also acceptslanguage=auto. - An explicit language code pins recognition for the complete request/session. In automatic streaming mode, recognition starts fresh at utterance boundaries, allowing a later utterance to use a different language. Mixed-language accuracy still depends on the recording; this is not a guarantee of error-free code-switching.
- English is the GA, benchmarked language. Published English accuracy: ~1.6% WER on clean audio and ~4.8% WER on an 8 kHz telephony/accented corpus (see Benchmarks).
Async batch jobs (
POST /v1/transcription/jobs) take no STT language:
the spoken language is auto-detected per call across the same eight
languages (en/es/fr/de/hi/it/pt/nl) and the transcript is
returned in the detected language. The API does not currently return the
detected language code. The optional language field sets the Recap
summarization language (en/fr/es/de/hi) and does not affect
transcription. Use Hear sync/streaming when you need to pin the decode
language explicitly.Indian languages & code-mixed speech
Hindi (hi) is accepted on Hear sync and streaming. PyAI does not yet
publish Hear word-error-rate numbers for Hindi, Italian, Portuguese, or
Dutch, nor for code-mixed Hinglish / Tanglish. Tamil, Telugu, Bengali,
Marathi, Kannada, Malayalam, Gujarati, Punjabi, and other codes outside the
published set are rejected outright (400 unsupported_language). Omni serves
Hindi/Hinglish end to end (see below).
Output script. With language=hi, the transcript is rendered in
Devanagari — including English words spoken mid-sentence (check →
चेक). If your traffic is Hinglish or otherwise heavily code-mixed and your
pipeline expects Latin script, sending language=en yields mostly-Latin
output, and on our measurements it also gives better word accuracy on
code-mixed Indian calls than language=hi. The vocabulary/context feature
biases recognition toward your terms but does not steer the output
script: listing a Latin-spelled term does not stop it from being rendered in
Devanagari under language=hi.
Hear does not currently expose language-identification or decoder-confidence
fields. On sync and streaming, omitting language enables automatic detection;
the streaming endpoint also accepts language=auto. Send the known language
when your product requires recognition to stay pinned for the full
request/session. Only async batch jobs report no language-selection field at
all: they auto-detect each call.
Omni (agentic voice)
Omni runs the full loop: speech-to-text, the brain, and text-to-speech. The configuration enum isen (default), fr, es, de, and hi, and the
currently served set is en, fr, es, and hi. Set a served language once on the
Agent profile and every call on that Agent requests it:
languageis an agent-level setting (an agent is “a Spanish agent”). It can also be sent per session in theconfigureframe, which wins over the profile (see the Omni protocol reference). Absent ornullmeansen, exactly the pre-multilingual behavior.- Availability is staged per language. As of 2026-08-13, German is not
enabled on the public fleet. Configuring an Agent for German falls back to English and the
call proceeds (the
configuredack reportslanguage_activeandlanguage_fallback: true), and the call bills as what was actually served. Treat the ack as authoritative and close the session if fallback is not acceptable. - Hindi uses the Standard voice tier. See the pricing page
for current tier treatment. Choose
hi1throughhi4(or the canonical ids fromGET /v1/voices). Omitvoice_idforhi1, the default. A bad Hindi id also serves the default, andconfigured.voice_idreports the canonical voice actually served. Stock ids ending in_en_inremain Indian-English voices, not Hindi. - English Natural uses
en1(canonical idstock_aria_en). Omni reports the canonical id andvoice_tier: "natural"in the configured acknowledgement while that tier is active. See the pricing page for current tier treatment. - Per-phone-number language mapping and automatic language detection are fast-follows, not part of this rollout.
available_on field before using the same voice on another product.
For a language outside each product’s published set, bring recognition and
synthesis that support it. Do not treat omitted Hear language as unbounded
language support: it requests automatic detection only inside the published set.
Speak (text-to-speech)
GET /v1/voices is the unified catalog. Inspect available_on before using a
row. POST /v1/audio/speech has no separate language parameter; the selected
voice determines the language. The catalog groups and aliases are:
Catalog discovery is the source of truth for a configuration you can select.
Every Speak voice accepts
stream: true and stream: false, but request
acceptance is different from incremental delivery: a voice served from a
blocking-only fleet answers a streaming request successfully with
x-pyai-stream: buffered. Inspect that response header before treating a
request as low-latency playback. Delivery checks establish availability, not a
pronunciation guarantee for every name, number, accent, or mixed-language
passage. Test your intended text and voice together.
- English Natural
en1(stock_aria_en) supports streaming and buffered Speak synthesis. Tier and count summaries are catalog projections, not a promise that every source row is available to every account or product. - Hindi Standard
hi1–hi4works on both Speak and Omni (it was published as Omni-only until 2026-09-07; Speak served it the whole time). The former Hindi Natural aliaseshi5–hi8are retired and no longer served. - See the pricing page for current Speak voice-tier treatment.
?region=india) speak English. They are not
Hindi voices.
How accuracy gets published
We gate engine quality in CI with an offline benchmark harness (evals/) and
publish the headline numbers on the Benchmarks
page. As languages are measured, their numbers appear there and this matrix is
updated. If you need a number that isn’t published yet, ask, an unpublished
number means “not measured to our bar,” not “hidden.”
See also
Speech To Text (Hear)
Choose sync, streaming, or timestamped async transcription.
Text To Speech (Speak)
Choose a catalog voice and compatible delivery mode.
Omni wire protocol
Connect, configure, and the live-vs-roadmap field table.
Telephony audio (8 kHz)
μ-law ↔ PCM16 at 8 kHz for phone legs.
Pricing
Current rates, included usage, and plan availability.