Qwen3-TTS Voice Design ⚡
Cast a voice with a sentence, not a sample
- audio
Sometimes there's no voice to borrow. You need a narrator, an announcer, a snarky shopkeeper - and you have nothing on disk to clone from. Voice Design is the node that takes a written description of a voice and speaks your text with it.
That's the whole reason it exists next to Voice Clone: cloning needs a recording, describing needs only words. Qwen3-TTS is unusual in shipping both as separate checkpoints, and it's the reason you can't have per-line emotional control and a cloned identity in one pass - those are two different models.
How it works
The node loads a *-VoiceDesign checkpoint in-node and calls the model's own voice-design generation path. Your instruct isn't a prompt-engineering trick bolted on top; it's conditioning the checkpoint was trained to follow, which is why phrasing it like a casting note works better than phrasing it like a tag soup.
There's one checkpoint family here: 1.7B. The model_choice dropdown still lists 0.6B - matching the rest of the family - but asking for it raises "VoiceDesign only supports 1.7B models". The default is correct, so in practice: don't touch it.
Inputs
- text - the line to speak.
- instruct - the casting note, and it's mandatory. With either field empty the node raises "Text and instruction description are required". Age, gender, timbre, pace, accent and mood all in one sentence is the shape that works: "a deep, slow male voice with a calm, documentary tone and a faint Scottish accent".
- language - Auto, or pick one of ten: Chinese, English, Japanese, Korean, French, German, Spanish, Portuguese, Russian, Italian.
- seed, plus max_new_tokens and the sampling knobs (
top_p,top_k,temperature,repetition_penalty) if you want to chase a delivery.control_after_generateis on the seed, so auditioning variations is a click. - attention, precision, device -
auto,bf16,autoare fine. Sage and flash attention get picked automatically if they're installed; pre-Ampere cards fall back to eager and fp32 on their own. - unload_model_after_generate - frees the checkpoint after each run.
Output is one AUDIO socket. Into SaveAudio, into a video, or into the mouth of a talking-head pass.
Install
ComfyUI Manager, search the pack title, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
pip install -r ComfyUI-GGUF-Loader/requirements.txt
The qwen-tts package is what these nodes need - it's the optional entry in that requirements file, and if the import fails, every Qwen3-TTS node quietly vanishes from the menu. The VoiceDesign checkpoint downloads on first run:
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign --local-dir ComfyUI/models/Qwen3-TTS/Qwen3-TTS-12Hz-1.7B-VoiceDesign
Keeping a voice you designed
Voice Design outputs audio, not a reusable prompt - which means there's no "save this voice" button on the node itself. The workaround is a two-step and it's worth knowing, because it turns a lucky generation into a permanent voice: wire the generated audio into Qwen3-TTS Voice Clone Prompt's ref_audio, type the transcript into its ref_text, and you get a VOICE_CLONE_PROMPT you can hand to Save Voice. From then on it behaves exactly like a cloned voice, no description required.
Where people get burned
The honest limitation first: instruction adherence is uneven. Descriptions that sound vivid to you can come out bland, and accent requests are the flakiest part - there's a well-worn complaint from users describing Voice Design as flat and stuck on a generic American read no matter what they ask for. Iterate the seed before rewriting the description, and expect to throw away a few takes.
Second: it's not a clone. Design doesn't give you the same voice across every generation unless you do the prompt round-trip above, and it can't borrow a real person's timbre at all. If you have a reference recording, save yourself the trouble and use Voice Clone.
Third: the 1.7B checkpoint is the only option here, so there's no smaller version to drop to on a tight card. That's the pack's dependency stack plus one 1.7B model - real, but not free. In a mixed image workflow, unload_model_after_generate is your friend.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Hello world | — |
| instruct | STRING | — | |
| model_choice | COMBO | 1.7B | 2 options: 0.6B, 1.7B |
| device | COMBO | auto | 5 options: auto, cuda, xpu, mps, cpu |
| precision | COMBO | bf16 | 2 options: bf16, fp32 |
| language | COMBO | Auto | 11 options: Auto, Chinese, English, Japanese, Korean, French, +5 |
| seedopt | INT | 00–18446744073709550000 | — |
| max_new_tokensopt | INT | 2048512–4096 | — |
| top_popt | FLOAT | 1.000–1 | Nucleus sampling probability |
| top_kopt | INT | 500–100 | Top-k sampling parameter |
| temperatureopt | FLOAT | 0.90.1–2 | Sampling temperature |
| repetition_penaltyopt | FLOAT | 1.051–2 | Penalty for repetition |
| attentionopt | COMBO | auto | Attention implementation |
| unload_model_after_generateopt | BOOLEAN | false | Unload model from memory after generation |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |