Nodes/Qwen3-TTS - Voice Synthesis & Cloning/🎭 Qwen3-TTS VoiceClonePrompt
ComfyUI Node

🎭 Qwen3-TTS VoiceClonePrompt

Extract a voice once, reuse it everywhere

By flybirdxxΒ·Created 7 months agoΒ·Updated 3 months agoΒ· 1,874
🎭 Qwen3-TTS VoiceClonePrompt
  • ref_audio
  • voice_clone_prompt
β—„ref_textβ–Ί
β—„model_choice0.6Bβ–Ί
β—„deviceautoβ–Ί
β—„precisionbf16β–Ί
β—„attentionautoβ–Ί
β—„x_vector_onlyfalseβ–Ί
β—„unload_model_after_generatefalseβ–Ί

VoiceClone can take a raw reference clip and clone it in one step. So why would you ever run an extra node to extract the voice first? Because extraction is the expensive, variable part - and this node lets you do it once and reuse the result. VoiceClonePrompt takes your reference audio, runs it through the model to pull out the speaker's voice features, and hands you a reusable voice_clone_prompt object. That object plugs straight into VoiceClone (instead of a fresh reference clip), into RoleBank for dialogue, or into SaveVoice to persist it. The pack's own pitch says it: extract a prompt item once, use it across many generations for faster, more consistent results.

How it works

The required inputs are ref_audio (any standard ComfyUI AUDIO) and ref_text - the transcript of what's actually spoken in that clip. That transcript isn't decoration: Qwen3-TTS uses it to align the voice's timbre with its content, and the README calls providing it "highly recommended." There's an escape hatch: the x_vector_only toggle, which extracts only the speaker embedding and skips text conditioning entirely - useful when you have clean voice audio but no transcript. The tradeoff is real, though: the text-conditioned path is where most of the quality lives.

Other inputs are the pack's standard stack: model_choice (0.6B for speed, 1.7B for quality - default 0.6B), device, precision, attention, and unload_model_after_generate. Output is a single voice_clone_prompt.

The reason to bother with the extra node: consistency. Extract once, and every VoiceClone fed from that prompt is drawing on the identical features - no re-encoding drift between runs. And because the features come out cached, the actual generation is faster too.

The workflow shape

The intended pattern is: VoiceClonePrompt does the one-time extraction; VoiceClone (fed the prompt) does the repeatable generation; SaveVoice persists the prompt if you want it on disk. If you're building multi-character dialogue, extract each character's voice with a VoiceClonePrompt and wire them all into RoleBank.

Install

VoiceClonePrompt ships in flybirdxx/ComfyUI-Qwen-TTS ("Qwen3-TTS - Voice Synthesis & Cloning"). ComfyUI Manager: search "Qwen3-TTS". Or:

cd ComfyUI/custom_nodes
git clone https://github.com/flybirdxx/ComfyUI-Qwen-TTS
cd ComfyUI-Qwen-TTS
pip install -r requirements.txt

Restart ComfyUI. Pin transformers below 5.0 - the pack breaks on transformers 5.0+ (pip install "transformers>=4.57.0,<5.0.0"). First run auto-downloads the Base model and tokenizer into models/qwen-tts/; pre-fetch with python download_models.py if the wait annoys you.

Common issues

The stuttery-clone failure people hit with this pack almost always originates here: a bad or noisy reference, a wrong ref_text, or a clip that's far outside the ideal 5–15 second window. The pack's own README tells you the recipe - clean, noise-free audio, 5–15 seconds, with the correct transcript - and it's genuinely the difference between "huh, that's me" and "garbled first word on loop." If you get a bad extraction, don't try to fix it downstream; fix the reference audio and re-extract. And remember x_vector_only is a quality tradeoff, not a free shortcut - only use it when you truly don't have the transcript.

CategoryQwen3-TTS

Inputs (8)

NameTypeDefaultDescription
ref_audioAUDIOReference audio (ComfyUI Audio)
ref_textSTRINGβ€”
model_choiceCOMBO0.6B2 options: 0.6B, 1.7B
deviceCOMBOauto5 options: auto, cuda, xpu, mps, cpu
precisionCOMBObf162 options: bf16, fp32
attentionCOMBOautoAttention implementation
x_vector_onlyoptBOOLEANfalseIf True, only speaker embedding is extracted (ref_text not needed)
unload_model_after_generateoptBOOLEANfalseUnload model from memory after generation

Outputs (1)

NameTypeDescription
voice_clone_promptVOICE_CLONE_PROMPTβ€”