Nodes/Ninode Utils/VibeVoice Voice Design
ComfyUI Node

VibeVoice Voice Design

The voice node that hands you a voice_id and a .txt file

By iGavroche·Created 11 months ago·Updated 11 months ago· 1
VibeVoice Voice Design
  • reference_audio
  • voice_id
  • trial_audio
promptA narrator telling a suspenseful story, with a deep and magnetic voice, varying speech pace to create a tense and mysterious atmosphere.
preview_textIt was late at night, and he was alone in the old house. Faint footsteps could be heard outside the window. He held his breath and slowly, slowly, walked toward the creaking door...
model_name
attention_modesdpa
cfg_scale1.30
inference_steps10
seed42
custom_voice_id
quantize_llm_4bitfalse
temperature0.95
top_p0.95
force_offloadfalse

Before you wire this into your workflow, you need the one fact the README dances around: the version on disk does not generate audio. VibeVoice Voice Design is billed as a drop-in replacement for Minimax Voice Design that "creates custom voices from text descriptions" for the full-loop-Sora2-ComfyUI workflow. What it actually does is return a voice_id and write a text file to ComfyUI's output folder. The node's own changelog says it plainly: "placeholder implementation that generates text files instead of audio."

I'm not saying that to dunk on it. Knowing this upfront saves you the exact confusion I had.

What it is (and what it's reaching for)

The real VibeVoice is Microsoft's open-source text-to-speech framework - a next-token diffusion model that uses an LLM to parse text and dialogue, then a diffusion head to synthesize audio, and it can do long-form multi-speaker output. You can see that architecture in this node's input list: cfg_scale, inference_steps, temperature, top_p, an attention-mode selector, and a toggle to quantize a Qwen2.5 LLM to 4-bit. Those are the knobs a diffusion TTS genuinely needs. This node is scaffolding built around that idea, waiting for an engine.

How it works as shipped

Here's the full mechanism, straight from the source. It checks your prompt isn't empty, then builds a voice id - either your custom_voice_id or an auto-generated simple_voice_<timestamp>_<hex>. If preview_text is set, it writes a plain .txt file into ComfyUI's output directory containing the voice description, the preview text, and a note that says, verbatim, "This is a placeholder implementation." Then it returns two strings:

  • voice_id - a stable id you can pass to other nodes.
  • trial_audio - a path to that .txt file, not a WAV.

Everything else in the schema is accepted and ignored. reference_audio for voice cloning? Wired in, does nothing today. cfg_scale, inference_steps, seed, quantize_llm_4bit, force_offload? Scaffolding for the real implementation. The model_name dropdown has one entry (simple-tts) and attention_mode offers just eager - which is itself a tell that the diffusion path isn't live.

Why you might still use it

If you're assembling the Sora2 full-loop workflow and just need a stable voice_id to feed downstream nodes while you sort out a real TTS engine, this works as placeholder plumbing. It's also harmless: no models to download, no API key, nothing heavy in the first call.

But if you want an actual voice as audio from a text description, this node is a trap. The README's suggested fix - install ComfyUI-VibeVoice or a TTS engine - is the right one; the shipped code just doesn't call it yet. For real text-to-voice from a prompt today, go get an actual VibeVoice integration or a Minimax node instead.

Install and gotchas

Same pack, same install as everything in Ninode Utils:

cd ComfyUI/custom_nodes
git clone https://github.com/iGavroche/ComfyUI-Ninode-Utils.git
cd ComfyUI-Ninode-Utils
pip install -r requirements.txt

or just search "Ninode Utils" in ComfyUI Manager. The requirements.txt includes torchaudio - future audio work - but the placeholder runs on the base deps, so nothing extra downloads on first use.

The gotcha is expectations, not crashes: you'll run it, trial_audio will show a path, you'll open the file and find text. That's not a bug you caused - it's this version of the node. If you came here from a workflow that expected a WAV, check what else that workflow assumes; the .txt placeholder is the thing most likely to break the pipe downstream.

CategoryNinode Utils/Voice Design

Inputs (13)

NameTypeDefaultDescription
promptSTRINGA narrator telling a suspenseful story, with a deep and magnetic voice, varying speech pace to create a tense and mysterious atmosphere.
preview_textSTRINGIt was late at night, and he was alone in the old house. Faint footsteps could be heard outside the window. He held his breath and slowly, slowly, walked toward the creaking door...
model_nameCOMBOSelect the VibeVoice model to use. Official models will be downloaded automatically.
attention_modeCOMBOsdpaAttention implementation: Eager (safest), SDPA (balanced), Flash Attention 2 (fastest)
cfg_scaleFLOAT1.300.1–50Classifier-Free Guidance scale. Higher values increase adherence to the voice prompt.
inference_stepsINT101–500Number of diffusion steps for audio generation.
seedINT420–18446744073709550000Seed for reproducibility. Set to 0 for a random seed on each run.
custom_voice_idoptSTRING
reference_audiooptAUDIOReference audio for voice cloning (optional). If provided, will be used as speaker voice.
quantize_llm_4bitoptBOOLEANfalseQuantize the Qwen2.5 LLM to 4-bit NF4 via bitsandbytes.
temperatureoptFLOAT0.950–2Controls randomness in generation.
top_poptFLOAT0.950–1Nucleus sampling (Top-P).
force_offloadoptBOOLEANfalseForce model to be offloaded from VRAM after generation.

Outputs (2)

NameTypeDescription
voice_idSTRING
trial_audioSTRING