Qwen TTS Voice Design Node
Design a voice with a sentence instead of hunting for a sample
- model
- tokenizer
- AUDIO
Most TTS makes you either pick from a menu of preset voices or find a clean sample to clone. This node does the third thing: you describe the voice in plain English - "a warm, slightly gravelly audiobook narrator, mid-pace, subtle British accent" - and Qwen3's VoiceDesign model invents it. That's the feature that got the Qwen3-TTS release thread attention in the first place: fine control over timbre, prosody and emotion from natural language, no reference clip at all.
It's one of the more fun nodes in the pack, and also the one where "describe what you want" genuinely works instead of being a gimmick. The tradeoff is that it's a big model doing heavy lifting, so it's the slowest and most VRAM-hungry TTS node here.
What it needs
- model - the
voice_design_modeloutput fromQwenTTSModelDownloader. This is not the same model as the clone one; they're separate weights. - tokenizer - the tokenizer output from the same downloader.
- text - what the voice actually says. Required.
- instruct - the voice/style instruction. Required input, but it's fine to pass empty text if you want the model to just pick a default voice. The more concrete you are ("breathy, slow, conspiratorial"), the better it follows.
- language - Auto plus ten languages: Chinese, English, Japanese, Korean, French, German, Spanish, Portuguese, Russian, Italian.
The sampling controls are the familiar LLM dials - temperature (1.0), top_p (0.8), top_k (20), repetition_penalty (1.05), max_new_tokens (2048), seed (0). For expressive reads, people often nudge temperature up and repetition_penalty a touch higher; if the voice keeps repeating or flattening, that penalty is the first knob to turn. All the RNGs (torch, numpy, CUDA) get seeded from the single seed input, so identical inputs reproduce.
What comes out
One output: a standard ComfyUI AUDIO object (waveform + sample rate). Save it with any audio saver you like - VHS or the pack's own save-audio node - or preview it. There's no text-to-audio for multiple lines here; that's the Multi Speaker node's job. This is a single read.
Install
Part of the Vantage-Nodes pack:
cd ComfyUI/custom_nodes
git clone https://github.com/vantagewithai/Vantage-Nodes.git
pip install -r requirements.txt
or ComfyUI Manager → search "Vantage-Nodes" → Install → restart. Download the models first with QwenTTSModelDownloader (several GB on first run; the voice-design repo is the big one). If you only ever use the clone or design path, note that you don't strictly need the other models downloaded - the downloader grabs all four at once though, so there's no way to be picky without downloading manually.
Common issues
- CUDA out of memory - the code handles it gracefully: it unloads the model, empties the cache, and suggests the fixes in the error message. They're the right fixes - lower
max_new_tokens, switch attention tosdpa, make sure you're actually on bf16, close other GPU apps. VoiceDesign is the heaviest TTS node here, so this is the one you're most likely to hit it on. - Voice ignores your instruction - the instruction is text fed through the same pipeline as the content, so very long or very abstract instructions dilute. Keep it short and concrete.
- bf16 refusal on CPU/MPS -
bf16only runs on CUDA. On Apple silicon or CPU-only boxes, re-run the downloader withdtype = fp32. - Slow generation - expected. 1.7B + sampling over many tokens on a consumer card is minutes, not seconds. Set
unload_model_after_generateon to get your VRAM back when it's done.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | QWEN_TTS_MODEL | — | |
| tokenizer | QWEN_TTS_TOKENIZER | — | |
| text | STRING | — | |
| instruct | STRING | — | |
| language | COMBO | Auto | 11 options: Auto, Chinese, English, Japanese, Korean, French, +5 |
| device | COMBO | inherit | 5 options: inherit, auto, cuda, mps, cpu |
| attention | COMBO | inherit | 6 options: inherit, auto, sage_attn, flash_attn, sdpa, eager |
| seedopt | INT | 0 | — |
| max_new_tokensopt | INT | 2048 | — |
| top_popt | FLOAT | 0.80 | — |
| top_kopt | INT | 20 | — |
| temperatureopt | FLOAT | 1.00 | — |
| repetition_penaltyopt | FLOAT | 1.05 | — |
| unload_model_after_generateopt | BOOLEAN | false | Unload model from memory after generation |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |