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

# Qwen Audio 3.1 TTS Plus

> Speech synthesis for narration and dubbing, with 4 multilingual voices, plain-language delivery direction, inline emotion tags, and voice cloning.

![Qwen Audio 3.1 TTS Plus](https://media.empiriolabs.ai/model-logos/qwen.png)

[Alibaba Cloud](/providers/alibaba) · Audio Generation

`POST /v1/audio/speech`

Speech synthesis for narration and dubbing, with 4 multilingual voices, plain-language delivery direction, inline emotion tags, and voice cloning.

## At a glance

| Field               | Value                                                                                                             |
| ------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Model id            | `qwen-audio-3-1-tts-plus`                                                                                         |
| Model release date  | 2026-10-21                                                                                                        |
| Input modalities    | Text                                                                                                              |
| Output modalities   | Audio                                                                                                             |
| Context window      | -                                                                                                                 |
| Weight precision    | -                                                                                                                 |
| Region              | Singapore                                                                                                         |
| Features            | text_to_speech, multilingual, expressive_prosody, emotion_control, voice_tags, streaming, realtime, voice_cloning |
| Native inference    | No                                                                                                                |
| New                 | Yes                                                                                                               |
| Supported endpoints | `POST /v1/audio/speech`, `POST /v1/audio/speech:stream`, `WEBSOCKET /v1/realtime`                                 |
| Alternate model ids | `qwen-audio-3.1-tts-plus`, `alibaba/qwen-audio-3-1-tts-plus`                                                      |

## Pricing

| Charge    | Spec                  | Rate   |
| --------- | --------------------- | ------ |
| Synthesis | per 10,000 characters | \$0.60 |

## Example request

```bash
curl https://api.empiriolabs.ai/v1/audio/speech \
  -H 'Authorization: Bearer $EMPIRIOLABS_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"model": "qwen-audio-3-1-tts-plus", "input": "Hello from EmpirioLabs."}'
```

## Parameters

| Parameter                | Type    | Required | Default                | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ------------------------ | ------- | -------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `input`                  | string  | yes      | -                      | Text to synthesize, up to 10,000 characters per request. These inline tags change the delivery from the point where they appear: \[sad], \[amazed], \[deep and loud shouting], \[trembling], \[angry], \[excited], \[sarcastic], \[curious], \[like dracula], \[bored], \[tired], \[scornful], \[shouting], \[asmr], \[panicked], \[mischievously], \[empathetic], \[whispers], \[reluctantly], \[crying], \[serious], \[very slowly], \[very fast]. These add a one-time sound at that point: \[gasp], \[sighing], \[clears throat], \[giggles], \[laughing], \[cough], \[snorts]. · Max: 10000 |
| `voice`                  | enum    | no       | `"longanlingxin_v3.1"` | Voice preset. The 4 voices read Chinese, English, and other languages. Every voice id ends in \_v3.1, for example longanlingxin_v3.1. custom clones a voice from voice_audio_url once voice_consent is true, and the response's voice_id then works here for 7 days. · Allowed: `longanlingxin_v3.1`, `longanhuan_v3.1`, `longanfengyue_v3.1`, `xunanchuan_v3.1`, `custom`                                                                                                                                                                                                                       |
| `voice_audio_url`        | string  | no       | -                      | voice=custom only: an https URL to a 10 to 20 second recording of clear speech from one speaker, the voice to clone (WAV, MP3, M4A, OGG, WEBM or FLAC, up to 15 MB). Record it in a quiet room, without music or other voices.                                                                                                                                                                                                                                                                                                                                                                   |
| `voice_consent`          | boolean | no       | false                  | voice=custom only: true confirms that you have the speaker's permission to create a synthetic copy of their voice. A custom voice is created only when this is true.                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `response_format`        | enum    | no       | `"mp3"`                | Audio container. mp3 and opus are compressed, wav is uncompressed PCM in a RIFF header, and pcm is headerless raw samples for chunked playback. On the realtime WebSocket the default is pcm and wav is not available. · Allowed: `mp3`, `wav`, `pcm`, `opus`                                                                                                                                                                                                                                                                                                                                    |
| `sample_rate`            | enum    | no       | `24000`                | Output sample rate in Hz. 24000 suits speech playback, and 48000 gives broadcast-quality output at a larger file size. · Allowed: `8000`, `12000`, `16000`, `22050`, `24000`, `44100`, `48000`                                                                                                                                                                                                                                                                                                                                                                                                   |
| `speed`                  | number  | no       | `1`                    | Speaking rate multiplier. 0.5 is half speed and 2.0 is double speed. · Range: 0.5 – 2.0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `pitch`                  | number  | no       | `1`                    | Pitch multiplier. Values below 1.0 lower the voice and values above raise it. Pitch also shifts the pace of the rendered audio, so pair it with speed when you want to keep the original duration. · Range: 0.5 – 2.0                                                                                                                                                                                                                                                                                                                                                                            |
| `volume`                 | integer | no       | `50`                   | Output loudness, where 50 is the reference level. · Range: 0 – 100                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `instruction`            | string  | no       | -                      | Natural-language direction for delivery, up to 1,000 characters. Controls emotion, tone, character, pace, and speaking style, for example 'Speak quickly in an excited, upbeat tone' or 'Read slowly like a late-night radio host'. · Max: 1000                                                                                                                                                                                                                                                                                                                                                  |
| `language_hints`         | array   | no       | -                      | Language codes that bias pronunciation for mixed-language text, for example \["zh", "en"]. Leave unset to let the model detect the language. · Allowed: `zh`, `en`, `fr`, `de`, `ja`, `ko`, `ru`, `pt`, `th`, `id`, `vi`, `es`, `it`, `ms`, `fil`, `ar`                                                                                                                                                                                                                                                                                                                                          |
| `seed`                   | integer | no       | `0`                    | Sampling seed. Reuse a seed with identical input and settings for a repeatable render. · Range: 0 – 65535                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `bit_rate`               | integer | no       | `32000`                | Encoder bitrate in bps. Applies to the opus format only, and is ignored for mp3, wav, and pcm. · Range: 6000 – 510000                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `pronunciation`          | object  | no       | -                      | Pronunciation overrides keyed by the written form, for example \{"重要": "zhong4 yao4"}. Use it to fix names, acronyms, and homographs.                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `replace`                | object  | no       | -                      | Literal text substitutions applied before synthesis, for example \{"EmpirioLabs": "Empirio Labs"}. Useful for brand names and abbreviations.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `enable_markdown_filter` | boolean | no       | false                  | Strip Markdown syntax such as asterisks and underscores before synthesis so formatting characters are not read aloud.                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |

## Notes

**Voices**

* 4 voices that read Chinese, English, and other languages: `longanlingxin_v3.1`, `longanhuan_v3.1`, and `longanfengyue_v3.1` are female, and `xunanchuan_v3.1` is male.
* Every voice id ends in `_v3.1`, for example `longanlingxin_v3.1`.

**Custom voices**

* Set `voice` to `custom`, pass `voice_audio_url`, an https URL to 10 to 20 seconds of clear speech from one speaker, and set `voice_consent` to `true` to confirm that you have the speaker's permission to clone their voice.
* WAV, MP3, M4A, OGG, WEBM and FLAC are accepted, up to 15 MB. Record in a quiet room, without music or other voices.
* The response includes `voice_id` and `voice_id_expires_at`. Pass the `voice_id` as `voice` to reuse the voice for 7 days, on `POST /v1/audio/speech`, `POST /v1/audio/speech:stream` or the realtime socket, where `session.update` takes the same fields and `session.updated` returns the `voice_id`. Only the account that created it can use it, on this model only.
* Each account can hold 10 custom voices on this model at a time. Creating a custom voice adds no charge.

**Delivery direction**

* `instruction` sets emotion, tone, character, pace, and speaking style in natural language, up to 1,000 characters.
* Inline tags inside the text change the delivery from that point, for example `[excited]` or `[whispers]`, or add a one-time sound such as `[laughing]` or `[sighing]`. The full list of tags is on the `input` parameter.
* SSML input is not supported.

**Input limits**

* Up to 10,000 characters per request.
* `language_hints` biases pronunciation for mixed-language text.

**Output**

* MP3, WAV, PCM, or Opus at 8,000 to 48,000 Hz.
* `POST /v1/audio/speech:stream` sends audio chunks while the speech is generated.

**Realtime**

* `WEBSOCKET /v1/realtime?model=qwen-audio-3-1-tts-plus` takes text while it is still being written and returns audio as it is generated. Send `input_text_buffer.append` events, then `input_text_buffer.commit`, or `session.finish` to end the session.
* Audio arrives in `response.audio.delta` events: 16-bit PCM at 24,000 Hz by default, or MP3 or Opus. Set the voice, instruction, format and other options with `session.update`; a change applies from the next segment.
* Text is spoken in segments that end at sentence boundaries, and each segment ends with a `response.done` event carrying its usage.

**Billing**

* Billed per character of the input text. A Chinese character counts as two characters, and inline tags count as characters. The instruction is not billed.
* On the realtime socket each segment is billed for its own characters.

---

*Machine-readable schema:* `GET https://api.empiriolabs.ai/v1/models/qwen-audio-3-1-tts-plus`.