Nodes/ComfyUI-VibeVoice/VibeVoice TTS
ComfyUI Node

VibeVoice TTS

Microsoft's VibeVoice TTS, sitting right inside your ComfyUI graph

By wildminder·Created 12 months ago·Updated 11 months ago· 596
VibeVoice TTS
  • speaker_1_voice
  • speaker_2_voice
  • speaker_3_voice
  • speaker_4_voice
  • AUDIO
model_name
text[1] Hello, this is a cloned voice. [2] And this is a generated voice, how cool is that?
quantize_llm_4bitfalse
attention_modesdpa
cfg_scale1.30
inference_steps10
seed42
do_sampletrue
temperature0.95
top_p0.95
top_k0
force_offloadfalse

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] or Speaker 1:. Both formats parse identically, and you can even throw a colon on the modern format. That's the whole scripting model.
  • speaker_1_voicespeaker_4_voice (optional AUDIO) - wire a Load Audio node here to clone that voice from a .wav or .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) or VibeVoice-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 (needs bitsandbytes). Big VRAM win; the diffusion head stays BF16/FP32.
  • attention_mode - eager, sdpa (default), flash_attention_2, or sage. Pick sdpa and move on.
  • cfg_scale (1.3) and inference_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 + eager or flash_attention_2 silently falls back to sdpa with 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_4bit and use sdpa; 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.

Categoryaudio/tts

Inputs (16)

NameTypeDefaultDescription
model_nameCOMBOSelect the VibeVoice model to use. Official models will be downloaded automatically.
textSTRING[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_4bitBOOLEANfalseQuantize the Qwen2.5 LLM to 4-bit NF4 via bitsandbytes. Diffusion head stays BF16/FP32.
attention_modeCOMBOsdpaAttention implementation: Eager (safest), SDPA (balanced), Flash Attention 2 (fastest), Sage (quantized)
cfg_scaleFLOAT1.300.1–50Classifier-Free Guidance scale. Higher values increase adherence to the voice prompt but may reduce naturalness. Recommended: 1.3
inference_stepsINT101–500Number of diffusion steps for audio generation. More steps can improve quality but take longer. Recommended: 10
seedINT420–18446744073709550000Seed for reproducibility. Set to 0 for a random seed on each run.
do_sampleBOOLEANtrueEnable to use sampling methods (like temperature and top_p) for more varied output. Disable for deterministic (greedy) decoding.
temperatureFLOAT0.950–2Controls 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_pFLOAT0.950–1Nucleus 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_kINT00–500Top-K sampling. Restricts sampling to the K most likely next tokens. Set to 0 to disable. Active only if 'do_sample' is enabled.
force_offloadBOOLEANfalseForce model to be offloaded from VRAM after generation. Useful to free up memory between generations but may slow down subsequent runs.
speaker_1_voiceoptAUDIOReference audio for 'Speaker 1' or '[1]' in the script.
speaker_2_voiceoptAUDIOReference audio for 'Speaker 2' or '[2]' in the script.
speaker_3_voiceoptAUDIOReference audio for 'Speaker 3' or '[3]' in the script.
speaker_4_voiceoptAUDIOReference audio for 'Speaker 4' or '[4]' in the script.

Outputs (1)

NameTypeDescription
AUDIOAUDIO