Qwen3 TTS Batch Generate (Fast)
One line in, one clip per line out
- model
- clone_prompt
- AUDIO
The node for when you have a script - a list of lines - and want a clip per line without hand-running one generate node per paragraph. You paste the whole script into a single multiline box, and it produces one AUDIO clip per non-empty line, output as a list of AUDIO. That last part is the detail that trips people up: this isn't a single clip out, it's AUDIO[], so save nodes that eat one clip won't take it directly - you wire it into something list-aware or split it.
Batch is where the "Fast" in the pack name stops being a nice-to-have and becomes the whole point. Qwen3-TTS is genuinely good but was slow per clip; with CUDA-graph acceleration it chews through a multi-line narration fast enough that "generate the whole voiceover, then tweak" is a viable workflow instead of a punishment. The console even prints batch stats after a run - clips, total audio seconds, wall time, and a real-time factor - which is oddly satisfying on a 40-line batch.
How it works
A line in the text_list box is a clip out, split on separator (default newline; change it if your script already uses newlines inside lines, though honestly newline is right for 99% of cases). Generation runs sequentially on the loaded model - one generation at a time is a hard limit of this architecture - and each clip gets the seed bumped by one per line if increment_seed is on (default), so lines don't all come out with identical delivery.
The voice comes from one of two places, and which one works depends on your checkpoint:
clone_promptinput connected → every line uses that cloned voice. This is the right way to batch narration: build the voice once with Create Clone Prompt, then generate a whole script in that voice. Needs a Base checkpoint.- Otherwise → the
speakerpreset dropdown (Vivian, Serena, Uncle_Fu, …) with no clone, which needs a CustomVoice checkpoint. There's notext-per-line beyondtext_list, so this node's other job - beyond batching - is choosing which voice engine is driving.
language, seed, and the sampling trio (max_new_tokens 2048, temperature 1.0, top_p 0.8, repetition_penalty 1.1) apply across all lines. Same fast-path caveat: temperature is a mild nudge, not a drama switch.
How to install it
One pack, one install - ComfyUI Manager, search "Qwen3-TTS", install, restart:
cd ComfyUI/custom_nodes
git clone https://github.com/YildirimMC/ComfyUI-Qwen3-TTS-Fast
pip install -r ComfyUI-Qwen3-TTS-Fast/requirements.txt
NVIDIA GPU needed; the checkpoint downloads itself into ComfyUI/models/TTS/ on first use.
Common issues
"text_list is empty after splitting" - the separator isn't what's actually in your box (a Windows paste can smuggle in \r\n). Set separator to \r\n, or just re-paste with plain newlines.
Save node refuses the output - remember it's a list of AUDIO. You need a list-capable consumer, or run lines individually through a single-clip node if your save node can't iterate.
A batch stops dead mid-way - sequential generation means one bad long line can blow the cache budget and take the batch with it (max_new_tokens clamped to max_seq_len - 256). Split long lines, or raise max_seq_len on the Loader.
Voice is wrong for every line - checkpoint mismatch: CustomVoice checkpoint for the speaker mode, Base checkpoint when you're feeding a clone prompt. Check the loader's model_name before blaming the batch.
If your end goal is a talking head, this is the front end: batch-generate the dialogue lines, then feed the per-line AUDIO clips into an audio-driven avatar workflow in order.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | QWEN3TTS_FAST | — | |
| text_list | STRING | Line 1 Line 2 Line 3 | — |
| separator | STRING | — | |
| language | COMBO | 11 options: Auto, Chinese, English, Japanese, Korean, German, +5 | |
| seed | INT | 00–18446744073709550000 | — |
| speakeropt | COMBO | 9 options: Vivian, Serena, Uncle_Fu, Dylan, Eric, Ryan, +3 | |
| clone_promptopt | QWEN3TTS_FAST_PROMPT | — | |
| increment_seedopt | BOOLEAN | true | — |
| max_new_tokensopt | INT | 20481–8192 | — |
| temperatureopt | FLOAT | 1.000.1–2 | — |
| top_popt | FLOAT | 0.800.1–1 | — |
| repetition_penaltyopt | FLOAT | 1.101–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |