ComfyUI Node

VoxCPM TTS

Describe One Instead

By Saganaki22·Created 5 months ago·Updated 4 months ago· 195
VoxCPM TTS
    • Generated Audio
    model_nameVoxCPM2
    lora_nameNone
    voice_description
    textHello, welcome to VoxCPM!
    cfg_value2.0
    inference_timesteps10
    max_tokens4096
    normalize_texttrue
    seed42
    force_offloadfalse
    dtypeauto
    devicecpu
    torch_compilefalse

    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 default normalize_text on; 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)text API 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.

    Categoryaudio/tts

    Inputs (13)

    NameTypeDefaultDescription
    model_nameCOMBOVoxCPM2Select the VoxCPM model to use.
    lora_nameCOMBONoneLoRA checkpoint from models/loras. Set to None to disable.
    voice_descriptionSTRINGVoice design description (optional). E.g. 'A young woman, gentle and sweet voice'. Wrapped in parentheses and prepended to text.
    textSTRINGHello, welcome to VoxCPM!Target text to synthesize into speech.
    cfg_valueFLOAT2.01–10Classifier-Free Guidance scale. Higher = more adherence to prompt, lower = more natural variation.
    inference_timestepsINT101–100Number of diffusion steps. More steps = better quality but slower.
    max_tokensINT409664–8192Maximum generation length in tokens. Controls max audio duration.
    normalize_textBOOLEANtrueAuto-process numbers, abbreviations, and punctuation. Turn OFF for phoneme input.
    seedINT42-1–18446744073709550000Random seed for reproducibility. -1 = random each run.
    force_offloadBOOLEANfalseFully unload model from VRAM and RAM after generation.
    dtypeCOMBOautoModel dtype. Auto uses native bf16 (fp16 on older GPUs).
    deviceCOMBOcpuInference device.
    torch_compileBOOLEANfalseEnable torch.compile optimization (first run compiles kernels, subsequent runs are faster).

    Outputs (1)

    NameTypeDescription
    Generated AudioAUDIO