VibeVoice Single Speaker
Natural voiceover inside ComfyUI — no API key, no ElevenLabs bill
- voice_to_clone
- lora
- audio
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 bitsandbytesinto 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 pinsbitsandbytes>=0.48.1. - OOM: start with the Q8/Q4 model or flip
quantize_llmto 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.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Hello, this is a test of the VibeVoice text-to-speech system. | Text to convert to speech. Gets disabled when connected to another node. |
| model | COMBO | No models found | Select a model from ComfyUI/models/vibevoice/ folder |
| attention_type | COMBO | auto | Attention 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_llm | COMBO | full precision | Dynamically 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_generate | BOOLEAN | true | Free model from memory after generation to save VRAM/RAM. Disable to keep model loaded for faster subsequent generations |
| diffusion_steps | INT | 201–100 | Number of denoising steps. More steps = theoretically better quality but slower. Default: 20 |
| seed | INT | 420–4294967295 | Random seed for generation. Default 42 is used in official examples |
| cfg_scale | FLOAT | 1.300.5–3.5 | Classifier-free guidance scale (official default: 1.3) |
| use_sampling | BOOLEAN | false | Enable sampling mode. When False (default), uses deterministic generation like official examples |
| voice_to_cloneopt | AUDIO | Optional: Reference voice to clone. If not provided, synthetic voice will be used. | |
| loraopt | LORA_CONFIG | Optional: LoRA configuration from VibeVoice LoRA node | |
| temperatureopt | FLOAT | 0.950.1–2 | Only used when sampling is enabled |
| top_popt | FLOAT | 0.950.1–1 | Only used when sampling is enabled |
| max_words_per_chunkopt | INT | 250100–500 | Maximum words per chunk for long texts. Lower values prevent speed issues but create more chunks. |
| voice_speed_factoropt | FLOAT | 1.000.8–1.2 | 1.0 = normal speed, <1.0 = slower speed, >1.0 = faster speed |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |