> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.narilabs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.narilabs.com/_mcp/server.

# Voices and languages

Choose a voice in the [Playground](https://app.narilabs.com/playground), or retrieve the complete catalog with [List voices](/api-reference/text-to-speech/voices/list-voices). The catalog is specific to the requested model; use its exact voice IDs in speech requests.

## Voice names and IDs

`voice` is required and case-sensitive. Send the catalog entry’s `id`, not its `display_name`. For example:

| Display name | API voice ID | Gender |
| ------------ | ------------ | ------ |
| Diana        | `diana`      | Female |
| Leon         | `leon`       | Male   |

Use `"voice": "diana"` or `"voice": "leon"` in requests. Capitalized display names such as `"Diana"` and `"Leon"` are not valid IDs. Retrieve the catalog for the model you will use.

## Featured voices

These prerecorded previews come from the current voice pack. Each voice reads a different sample sentence.

### Diana

`diana` · English · Female

Measured and professional, with a mature, reassuring presence.

> I've reviewed the details, and everything is in place for tomorrow, so you can leave the rest with me.

### Claire

`claire` · English · Female

Calm and articulate, with crisp enunciation and a polished finish.

> Here's the plan: we'll focus on your priorities and turn the next steps into something simple and manageable.

## List available voices

```bash
curl --fail --silent --show-error \
  'https://api.narilabs.com/v1/voices?model=qwen3-tts:free' \
  -H "Authorization: Bearer $NARI_API_KEY"
```

`model` and a valid API key are required. The response contains the complete voice list and its `catalog_version`. Search or filter this small list in your application. Listing voices does not consume inference concurrency, daily generation allowance, or credits, and does not require an available GPU node.

Each entry contains `id`, `display_name`, `language`, `gender`, `description`, and `supports_instructions`. An optional `preview_url` links to a prerecorded sample. A catalog update appears on the next fetch after regional cache refresh; existing screens do not receive push updates.

## Generate speech

```json
{
  "model": "qwen3-tts:free",
  "input": "Your order has shipped.",
  "voice": "diana",
  "response_format": "wav"
}
```

The `voice` field is required. An unknown voice ID is rejected before inference. If a voice becomes unavailable after a catalog update, fetch the list again and select an available voice.

## Language is assigned to the voice

All current voices are English (`en`). The selected voice determines the generation language:

| Request language   | Behavior                                                                     |
| ------------------ | ---------------------------------------------------------------------------- |
| Omitted or `auto`  | Use the selected voice's assigned language (`en` for current voices).        |
| `en`               | Use English.                                                                 |
| Any other language | Reject before inference; the current voices cannot synthesize that language. |

`auto` does not detect the input language or translate text. Use the returned `language` when working with future catalogs instead of assuming that every voice has the same language. Current voices have `supports_instructions: false`; nonempty `instructions` are rejected.