π Qwen3-TTS VoiceClonePrompt
Extract a voice once, reuse it everywhere
- ref_audio
- voice_clone_prompt
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.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| ref_audio | AUDIO | Reference audio (ComfyUI Audio) | |
| ref_text | STRING | β | |
| model_choice | COMBO | 0.6B | 2 options: 0.6B, 1.7B |
| device | COMBO | auto | 5 options: auto, cuda, xpu, mps, cpu |
| precision | COMBO | bf16 | 2 options: bf16, fp32 |
| attention | COMBO | auto | Attention implementation |
| x_vector_onlyopt | BOOLEAN | false | If True, only speaker embedding is extracted (ref_text not needed) |
| unload_model_after_generateopt | BOOLEAN | false | Unload model from memory after generation |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| voice_clone_prompt | VOICE_CLONE_PROMPT | β |