> This page is for version dev.
> For other versions, use one of these documentation indexes:
> - Latest (v1.5.1) (default): https://docs.nvidia.com/dynamo/latest/llms.txt
> - dev: https://docs.nvidia.com/dynamo/dev/llms.txt
> - v1.5.1: https://docs.nvidia.com/dynamo/v1.5.1/llms.txt
> - v1.5.0: https://docs.nvidia.com/dynamo/v1.5.0/llms.txt
> - v1.4.2: https://docs.nvidia.com/dynamo/v1.4.2/llms.txt
> - v1.4.1: https://docs.nvidia.com/dynamo/v1.4.1/llms.txt
> - v1.4.0: https://docs.nvidia.com/dynamo/v1.4.0/llms.txt
> - v1.3.0: https://docs.nvidia.com/dynamo/v1.3.0/llms.txt
> - v1.2.1: https://docs.nvidia.com/dynamo/v1.2.1/llms.txt
> - v1.2.0: https://docs.nvidia.com/dynamo/v1.2.0/llms.txt
> - v1.1.1: https://docs.nvidia.com/dynamo/v1.1.1/llms.txt
> - v1.1.0: https://docs.nvidia.com/dynamo/v1.1.0/llms.txt
> - v1.0.2: https://docs.nvidia.com/dynamo/v1.0.2/llms.txt
> - v1.0.1: https://docs.nvidia.com/dynamo/v1.0.1/llms.txt
> - v1.0.0: https://docs.nvidia.com/dynamo/v1.0.0/llms.txt
> - v0.9.1: https://docs.nvidia.com/dynamo/v-0-9-1/llms.txt
> - v0.9.0: https://docs.nvidia.com/dynamo/v-0-9-0/llms.txt
> - v0.8.1: https://docs.nvidia.com/dynamo/v-0-8-1/llms.txt
> - v0.8.0: https://docs.nvidia.com/dynamo/v-0-8-0/llms.txt
> - v0.7.1: https://docs.nvidia.com/dynamo/v-0-7-1/llms.txt
> - v0.7.0: https://docs.nvidia.com/dynamo/v-0-7-0/llms.txt

> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.nvidia.com/dynamo/llms.txt. For full content including API reference and SDK examples, see https://docs.nvidia.com/dynamo/llms-full.txt.

# Text-to-Audio

Text-to-audio (TTS) generation runs a vLLM-Omni worker with `--output-modalities audio`. See the [Diffusion Overview](/dynamo/dev/diffusion/overview) for installation and shared configuration.

## Tested Models

| Model | Notes |
|---|---|
| `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice` | Default model; predefined speakers |
| `Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign` | Describe a voice via `instructions` |
| `nvidia/Nemotron-Labs-Audex-2B` | Single built-in voice; optional `nvext.cfg_scale` guidance |
| `nvidia/Nemotron-Labs-Audex-30B-A3B` | Same contract as the 2B; needs an explicit stage config |

## Launch

Launch using the provided script with `Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice`:

```bash
bash examples/backends/vllm/launch/agg_omni_audio.sh
```

The same script serves Nemotron Audex, which runs a two-stage pipeline: stage 0 is the thinker that emits speech codec tokens, and stage 1 decodes those tokens to a 16 kHz mono waveform.

```bash
bash examples/backends/vllm/launch/agg_omni_audio.sh --model nvidia/Nemotron-Labs-Audex-2B
```

Both Audex checkpoints report the same model type, so the 30B-A3B needs an explicit stage configuration. Otherwise auto-detection selects the 2B-tuned file. vLLM-Omni ships the configuration, so resolve it from the installed package and pass it through to the worker:

```bash
AUDEX_30B_CFG=$(python3 -c 'import pathlib, vllm_omni; print(pathlib.Path(vllm_omni.__file__).parent / "deploy/audex_tts_30b.yaml")')
bash examples/backends/vllm/launch/agg_omni_audio.sh \
  --model nvidia/Nemotron-Labs-Audex-30B-A3B \
  --stage-configs-path "$AUDEX_30B_CFG"
```

## Generate Speech

<Tabs>
<Tab title="CustomVoice (predefined speaker)">

