VibeVoice Voice Design
The voice node that hands you a voice_id and a .txt file
- reference_audio
- voice_id
- trial_audio
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
.txtfile, 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.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | A narrator telling a suspenseful story, with a deep and magnetic voice, varying speech pace to create a tense and mysterious atmosphere. | — |
| preview_text | STRING | It 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 | COMBO | Select the VibeVoice model to use. Official models will be downloaded automatically. | |
| attention_mode | COMBO | sdpa | Attention implementation: Eager (safest), SDPA (balanced), Flash Attention 2 (fastest) |
| cfg_scale | FLOAT | 1.300.1–50 | Classifier-Free Guidance scale. Higher values increase adherence to the voice prompt. |
| inference_steps | INT | 101–500 | Number of diffusion steps for audio generation. |
| seed | INT | 420–18446744073709550000 | Seed for reproducibility. Set to 0 for a random seed on each run. |
| custom_voice_idopt | STRING | — | |
| reference_audioopt | AUDIO | Reference audio for voice cloning (optional). If provided, will be used as speaker voice. | |
| quantize_llm_4bitopt | BOOLEAN | false | Quantize the Qwen2.5 LLM to 4-bit NF4 via bitsandbytes. |
| temperatureopt | FLOAT | 0.950–2 | Controls randomness in generation. |
| top_popt | FLOAT | 0.950–1 | Nucleus sampling (Top-P). |
| force_offloadopt | BOOLEAN | false | Force model to be offloaded from VRAM after generation. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| voice_id | STRING | — |
| trial_audio | STRING | — |