VibeVoice TTS
Microsoft's VibeVoice TTS, sitting right inside your ComfyUI graph
- speaker_1_voice
- speaker_2_voice
- speaker_3_voice
- speaker_4_voice
- AUDIO
This node is how you turn a text script into a full conversation - multiple speakers, distinct voices, one audio file - without leaving ComfyUI. VibeVoice is Microsoft's open-source TTS model for long-form, multi-speaker audio (think podcast scripts, audiobook dialogue, two hosts arguing), and wildminder's wrapper drops it into a single node that handles the model download, VRAM juggling, and audio plumbing for you.
Most audio work in the ComfyUI ecosystem is the video-sync kind - MMAudio, LTX-2's native audio stage - where you generate sound to match pictures. This is the opposite problem: pure text-to-speech, no video attached, but with the twist that the model keeps up to four voices straight across ninety minutes of dialogue. If you've ever piped a podcast script through a single-voice TTS and manually chopped and stitched it, this is the thing that makes that workflow feel embarrassing.
How it works
VibeVoice is a "next-token diffusion" model. The heavy lifting is a Qwen2.5 LLM that understands the script, tracks who's speaking, and predicts what comes next; a diffusion head then renders each chunk into actual acoustic detail. That hybrid is why the voices don't drift into each other and why turn-taking actually sounds natural.
The node leans on ComfyUI's own model_management for loading and offloading, and it caches loaded models so switching between the 1.5B and Large variants doesn't force a full reload every time. First use auto-downloads the model (and the Qwen tokenizer) into ComfyUI/models/tts/VibeVoice/.
The inputs that actually matter
You can leave most of the knobs alone. What you'll touch:
text- the script. Tag each line with[1]orSpeaker 1:. Both formats parse identically, and you can even throw a colon on the modern format. That's the whole scripting model.speaker_1_voice…speaker_4_voice(optionalAUDIO) - wire aLoad Audionode here to clone that voice from a.wavor.mp3. Leave an input empty and the model invents a unique zero-shot voice for that speaker, so you can clone two voices and generate two more in the same script. That hybrid mode is the pack's headline feature.model_name-VibeVoice-1.5B(~3 GB) orVibeVoice-Large(~17.4 GB). The Large is the more stable one; the 1.5B is the "does this even work on my GPU" option.quantize_llm_4bit- quantizes only the LLM to 4-bit NF4 (needsbitsandbytes). Big VRAM win; the diffusion head stays BF16/FP32.attention_mode-eager,sdpa(default),flash_attention_2, orsage. Picksdpaand move on.cfg_scale(1.3) andinference_steps(10) - CFG is how strictly it clings to the reference voice's timbre; steps are diffusion steps. The defaults are sensible; crank steps only if you're chasing quality.
Output is one AUDIO tensor containing the whole conversation - wire it to a Save Audio node.
Installing it
Via ComfyUI Manager: search ComfyUI-VibeVoice, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/wildminder/ComfyUI-VibeVoice.git
cd ComfyUI-VibeVoice
pip install -r requirements.txt
Restart, and the node shows up under audio/tts. bitsandbytes is in the requirements file, so 4-bit works out of the box; sage attention needs a separate sageattention install (Windows users, grab the prebuilt wheel the README links). The model downloads itself on first run - no manual Hugging Face fetch.
Where people get burned
- 4-bit +
eagerorflash_attention_2silently falls back tosdpawith a warning. It's deliberate - some combos just don't work - but it can look like a bug. Expect a fallback, don't fight it. - VRAM. The Large model at full precision is a 17 GB animal. If you're on 12 GB, enable
quantize_llm_4bitand usesdpa; that's the pack's recommended memory-saver combo. - CUDA assertion errors with a given attention mode: the source's own advice is restart ComfyUI, try a different audio file, or drop to
eager. - Emergent weirdness. The model may spontaneously add background music (especially if the reference has some, or your text starts with "Welcome to…") and it will occasionally attempt singing. That's the model, not a misconfiguration. For Chinese text, English punctuation helps stability.
- Licensing reality check. VibeVoice's terms don't allow cloning a real person's voice without consent, and the wrapper can't tell whose voice you're feeding it. Don't be that person.
force_offload frees VRAM after each run at the cost of slower subsequent runs - handy if you're sharing the card with image models. And one honest caveat: voice cloning quality depends heavily on your reference audio, so a clean, quiet clip beats a longer noisy one every time.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | Select the VibeVoice model to use. Official models will be downloaded automatically. | |
| text | STRING | [1] Hello, this is a cloned voice. [2] And this is a generated voice, how cool is that? | The script for generation. Use '[1]' or 'Speaker 1:' for speakers. If a speaker in the script lacks a reference voice, it will be generated via zero-shot TTS. |
| quantize_llm_4bit | BOOLEAN | false | Quantize the Qwen2.5 LLM to 4-bit NF4 via bitsandbytes. Diffusion head stays BF16/FP32. |
| attention_mode | COMBO | sdpa | Attention implementation: Eager (safest), SDPA (balanced), Flash Attention 2 (fastest), Sage (quantized) |
| cfg_scale | FLOAT | 1.300.1–50 | Classifier-Free Guidance scale. Higher values increase adherence to the voice prompt but may reduce naturalness. Recommended: 1.3 |
| inference_steps | INT | 101–500 | Number of diffusion steps for audio generation. More steps can improve quality but take longer. Recommended: 10 |
| seed | INT | 420–18446744073709550000 | Seed for reproducibility. Set to 0 for a random seed on each run. |
| do_sample | BOOLEAN | true | Enable to use sampling methods (like temperature and top_p) for more varied output. Disable for deterministic (greedy) decoding. |
| temperature | FLOAT | 0.950–2 | Controls randomness. Higher values make the output more random and creative, while lower values make it more focused and deterministic. Active only if 'do_sample' is enabled. |
| top_p | FLOAT | 0.950–1 | Nucleus sampling (Top-P). The model samples from the smallest set of tokens whose cumulative probability exceeds this value. Active only if 'do_sample' is enabled. |
| top_k | INT | 00–500 | Top-K sampling. Restricts sampling to the K most likely next tokens. Set to 0 to disable. Active only if 'do_sample' is enabled. |
| force_offload | BOOLEAN | false | Force model to be offloaded from VRAM after generation. Useful to free up memory between generations but may slow down subsequent runs. |
| speaker_1_voiceopt | AUDIO | Reference audio for 'Speaker 1' or '[1]' in the script. | |
| speaker_2_voiceopt | AUDIO | Reference audio for 'Speaker 2' or '[2]' in the script. | |
| speaker_3_voiceopt | AUDIO | Reference audio for 'Speaker 3' or '[3]' in the script. | |
| speaker_4_voiceopt | AUDIO | Reference audio for 'Speaker 4' or '[4]' in the script. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |