VoxCPM TTS (Advanced)
When 'Good Enough' Isn't the Point
- reference_audio
- AUDIO
- STRING
The plain VoxCPM TTS node works out of the box, and that's the problem - you can't fix what you can't touch. VoxCPM TTS (Advanced) (AILab_VoxCPMTTS_Advanced) is the same OpenBMB VoxCPM 1.5 diffusion-TTS engine from the same pack, but with every dial dragged out into the open. Same voice, same model, same auto-download to ComfyUI/models/TTS/VoxCPM1.5/. What you get here is control: quality-versus-speed, guidance, retry logic, fade-in, and text normalization.
Reach for it when the basic node gives you something close but not right - a voice that sounds off, a render that takes too long, or a reference clip the auto-transcriber mangled.
The knobs that actually matter
The required inputs beyond text and model are where the fun lives:
cfg_value(1–10, default 2.0) - guidance scale. Higher clings to your text; lower sounds more natural. Community experience says stay around 2–3; push past 4 and speech gets robotic.inference_steps(1–100, default 10) - diffusion steps. 5 is fast-but-rough, 20 is cleaner. Diminishing returns past ~20, so don't crank it just because you can.max_length(256–8192, default 4096) - the token ceiling. Long scripts need more; the flip side is that a high ceiling costs VRAM even when your text is short.normalize(default on) - expands numbers, punctuation, and symbols into spoken form viawetext. Turn it off if you're doing something unusual and the node starts reading "1,000" in ways you hate.
The rest are quality-of-life. fade_in_ms (default 20) applies a fade to kill the click at the start of a clip - a real VoxCPM artifact. retry_attempts (default 2) and retry_threshold (default 8.0) run a clever self-check: it transcribes what it generated, compares the audio-to-text ratio, and regenerates if something came out garbled. That's why this node sometimes takes three times as long - it's fixing bad takes for you.
Voice cloning works like the basic node: connect reference_audio, and either type reference_text or enable auto_transcribe_reference to let faster-whisper do it. show_transcription_log prints the ASR result to your console - leave it on, it's the fastest way to see if the transcript came out wrong. unload_model frees VRAM after each generation, device picks cuda/mps/cpu, and seed at -1 is random.
Outputs
You get AUDIO (the standard ComfyUI {waveform, sample_rate} dict, 44.1kHz for VoxCPM 1.5) and a STRING output holding the reference text that was used. The pack doesn't ship a save node, so route the AUDIO output into a Save Audio node from VideoHelperSuite (VHS) to actually write the file.
Installing it
Same pack as the basic node, so if you already have that, this one's already installed. Otherwise: ComfyUI Manager, search "VoxCPMTTS", or:
cd ComfyUI/custom_nodes/
git clone https://github.com/1038lab/ComfyUI-VoxCPMTTS.git
cd ComfyUI-VoxCPMTTS
pip install -r requirements.txt
Restart after. Heavy deps to expect: faster-whisper, wetext, plus the ~1.2GB model download on first run and a separate Whisper model if you auto-transcribe.
Troubleshooting
- "Reference text is required" error - you plugged in
reference_audiobut leftreference_textempty andauto_transcribe_referenceoff. One or the other, always. - Slow generation - check
retry_attempts; a bad reference is silently triggering re-runs. Fix the reference, not the retries. - Metallic sound at the end of long sentences - known VoxCPM 1.5 quirk. Lower
cfg_valuea bit, or split the text. - OOM - cut
max_length, dropinference_steps, or flipunload_modelon.
Start from the basic node's defaults (they're good), then change one knob at a time and listen. For local TTS in ComfyUI, this is the version you graduate to - and you'll likely stay.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | VoxCPM 1.5 | Select VoxCPM model version |
| text | STRING | Hello, this is VoxCPM TTS. | Text to synthesize into speech |
| cfg_value | FLOAT | 2.01–10 | Guidance scale: higher = more adherence to prompt, lower = more natural |
| inference_steps | INT | 101–100 | Number of diffusion steps: higher = better quality, lower = faster |
| max_length | INT | 4096256–8192 | Maximum token length during generation |
| normalize | BOOLEAN | true | Enable text normalization for numbers, punctuation, etc. |
| reference_audioopt | AUDIO | Reference audio for voice cloning | |
| reference_textopt | STRING | Text transcript of reference audio (leave empty for auto-transcription) | |
| fade_in_msopt | INT | 200–1000 | Fade-in duration to reduce initial artifacts (0-1000ms) |
| auto_transcribe_referenceopt | BOOLEAN | false | Automatically transcribe reference audio when no text is provided |
| show_transcription_logopt | BOOLEAN | true | Show ASR transcription logs in console |
| unload_modelopt | BOOLEAN | false | Unload model after generation to free VRAM |
| retry_attemptsopt | INT | 20–10 | Number of retry attempts for bad cases |
| retry_thresholdopt | FLOAT | 8.02–20 | Audio-to-text ratio threshold for retry detection |
| deviceopt | COMBO | auto | Device to run the model on |
| seedopt | INT | -1-1–18446744073709550000 | Random seed (-1 for random) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |
| STRING | STRING | — |