RunningHub VoxCPM Multi-Speaker
VoxCPM dialogue generation
- model
- audio_1
- audio_2
- audio_3
- audio_4
- audio_5
- audio
If you've ever wanted a full podcast or a back-and-forth argument rendered in distinct voices without stitching clips together afterward, this is the node. RunningHub VoxCPM Multi-Speaker takes one tagged script, up to five reference voices, and generates the whole dialogue as a single continuous audio track - no per-line generation, no manual concat, no awkward pauses at the seams.
The trick is the script format. Each line is prefixed with a speaker tag:
[spk1]Hey, did you see the update?
[spk2]Not yet, what broke this time?
[spk1]Nothing broke. That's the surprise.
Everything under the same tag gets that speaker's voice, and the model handles the conversational flow. VoxCPM's tokenizer-free design is why this works as one pass instead of five separate renders - the model reads the whole tagged transcript as context, so it knows who's talking when and keeps intonation consistent across turn changes.
What you set per speaker
Each speaker from 1 to 5 gets three optional inputs, and they work exactly like the single-speaker Generate node's modes:
- audio_N - the reference clip for that speaker. Empty means "design the voice from text instead."
- control_N - the voice description, just a plain string like "adult female, northeastern accent." Defaults even come preloaded (spk1 defaults to 四川话, spk5 to 旁白音, mature male), which tells you which community this pack was built for first - it's very much a Mandarin-first tool.
- reference_text_N - the exact transcript of that speaker's reference clip. On VoxCPM2, if you leave it blank the node falls back to safe reference-only conditioning instead of auto-transcribing, so a blank is fine unless you want maximum clone fidelity.
Shared knobs mirror the Generate node: cfg_value (2.0), inference_steps (10), seed, plus normalize_text, denoise_reference (ZipEnhancer per reference clip), max_len (4096), and retry_badcase (on). The output is a single audio wire with the whole dialogue.
Installing and running
Same pack, same drill:
cd ComfyUI/custom_nodes
git clone https://github.com/RH-RunningHub/ComfyUI_RH_VoxCPM.git
cd ComfyUI_RH_VoxCPM && pip install -r requirements.txt
hf download openbmb/VoxCPM2 --local-dir ComfyUI/models/voxcpm/VoxCPM2
Restart, and load the examples/VoxCPM2 多人工作流.json workflow - the README calls it the fixed 5-speaker version, and it's the fastest way to see the tag format in action.
The honest catches
First, five speakers means five reference clips if you want five cloned voices, and if you leave several empty you get designed voices that may not sound distinct enough in a crowd. Plan your cast before you write the script. Second, this is the fixed five-slot node - if you only need a two-person chat, you'll leave three inputs dangling, which is fine but noisy. That's exactly why the pack also ships the Dynamic Audio variant, which grows inputs as you connect them. Third, the Mandarin-first defaults and the model's accent tendencies will leak into English output - clone from an English clip, per the community's experience, and English comes out fine with a trace of the source accent. If a voice drifts metallic at the end of long lines, that's the old 1.5 behavior; VoxCPM2 is where this node is meant to run.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| model | VOXCPM_MODEL | — | |
| script | STRING | [spk5]今日AI新闻速报 [spk1]T8那个瓜娃子,又更新什么了? [spk2]管他干啥呀,带派不就行了。 [spk1]天天只知道做视频,耳都不耳人一哈。 [spk2]别笑哈,你试你也过不了第二关。 | — |
| cfg_value | FLOAT | 2.00.1–5 | — |
| inference_steps | INT | 101–50 | — |
| seed | INT | 00–18446744073709550000 | — |
| audio_1opt | AUDIO | — | |
| control_1opt | STRING | 四川话 | — |
| audio_2opt | AUDIO | — | |
| control_2opt | STRING | 成年女性,东北话 | — |
| audio_3opt | AUDIO | — | |
| control_3opt | STRING | — | |
| audio_4opt | AUDIO | — | |
| control_4opt | STRING | — | |
| audio_5opt | AUDIO | — | |
| control_5opt | STRING | 旁白音,成熟男性 | — |
| normalize_textopt | BOOLEAN | false | — |
| denoise_referenceopt | BOOLEAN | false | — |
| max_lenopt | INT | 409664–8192 | — |
| retry_badcaseopt | BOOLEAN | true | — |
| reference_text_1opt | STRING | — | |
| reference_text_2opt | STRING | — | |
| reference_text_3opt | STRING | — | |
| reference_text_4opt | STRING | — | |
| reference_text_5opt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |