VoxCPM Multilingual TTS
Multilingual TTS in 28+ languages, fully local, no reference clip required
- model
- audio
This is the node you reach for when you need a voice and you don't need a specific person's. It's plain text-to-speech on OpenBMB's VoxCPM2 model: type text, get a 48kHz spoken rendition, all on your own GPU. No API, no key, no reference clip - and that language list is the reason it exists.
Most open TTS is English-first, and the famous lightweight options (Kokoro, Piper) are even narrower. VoxCPM2's whole angle is the language table: 28 languages including Arabic, Burmese, Khmer, Swahili, Vietnamese, plus eight Chinese dialects (Cantonese, Wu, Sichuan, Hokkien, and friends). If your workflow needs a narrator in Thai or a character speaking 粤语, this pack is one of the few local paths that gets you there. It occupies the "multilingual quality corner" of the TTS landscape the audio community charts - not as fast or light as Kokoro, not as famous as Chatterbox, but arguably the best language coverage of the open crowd.
How it works
Text goes through VoxCPM2's pipeline: a language model turns your words into speech latents, a diffusion transformer renders them, and an audio VAE decodes the final waveform at 48kHz. No reference audio means nothing to clone, so the denoise input is effectively dead here - the README says as much. What actually does work:
- text - what gets spoken. Multiline, so you can drop in a paragraph.
- cfg_value (0–10, default 2) - how closely the output follows the prompt style. Higher clings harder; it costs naturalness before it costs anything else.
- inference_timesteps (1–100, default 10) - the diffusion step count. More is cleaner, slower.
- max_len (64–65536, default 4096) - the token budget. If the audio cuts off mid-sentence, raise this before touching anything else.
- normalize - off by default. Turns on text normalization, which helps with numbers, dates, and abbreviations ("42" → "forty-two").
Output is a single audio socket - standard ComfyUI AUDIO - which you wire into a preview or save node (the pack's own example workflow uses LoadAudio and PreviewAudio).
The dialect trick
The official guidance is blunt: for Chinese dialects, write the actual dialect text rather than standard Mandarin and hope the model converts. Want Cantonese? Type something like 伙计,唔该来一个 A 餐,冻奶茶少甜。, not the Mandarin equivalent. The model handles it far better when you meet it halfway. Same principle applies to any language - if the pronunciation is off, the fix is usually in your text, not your settings.
Setup and gotchas
Install is the shared pack story: ComfyUI Manager (search "ComfyUI-VoxCPM") or git clone into custom_nodes, then pip install -r requirements.txt and download openbmb/VoxCPM2 into models/VoxCPM2. Heavy requirements (torch, transformers, funasr, librosa…), Python 3.10–3.13, CUDA ≥ 12 - the standard tax for audio nodes.
Two failure modes you'll actually hit: audio getting cut short (raise max_len), and garbled dialect pronunciation (rewrite the text in that dialect). If you loaded the model without the denoiser and your normalize throws, you're missing the wetext/inflect optional deps. None of it is mysterious - this is one of the more honest TTS nodes in ComfyUI: type, adjust two knobs, listen.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | VOXCPM_MODEL | — | |
| text | STRING | Hello. 你好。Bonjour. | — |
| cfg_value | FLOAT | 2.00–10 | — |
| inference_timesteps | INT | 101–100 | — |
| max_len | INT | 409664–65536 | — |
| normalize | BOOLEAN | false | — |
| denoise | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |