Nodes/VibeVoice ComfyUI/VibeVoice Single Speaker
ComfyUI Node

VibeVoice Single Speaker

Natural voiceover inside ComfyUI — no API key, no ElevenLabs bill

By Enemyx-net·Created about a year ago·Updated 6 months ago· 1,550
VibeVoice Single Speaker
  • voice_to_clone
  • lora
  • audio
textHello, this is a test of the VibeVoice text-to-speech system.
modelNo models found
attention_typeauto
quantize_llmfull precision
free_memory_after_generatetrue
diffusion_steps20
seed42
cfg_scale1.30
use_samplingfalse
temperature0.95
top_p0.95
max_words_per_chunk250
voice_speed_factor1.00

Voice cloning used to mean either a monthly ElevenLabs bill or a standalone Python script that couldn't talk to anything else in your graph. This node is the third option: Microsoft's VibeVoice TTS model, wrapped so it runs right inside ComfyUI. "VibeVoice Single Speaker" is the workhorse of the pack - text in, a 24 kHz audio tensor out, with optional voice cloning. Community verdict on the underlying model has been roughly "best TTS I've ever heard" since it landed in 2025, and it's now a regular fixture in production video stacks (the LTX workflow guide in our KB lists VibeVoice-Large as the voice stage alongside the video model). All of that, locally, with no API key.

How it works

VibeVoice isn't a single "audio model" in the usual sense. An LLM (Qwen2.5-1.5B-class, which is why the tokenizer is Qwen's) reads your text and plans it out, then a diffusion head renders those plans into actual audio, with acoustic and semantic connectors binding the two halves together. That's why a speech node has cfg_scale and diffusion_steps inputs - there's genuinely a diffusion model inside, just one that makes sound instead of pixels.

The voice cloning is the clever bit. Connect a reference audio sample and it conditions the whole pipeline to match it. No fine-tuning, no per-speaker training - just a few seconds of clean audio. Nothing plugged in? You get a synthetic default voice. The README's advice on samples holds: at least 3–10 seconds works, 30+ is better, and the audio is auto-resampled to 24 kHz.

The inputs that matter

  • text - your script, multiline. Wire this from a Load Text node and it disables, which is ComfyUI telling you it's being fed.
  • model - dropdown of whatever's in ComfyUI/models/vibevoice/. If it says "No models found", you haven't downloaded one yet (more below).
  • voice_to_clone (optional) - the reference voice. The one input that turns this from TTS into cloning.
  • seed - deterministic mode is the default (use_sampling = False), so the same seed gives the same take. Save good seeds for character voices; change it when the default 42 doesn't work.
  • cfg_scale (1.3) and diffusion_steps (20) - the diffusion-half quality/speed knobs. The official defaults are good; leave them alone until you know why you're changing them.
  • quantize_llm - "4bit"/"8bit" dynamically quantize only the LLM half of an unquantized model. Big VRAM savings, requires CUDA, and ignored for pre-quantized models.
  • use_sampling + temperature/top_p - flip on for variation, off for reproducible production takes.
  • max_words_per_chunk (250) - long texts auto-chunk so audio doesn't speed-shift; lower it if you hear pacing issues.
  • voice_speed_factor - a subtle speech-rate nudge (0.8–1.2, best kept 0.95–1.05).

The single output is audio, which feeds Save Audio, a preview, or another VibeVoice node for chaining.

Install

Two routes: ComfyUI Manager (search "VibeVoice"), or the manual path:

cd ComfyUI/custom_nodes
git clone https://github.com/Enemyx-net/VibeVoice-ComfyUI

Then restart; requirements install on first use. The pack pulls heavy audio deps - transformers, diffusers, librosa, soundfile, av, bitsandbytes - so the first launch takes a minute.

The real gotcha: since v1.6.0 the wrapper no longer auto-downloads models. You must grab one manually and drop it in ComfyUI/models/vibevoice/. The 1.5B (~5.4 GB, ~6 GB VRAM) is the quick-start pick; Large (~18.7 GB, ~20 GB) is the quality pick; Large-Q8 (~11.6 GB, ~12 GB, near-lossless) is the sweet spot for a 12 GB card; Large-Q4 (~6.6 GB, ~8 GB) is the low-VRAM option. You also need the Qwen2.5-1.5B tokenizer files in vibevoice/tokenizer/. Refresh the browser after dropping files - models are rescanned on refresh, not continuously.

Common issues

  • "No models found" in the dropdown: the models aren't in the folder. Download, place, refresh.
  • bitsandbytes errors: people famously pip install bitsandbytes into their system Python, not ComfyUI's embedded one. Either run pip from the embedded Python or force an update through Manager. Also note v0.48.0 is broken - the pack now pins bitsandbytes>=0.48.1.
  • OOM: start with the Q8/Q4 model or flip quantize_llm to 4bit before touching anything else.
  • Transformers conflicts: this is the dependency-hell side of the ecosystem; the pack needs transformers>=4.51.3, and if you're also using LoRA, newer versions aren't guaranteed - pin 4.51.3 if LoRA loading flakes.
  • [pause] tags split your text into separate chunks, and the model can't see across that boundary - context loss, so use them at natural breaks.
CategoryVibeVoiceWrapper

Inputs (15)

NameTypeDefaultDescription
textSTRINGHello, this is a test of the VibeVoice text-to-speech system.Text to convert to speech. Gets disabled when connected to another node.
modelCOMBONo models foundSelect a model from ComfyUI/models/vibevoice/ folder
attention_typeCOMBOautoAttention implementation. Auto selects the best available, eager is standard, sdpa is optimized PyTorch, flash_attention_2 requires compatible GPU, sage uses quantized attention for speedup (CUDA only)
quantize_llmCOMBOfull precisionDynamically quantize only the LLM component for non-quantized models. 4bit: major VRAM savings with minimal quality loss. 8bit: good balance of quality and memory usage. Full precision: original quality. Note: ignored for pre-quantized models. Requires CUDA GPU.
free_memory_after_generateBOOLEANtrueFree model from memory after generation to save VRAM/RAM. Disable to keep model loaded for faster subsequent generations
diffusion_stepsINT201–100Number of denoising steps. More steps = theoretically better quality but slower. Default: 20
seedINT420–4294967295Random seed for generation. Default 42 is used in official examples
cfg_scaleFLOAT1.300.5–3.5Classifier-free guidance scale (official default: 1.3)
use_samplingBOOLEANfalseEnable sampling mode. When False (default), uses deterministic generation like official examples
voice_to_cloneoptAUDIOOptional: Reference voice to clone. If not provided, synthetic voice will be used.
loraoptLORA_CONFIGOptional: LoRA configuration from VibeVoice LoRA node
temperatureoptFLOAT0.950.1–2Only used when sampling is enabled
top_poptFLOAT0.950.1–1Only used when sampling is enabled
max_words_per_chunkoptINT250100–500Maximum words per chunk for long texts. Lower values prevent speed issues but create more chunks.
voice_speed_factoroptFLOAT1.000.8–1.21.0 = normal speed, <1.0 = slower speed, >1.0 = faster speed

Outputs (1)

NameTypeDescription
audioAUDIO