FL Qwen3 TTS Training UI
Fine-tune a Qwen3 voice without leaving the graph — loss chart and all
- checkpoint_path
This is the node that makes this pack a full tool instead of a wrapper. Cloning gets you close to a voice; this trains the model on actual samples of it. Point it at a folder of audio clips with matching transcripts, and it fine-tunes the base Qwen3-TTS model into a custom voice, complete with a live training dashboard - epoch counter, loss readout, a stop button, and playable validation audio that updates as checkpoints land. That UI-on-a-node trick is the reason to use this pack over the other Qwen3-TTS wrappers floating around: nobody else ships the training loop as a ComfyUI citizen.
The cost of entry is real, though. This is full model fine-tuning, not LoRA. You need CUDA (it hard-codes cuda for training), a lot of RAM - the README says 16GB minimum, 32GB+ recommended - and patience, because you're training a 1.7B autoregressive model. It's the kind of thing you kick off and walk away from.
How it works
The node runs through five phases: it unloads everything ComfyUI has cached (VRAM is precious here), loads the base model fresh in a gradient-enabled context, pre-tokenizes your dataset with the 12Hz tokenizer, runs an AdamW training loop with gradient accumulation, and periodically saves a checkpoint and runs validation inference. The checkpoint isn't a LoRA - it's a full model directory copied from the base, with config.json rewritten to mark it as a CustomVoice model with your speaker baked in at ID 3000. That's what makes the trained voice show up in the Model Loader later.
The inputs that matter
model_name- must beQwen3-TTS-12Hz-1.7B-Base. The 0.6B model can't train (mismatched embedding dims - the node refuses with an explicit error), and CustomVoice/VoiceDesign models lack the speaker encoder training needs.audio_folder- a folder with pairs likesample1.wav+sample1.txt(the transcript). Supported: wav, mp3, flac, ogg, m4a.speaker_name- the name your trained voice gets. This is what you'll type as the speaker in Custom Voice afterwards.language+test_text- used for the validation audio you hear between checkpoints.num_epochs(default 10),validate_every(2),learning_rate(2e-6),batch_size(1),gradient_accumulation_steps(4),weight_decay,grad_clip- the real training knobs. The defaults are sane; batch 1 + grad accum 4 is effectively batch 4 with less VRAM.
Output: checkpoint_path (STRING) - the folder of the final trained model.
Installing
ComfyUI Manager → "FL Qwen3 TTS", or:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI-FL-Qwen3TTS.git
cd ComfyUI-FL-Qwen3TTS
pip install -r requirements.txt
Restart. Training additionally needs safetensors and scipy present - the node checks and tells you if they're missing.
Where people get burned
Three things, in order of frequency. First, a dataset with transcripts that don't match the audio - the training loop can't know, it just learns whatever pairing you gave it. Clean clips, accurate text, ideally a single consistent reference voice across samples. Second, picking the wrong model: the 0.6B variants refuse to train, and non-Base models refuse because they lack the speaker encoder - both are clear errors, but only after you've already burned load time. Third, forgetting this unloads your other models. The node deliberately wipes ComfyUI's model cache before it starts, so if your graph also holds a video or image model, expect it to be evicted. And don't try training on CPU or MPS - the training path is CUDA-only even though inference supports the other backends. Verify your checkpoint by loading it in the Model Loader (it auto-scans models/tts/Qwen3TTS/ for local models) and generating with your speaker_name in Custom Voice.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | Qwen3-TTS-12Hz-1.7B-Base | 5 options: Qwen3-TTS-12Hz-1.7B-Base, Qwen3-TTS-12Hz-1.7B-CustomVoice, Qwen3-TTS-12Hz-1.7B-VoiceDesign, Qwen3-TTS-12Hz-0.6B-Base, Qwen3-TTS-12Hz-0.6B-CustomVoice |
| tokenizer_name | COMBO | Qwen3-TTS-Tokenizer-12Hz | 1 options: Qwen3-TTS-Tokenizer-12Hz |
| audio_folder | STRING | — | |
| output_dir | STRING | /tmp/ComfyUI/output/qwen3tts_finetune | — |
| speaker_name | STRING | custom_speaker | — |
| language | COMBO | English | 10 options: Chinese, English, Japanese, Korean, German, French, +4 |
| test_text | STRING | Hello, this is a test of my fine-tuned voice. | — |
| num_epochsopt | INT | 101–100 | — |
| validate_everyopt | INT | 21–10 | — |
| learning_rateopt | FLOAT | 01e-7–0.001 | — |
| batch_sizeopt | INT | 11–32 | — |
| gradient_accumulation_stepsopt | INT | 41–64 | — |
| weight_decayopt | FLOAT | 0.0100–0.1 | — |
| grad_clipopt | FLOAT | 1.00–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| checkpoint_path | STRING | — |