Nodes/Omnivoice Triton TTS/Omnivoice TTS (Voice Clone)
ComfyUI Node

Omnivoice TTS (Voice Clone)

Clone a voice from a 10-second clip, fully local

By newgrit1004·Created 5 months ago·Updated 5 months ago· 5
Omnivoice TTS (Voice Clone)
  • ref_audio
  • audio
textHello, this is an OmniVoice cloned voice test.
runner_modehybrid
ref_text
num_step32
guidance_scale2.0
class_temperature0.00
languageauto
model_idk2-fsa/OmniVoice
dtypefp16
devicecuda

Feed this node an AUDIO clip of someone talking plus some text, and it talks in that voice - no training, no ElevenLabs, no API call anywhere. It's the voice-clone variant of the OmniVoice pack (newgrit1004's Triton-accelerated wrapper around the k2-fsa OmniVoice model), and it sits in the workflow exactly where cloning matters: you want a specific voice, not the generic narrator the Auto node gives you.

OmniVoice's zero-shot cloning is the real thing, not a disguise trick. There's no fine-tuning step - the model takes the reference clip, learns the speaker's patterns in one pass, and conditions generation on them. That means the reference clip is the model, which is why people get very different results depending on what they feed it. Community testing on the original OmniVoice nodes is instructive: a short, flat 3-second sample gives you a flat clone - one user couldn't get their cloned voice to shout or whisper at all - while a 30–60 second clip with real emotional variation makes the clone actually expressive. Garbage in, flat narration out. There's no training to do, but there is sample curation.

How the node handles your audio

This is where the pack does something thoughtful. The reference AUDIO you load (with ComfyUI's built-in LoadAudio) gets downmixed to mono, resampled to OmniVoice's 24 kHz rate via soxr, and passed to the runner in memory. No temp-file round-trips, no librosa loader path - that's the kind of plumbing you only notice when it's missing and the node silently breaks on a stereo 48 kHz clip.

It shares the pack's machinery with the Auto node: same four runner_modes (hybrid default - Triton kernels + CUDA Graph, ~3.4× faster), same module-level runner cache, same ~2GB VRAM footprint, and the same output format - an AUDIO dict at 24 kHz mono, ready for SaveAudio or a lip-sync stage.

The inputs that matter

  • text - what the cloned voice says.
  • ref_audio (AUDIO, required) - your reference clip, loaded via LoadAudio. A few seconds is technically enough; 10–30 seconds of clear, varied speech is what actually clones well.
  • ref_text - optional transcript of the reference clip. Use it. OmniVoice hallucinates when it can't hear the reference clearly, and the community fix for "it adds words / speaks junk" is feeding the exact transcript rather than relying on an auto-transcriber like Whisper. It also carries emotional cues, which is what makes emotional prompting actually land.
  • language - auto, ko, en, zh. Pro tip from the field: if you want a language with a distinct accent (Spanish is the reported case), give it a reference voice in that language, or you get a fluent-but-foreign-accented result.
  • num_step / guidance_scale / class_temperature - the same generation dials as the Auto node; defaults (32 / 2.0 / 0) are fine to start.

Output: audio (AUDIO), 24 kHz mono.

Install

Same pack as the Auto node: search "Omnivoice Triton TTS" in ComfyUI Manager, or clone and run the install script:

cd ComfyUI/custom_nodes
git clone https://github.com/newgrit1004/ComfyUI-Omnivoice-Triton.git
cd ComfyUI-Omnivoice-Triton
python install.py

Then restart ComfyUI. Requirements: Python ≥ 3.12, CUDA 12.8+ torch, an Ampere-or-newer GPU, and the k2-fsa/OmniVoice model (~2GB) auto-downloads from HuggingFace on first run.

Common issues

The two that bite:

  1. Launch ComfyUI with --disable-cuda-malloc. Without it, the default CUDA async allocator conflicts with transformers loading and CUDA Graph capture - fake OOMs and hybrid-mode crashes. This is pack-wide and non-negotiable:
    python ComfyUI/main.py --listen 0.0.0.0 --port 8188 --disable-cuda-malloc
  2. Cloned voice sounds flat or wrong. That's usually the reference, not the node. Use a longer, more expressive clip, and provide the exact ref_text. If the clone still drifts on certain words, the model is known to be hit-or-miss with explicit emotion tags like [laughter] - most of the time it ignores them or speaks them aloud, so don't build your script around them.

One honest caveat before you over-invest: this whole audio layer in ComfyUI is a dependency-management exercise. The pack's install script is designed to never touch your torch, but if you already have a heavily-modified custom_nodes folder, the usual advice still applies - a dedicated ComfyUI instance for audio is the nuclear option that always works.

CategoryOmnivoice-Triton

Inputs (11)

NameTypeDefaultDescription
textSTRINGHello, this is an OmniVoice cloned voice test.
ref_audioAUDIO
runner_modeCOMBOhybrid4 options: base, triton, faster, hybrid
ref_textoptSTRING
num_stepoptINT324–64
guidance_scaleoptFLOAT2.00–10
class_temperatureoptFLOAT0.000–2
languageoptCOMBOauto4 options: auto, ko, en, zh
model_idoptSTRINGk2-fsa/OmniVoice
dtypeoptCOMBOfp163 options: fp16, bf16, fp32
deviceoptCOMBOcuda2 options: cuda, cpu

Outputs (1)

NameTypeDescription
audioAUDIO