Agent-readable docs index: /llms.txt. Download /docs.zip to grep all markdown files locally.

Voices & Languages

A voice is a person, recorded across one or more languages. Each voice has a human-readable name and a language code. The same person — say, Archana — can speak in several languages (Archana in ta-IN, Archana in hi-IN).

Supported languages

CodeLanguage
en-INIndian English
hi-INHindi
ta-INTamil
te-INTelugu
kn-INKannada
mr-INMarathi
gu-INGujarati
bn-INBengali

Model

Every synthesis request must include a model_id. There is a single model:
ModelDescription
raaga-v1Production text-to-speech model.

Voices

Every voice speaks all eight supported languages, so you can pair any voice with any language code. Pass the voice's name (or a vc_ custom voice ID) as the voice parameter, with a matching language, in synthesis requests.
Custom vc_ voices come from voice cloning, which is included on the Growth plan only.
VoiceGenderLanguages
AakashMaleAll eight
AmitMaleAll eight
AnandMaleAll eight
ArchanaFemaleAll eight
BhaminiFemaleAll eight
JayMaleAll eight
KavyaFemaleAll eight
KiranMaleAll eight
MeenaFemaleAll eight
MohanMaleAll eight
NehaFemaleAll eight
NishaFemaleAll eight
PriyaFemaleAll eight
VidyaFemaleAll eight
VikramMaleAll eight
YashMaleAll eight
All sixteen public voices support every language, so any voice/language combination is valid. GET /v1/voices is always the source of truth for the current roster.
A voice's fluency can vary from one language to another. The same voice may sound more natural in some languages than others, so it's worth sampling a few voice + language pairs to find the best fit for your use case.

Listing voices

Use GET /v1/voices to discover available voices. Each entry's voice_name value is what you pass as the voice parameter in synthesis requests. Results are grouped by language by default.
client.voices.list(group_by="language") client.voices.list(group_by="voice")

Grouped by language

Each key is a language code, and the value is the list of voices available for it:
{ "ta-IN": [ { "voice_name": "Archana", "gender": "female" }, { "voice_name": "Kavya", "gender": "female" }, { "voice_name": "Kiran", "gender": "male" }, { "voice_name": "Aakash", "gender": "male" } ], "hi-IN": [ { "voice_name": "Priya", "gender": "female" }, { "voice_name": "Vidya", "gender": "female" }, { "voice_name": "Mohan", "gender": "male" }, { "voice_name": "Vikram", "gender": "male" } ] }

Grouped by voice

Each key is a person, with their gender and the languages they support:
{ "Archana": { "gender": "female", "languages": ["bn-IN", "en-IN", "gu-IN", "hi-IN", "kn-IN", "mr-IN", "ta-IN", "te-IN"] }, "Priya": { "gender": "female", "languages": ["bn-IN", "en-IN", "gu-IN", "hi-IN", "kn-IN", "mr-IN", "ta-IN", "te-IN"] } }

Selecting a voice in synthesis

For HTTP requests, send model_id, voice, and language together. The server validates the voice + language pair against the active voice catalog.
The parameter is now voice. The older voice_name parameter is deprecated and will be removed after a migration window — it still works for preset voices during the transition. See POST /v1/tts/generate for details.
If the voice + language combination does not exist, the request fails with 422 and the code voice_language_not_found. Always source valid pairs from GET /v1/voices.
For WebSocket sessions, these fields are set once in a config message rather than on each text message. See the realtime guide.