```bash
curl -X POST http://localhost:8000/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Hello, how are you?",
    "voice": "vivian",
    "language": "English"
  }' --output output.wav
```

</Tab>
<Tab title="CustomVoice + style">

```bash
curl -X POST http://localhost:8000/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "input": "I am so excited!",
    "voice": "vivian",
    "instructions": "Speak with great enthusiasm"
  }' --output excited.wav
```

</Tab>
<Tab title="VoiceDesign (describe a voice)">

```bash
bash examples/backends/vllm/launch/agg_omni_audio.sh --model Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign

curl -X POST http://localhost:8000/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Hello world",
    "task_type": "VoiceDesign",
    "instructions": "A warm, friendly female voice with a gentle tone"
  }' --output voicedesign.wav
```

</Tab>
<Tab title="Audex (guided speech)">

```bash
curl -X POST http://localhost:8000/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nvidia/Nemotron-Labs-Audex-2B",
    "input": "Hey, this is generated using Dynamo!",
    "nvext": {"cfg_scale": 1.5}
  }' --output audex.wav
```

Audex serves a single built-in voice, so it accepts `voice` only when omitted or set to `default`, and rejects `ref_audio` and `ref_text` instead of synthesizing a different-sounding result. The Qwen3-TTS fields `language`, `instructions`, and `task_type` do not apply. Omit `nvext.cfg_scale`, or set it to `1.0`, to decode without guidance.

</Tab>
</Tabs>

## Parameters

The `/v1/audio/speech` endpoint follows the [vLLM-Omni](https://docs.vllm.ai/projects/vllm-omni/en/latest/) API format. TTS-specific parameters are top-level fields, except single-model knobs, which ride in `nvext`:

<ParamField path="input" type="string" required={true}>
  Text to synthesize.
</ParamField>
<ParamField path="model" type="string" default="auto-detected">
  TTS model name.
</ParamField>
<ParamField path="voice" type="string" default="Vivian">
  Speaker name (e.g., vivian, ryan). Validated against model config.
</ParamField>
<ParamField path="response_format" type="wav | mp3 | pcm | flac | aac | opus" default="wav">
  Audio output format.
</ParamField>
<ParamField path="speed" type="float" default="1.0">
  Speed factor (0.25–4.0).
</ParamField>
<ParamField path="task_type" type="CustomVoice | VoiceDesign | Base" default="CustomVoice">
  Synthesis task type (Qwen3-TTS).
</ParamField>
<ParamField path="language" type="string" default="Auto">
  Language code. Validated against model config.
</ParamField>
<ParamField path="instructions" type="string">
  Voice style/emotion description. Required for VoiceDesign.
</ParamField>
<ParamField path="ref_audio" type="string">
  Reference audio URL or base64 data URI. Required for Base.
</ParamField>
<ParamField path="ref_text" type="string">
  Transcript of reference audio (Base task).
</ParamField>
<ParamField path="max_new_tokens" type="int" default="2048">
  Maximum tokens to generate (1–4096).
</ParamField>
<ParamField path="nvext.cfg_scale" type="float">
  Classifier-free guidance scale for Nemotron Audex (1.0–10.0). Model-specific, so it rides in `nvext` rather than at the top level (vLLM-Omni likewise takes it under `extra_params`). `1.0` disables guidance. Omitting the field decodes unguided on an Audex speech deployment, but an Audex text-to-audio (TTA) deployment falls back to its default of `3.0`. Ignored by other audio models.
</ParamField>

Available voices and languages are loaded dynamically from the model's `config.json` at startup. Nemotron Audex builds its own prompt and accepts only `input`, `model`, `response_format`, `speed`, `max_new_tokens`, and `nvext.cfg_scale`; speech models additionally tolerate `voice` when it is omitted or `default`, while an Audex TTA deployment rejects `voice` outright. Other non-Qwen3-TTS audio models (e.g., MiMo-Audio) use a generic text prompt and ignore TTS-specific parameters.

<Note>Audio streaming (`stream: true`) and the Base task (voice cloning) are not yet supported.</Note>

## See Also

- [Diffusion Overview](/dynamo/dev/diffusion/overview)
- [vLLM-Omni Configuration reference](/dynamo/dev/reference/backends/v-llm-omni-configuration)