ποΈ Qwen3-TTS Train
Fine-tune your own voice with the experimental one
- checkpoint_path
Every other node in this pack gets you a voice by cloning or designing one. Train goes a different way: it fine-tunes the actual model on a folder of your own audio, producing a checkpoint that knows your speaker cold. It's the most powerful node here and also the one the author himself would tell you to be careful with - the README says fine-tuning is experimental and that zero-shot cloning is recommended for best results. Read that as: the cloning path is the polished road, and Train is the workshop where you go when a specific voice has to be right, every time, and the clone just isn't cutting it.
How it works
You point audio_folder at a directory of speech samples (.wav, .mp3, .flac, .ogg, .m4a all accepted) for one speaker, choose an init_model to start from (default: the 1.7B Base - note the source restricts things sensibly here), and a tokenizer (the 12Hz tokenizer, the only option). The node runs SFT-style fine-tuning with AdamW, batching through your clips for num_epochs epochs, accumulating gradients (gradient_accumulation_steps, default 4) to fake a bigger batch on small VRAM, at learning_rate (default 2e-5, the sane LoRA-family starting point). Every validate_every epochs it saves a checkpoint to output_dir and runs a validation pass - synthesizing your test_text in the new speaker_name voice - so you can hear how training is going without waiting until the end. Checkpoints land as checkpoint-epoch-N folders containing a config.json and model.safetensors, and the node returns the final checkpoint_path as a string.
That path is what you hand back to the inference nodes: feed it into custom_model_path on VoiceClone or CustomVoice (with custom_speaker_name set) to speak in your trained voice.
Inputs that matter
For a first run, keep it minimal: audio_folder, output_dir, speaker_name, test_text, and num_epochs. The rest - learning_rate, batch_size, gradient_accumulation_steps, validate_every - are the knobs you tune only after the defaults don't converge. Expect this to be slow and VRAM-hungry compared to generation; it's training, after all. The README's model directory note applies here too: it's worth pre-downloading the init model so training isn't fighting HuggingFace timeouts.
Install
Train 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. The pack-wide gotcha applies hardest here because training exercises the model stack relentlessly: transformers 5.0+ breaks the pack, so pin pip install "transformers>=4.57.0,<5.0.0". The requirements file also pulls in safetensors and scipy, which this node needs.
Common issues
"Audio folder not found" is the first thing beginners hit - give an absolute path, not a relative one. Beyond that, the failure modes are training failures, not node failures: small or mono-tone datasets produce a speaker that sounds like the model phoned it in, and a too-high learning rate diverges into noise. Check the validation generations each validate_every checkpoint rather than waiting for the final one. And before you burn a weekend training, try the zero-shot clone - the author's own advice, and for most voices it's genuinely good enough.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| init_model | COMBO | Qwen/Qwen3-TTS-12Hz-1.7B-Base | 6 options: Qwen/Qwen3-TTS-Tokenizer-12Hz, Qwen/Qwen3-TTS-12Hz-1.7B-Base, Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign, Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice, Qwen/Qwen3-TTS-12Hz-0.6B-Base, Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice |
| tokenizer | COMBO | Qwen/Qwen3-TTS-Tokenizer-12Hz | 1 options: Qwen/Qwen3-TTS-Tokenizer-12Hz |
| audio_folder | STRING | β | |
| output_dir | STRING | /tmp/ComfyUI/output/qwen3tts_finetune | β |
| speaker_name | STRING | new_speaker | β |
| test_text | STRING | Hello, this is a test of my new voice. | β |
| language | COMBO | English | 5 options: Auto, Chinese, English, Japanese, Korean |
| learning_rate | FLOAT | 01e-7β0.001 | β |
| num_epochs | INT | 101β100 | β |
| batch_size | INT | 11β8 | β |
| gradient_accumulation_steps | INT | 41β64 | β |
| validate_every | INT | 21β10 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| checkpoint_path | STRING | β |