VoxCPM TTS
Describe One Instead
- Generated Audio
Most TTS nodes make you bring a reference clip before they'll talk to you. This one doesn't. VoxCPM2 TTS turns plain text into 48kHz speech in 30 languages with no voice sample at all - you just describe the voice you want. "A deep male voice, calm and authoritative" is a complete prompt. That's the party trick, and it's why this is the node people open before they realize the pack can clone voices too.
It wraps VoxCPM2, OpenBMB's 2B tokenizer-free diffusion TTS built on a MiniCPM-4 backbone with the AudioVAE V2 codec. "Tokenizer-free" is the architectural hook: instead of snapping audio into discrete tokens, it generates continuous latents autoregressively and runs them through the diffusion decoder, which is why the output sounds less robotic than the old token-TTS generation. The model is genuinely multilingual - English, Chinese, Japanese, Russian, Swahili, all 30 languages it was trained on, no language tag needed. Just type and let it figure it out.
What you actually set
The node has a big input list, but most of it is set-and-forget. The ones that matter:
text- what it says. Keep the defaultnormalize_texton; it handles numbers, abbreviations and punctuation. Turn it off only if you're feeding phonemes like{HH AH0 L OW1}.voice_description- your voice design prompt. The node wraps it in parentheses and prepends it to the text, matching VoxCPM's(description)textAPI format. The author's examples are the ones to steal: "A young woman, gentle and sweet voice", "An old man with a gravelly, slow voice". Expect variation between runs here - voice design is a generative coin flip, so the README's advice to generate 1–3 times and pick is not optional.cfg_value(default 2.0) - classifier-free guidance. Raise toward 10 for stricter prompt adherence, lower for looser, more natural reads. 2 is a good place to stay.inference_timesteps(default 10) - diffusion steps. 10 is fast-draft territory; 15–25 buys quality at a real time cost.max_tokens(default 4096) - caps how long the clip can be. You'll rarely touch it.
The lora_name dropdown pulls from models/loras if you've trained a LoRA with the training half of this pack - more on that elsewhere, but know the hook exists. seed (-1 for random), dtype (auto picks bf16 on Ampere-and-up GPUs, fp16 below), device, and force_offload are the standard knobs. torch_compile is the interesting one: the first run burns a couple of minutes compiling kernels, then every run after is faster. Worth it if you're doing a batch.
Output
One output: Generated Audio (an AUDIO tensor at the model's 48kHz sample rate). Wire it into any ComfyUI audio sink - a save node, the preview, or down the line into a talking-head pipeline once you have a face to animate.
Install
ComfyUI Manager is the easy path - search "ComfyUI-VoxCPM2" and install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Saganaki22/ComfyUI-VoxCPM2.git
cd ComfyUI-VoxCPM2
pip install -r requirements.txt
Then restart ComfyUI. The first generation downloads the ~2B model into ComfyUI/models/tts/VoxCPM/, so your first run is a download disguised as a TTS call. One Windows-specific trap: on Python 3.13+, pip install can choke on editdistance with a pdm.backend error - the README's fix is pip install pdm-backend and setting CL=/utf-8 before retrying.
Where people get burned
Audio packs in ComfyUI are the wild frontier - this is exactly the "model is good, integration is a maintained workaround" corner of the ecosystem, and dependency conflicts are the default failure mode. If the node errors at load, check that requirements.txt actually installed cleanly (the voxcpm package is the load-bearing one). For quality complaints, the honest answer is usually timesteps or a second generation: this model's weakness is variance on long or very expressive inputs, not the voice it lands on. And remember it's a TTS model, not a teleprompter - a paragraph reads fine, but keep the input to what a human would actually say aloud.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | VoxCPM2 | Select the VoxCPM model to use. |
| lora_name | COMBO | None | LoRA checkpoint from models/loras. Set to None to disable. |
| voice_description | STRING | Voice design description (optional). E.g. 'A young woman, gentle and sweet voice'. Wrapped in parentheses and prepended to text. | |
| text | STRING | Hello, welcome to VoxCPM! | Target text to synthesize into speech. |
| cfg_value | FLOAT | 2.01–10 | Classifier-Free Guidance scale. Higher = more adherence to prompt, lower = more natural variation. |
| inference_timesteps | INT | 101–100 | Number of diffusion steps. More steps = better quality but slower. |
| max_tokens | INT | 409664–8192 | Maximum generation length in tokens. Controls max audio duration. |
| normalize_text | BOOLEAN | true | Auto-process numbers, abbreviations, and punctuation. Turn OFF for phoneme input. |
| seed | INT | 42-1–18446744073709550000 | Random seed for reproducibility. -1 = random each run. |
| force_offload | BOOLEAN | false | Fully unload model from VRAM and RAM after generation. |
| dtype | COMBO | auto | Model dtype. Auto uses native bf16 (fp16 on older GPUs). |
| device | COMBO | cpu | Inference device. |
| torch_compile | BOOLEAN | false | Enable torch.compile optimization (first run compiles kernels, subsequent runs are faster). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| Generated Audio | AUDIO | — |