VoxCPM_SM_Model
Your Whole TTS Voice Engine in One Node
- model
Every VoxCPM workflow in ComfyUI starts here. This is the loader - the node that pulls VoxCPM1.5 or VoxCPM2 off your disk, fuses it with an audio VAE, optionally bolts on a GGUF-quantized backbone and a LoRA, and hands you a single model output that the VoxCPM_SM_KSampler turns into speech. Nothing else in the pack runs without it, and it's the one you'll fiddle with first.
If you've never met VoxCPM: it's OpenBMB's tokenizer-free TTS, the model behind the 2025 paper, a diffusion-autoregressive system that generates continuous speech directly instead of predicting discrete tokens the way older TTS does. That's the mechanism behind the two things people actually want from it: context-aware prosody and zero-shot voice cloning from a few seconds of reference audio. This node is where that engine gets assembled in ComfyUI.
What you actually set
Four combo boxes matter, plus one boolean worth knowing about:
dit- the language-model / diffusion backbone. DropVoxCPM.safetensors(1.5) orVoxCPM2.safetensors(v2) intoComfyUI/models/diffusion_models.vae- the audio VAE.audiovae.pthfor 1.5,VoxCPM2_audiovae.pthfor v2, inComfyUI/models/vae. Trap: the v2 VAE only outputs 16 kHz audio; 1.5 gives you 44.1 kHz.version-v15orv2. Match it to your files, or the node will try to load the wrong repo's config.gguf- the optional quantized backbone fromComfyUI/models/gguf. This is the VRAM escape hatch. The full VoxCPM2 safetensors is something like 96 GB; a Q6 GGUF runs inference in ~4.8 GB of VRAM, and the int8_convrot (2.4 GB) and int4_convrot (1.3 GB) variants go lower still - int4 reportedly runs in about 2 GB. GGUF Q6 is the sweet spot if it fits; Q8 is basically fp16 at half the size.lorapluslora_rank/lora_alpha/lora_dropout/enable_lm/enable_dit/enable_proj- LoRA loading. The nice part: when you load a LoRA trained by this pack, the node reads the training config out of the safetensors metadata and overrides your rank/alpha widgets for you. You only hand-set these for LoRAs without embedded config.denoise- loads an external denoiser on top. It can clean up output, but it restricts things to 16 kHz and can introduce distortion. Leave it off unless you know why you're turning it on.
The output is a single model socket (type VoxCPM_SM_Model). Feed it straight into the KSampler's model input. That's the whole wiring: loader → sampler.
Installing it
This is a real install, not a one-click. From ComfyUI/custom_nodes:
git clone https://github.com/smthemex/ComfyUI_VoxCPM_SM
cd ComfyUI_VoxCPM_SM
pip install -r requirements.txt
Restart ComfyUI, then grab the weights. The repo ships the config files but not the actual model - the weights come from HuggingFace (openbmb/VoxCPM1.5 or openbmb/VoxCPM2). You only need model.safetensors and the audio VAE, renamed into the folders above (model.safetensors → VoxCPM.safetensors for 1.5, → VoxCPM2.safetensors for v2). You can also find the quantized variants under the author's smthem/VoxCPM2-gguf-notcpp repo on HuggingFace.
The requirements list reads like a small ML party: torch>=2.5, torchaudio, transformers, funasr, modelscope, and a pinned datasets>=3,<4. That pin plus funasr is the kind of thing that collides with other packs' versions. If the loader dies on import with a transformers or datasets mismatch, that's the fight - and audio-in-ComfyUI is the corner where dependency conflict is the default failure mode. A dedicated venv for this pack is a reasonable move.
Gotchas
- The node asserts that you've picked both a model and a VAE: leave
ditorvaeonnoneand you get "Please select a valid model and vae." ditandggufare alternatives - you need one of them plus the VAE.- Don't reflexively download the 96 GB v2 safetensors. The quantized variants exist precisely because the full thing is silly on consumer hardware.
- The author, smthemex, is a one-person porting machine (LLM_party, Sonic, StoryDiffusion and friends), and the community reception is genuine enthusiasm plus an occasional "anyone got it running end-to-end?" thread. When a smthemex pack breaks, it's almost always the environment, not you.
Once this node loads and the KSampler starts talking, you're done with the fiddly part - the fun starts there.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| dit | COMBO | 1 options: none | |
| gguf | COMBO | 1 options: none | |
| vae | COMBO | 1 options: none | |
| version | COMBO | 2 options: v2, v15 | |
| lora | COMBO | 1 options: none | |
| lora_rank | INT | 328–128 | — |
| lora_alpha | INT | 161–128 | — |
| lora_dropout | FLOAT | 0.000–1 | — |
| enable_lm | BOOLEAN | true | — |
| enable_dit | BOOLEAN | true | — |
| enable_proj | BOOLEAN | false | — |
| denoise | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | VoxCPM_SM_Model | — |