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

---
title: Voices & Languages
description: How voices, languages, and models fit together.
---

# 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

| Code    | Language       |
| ------- | -------------- |
| `en-IN` | Indian English |
| `hi-IN` | Hindi          |
| `ta-IN` | Tamil          |
| `te-IN` | Telugu         |
| `kn-IN` | Kannada        |
| `mr-IN` | Marathi        |
| `gu-IN` | Gujarati       |
| `bn-IN` | Bengali        |

## Model

Every synthesis request must include a `model_id`. There is a single model:

| Model      | Description                      |
| ---------- | -------------------------------- |
| `raaga-v1` | Production 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](/pricing) plan only.

#### By Voice

| Voice   | Gender | Languages |
| ------- | ------ | --------- |
| Aakash  | Male   | All eight |
| Amit    | Male   | All eight |
| Anand   | Male   | All eight |
| Archana | Female | All eight |
| Bhamini | Female | All eight |
| Jay     | Male   | All eight |
| Kavya   | Female | All eight |
| Kiran   | Male   | All eight |
| Meena   | Female | All eight |
| Mohan   | Male   | All eight |
| Neha    | Female | All eight |
| Nisha   | Female | All eight |
| Priya   | Female | All eight |
| Vidya   | Female | All eight |
| Vikram  | Male   | All eight |
| Yash    | Male   | All eight |



#### By Language

| Language           | Voices      |
| ------------------ | ----------- |
| `en-IN` (English)  | All sixteen |
| `hi-IN` (Hindi)    | All sixteen |
| `ta-IN` (Tamil)    | All sixteen |
| `te-IN` (Telugu)   | All sixteen |
| `kn-IN` (Kannada)  | All sixteen |
| `mr-IN` (Marathi)  | All sixteen |
| `gu-IN` (Gujarati) | All sixteen |
| `bn-IN` (Bengali)  | All sixteen |

> **Note:**
> 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.

> **Note:**
> 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.

#### Python

```python
client.voices.list(group_by="language")
client.voices.list(group_by="voice")
```



#### JavaScript

```ts
await client.voices.list({ groupBy: "language" });
await client.voices.list({ groupBy: "voice" });
```



#### cURL

```bash
curl "https://api.vakyam.ai/v1/voices?group_by=language" \
  -H "Authorization: Bearer $VAKYAM_API_KEY"
```

### Grouped by language

Each key is a language code, and the value is the list of voices available for
it:

```json
{
  "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:

```json
{
  "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.

> **Note:**
> 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](/api-reference/speech) for
> details.

> **Warning:**
> 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](/guides/realtime-websocket).

---

*Powered by [holocron.so](https://holocron.so)*
