OmniVoice Models Loader ⚡
The front door that also decides your VRAM bill
- omnivoice_model
Every TTS graph in this pack starts here, and it isn't a "load a file" loader in the usual ComfyUI sense - there's no dropdown pointing at something you downloaded from Civitai. It fetches the model itself, into a folder you probably don't have yet, and holds the weights so two generator nodes can share one copy.
If you landed here cold: OmniVoice is k2-fsa's zero-shot multilingual TTS model - 600+ languages, a diffusion-language-model architecture rather than the vocoder school Kokoro comes from, and roughly 5–6.5 GB of VRAM in practice while cloning. That language coverage is the reason to pick it over Chatterbox or F5-TTS.
Why it lives in a GGUF pack
ComfyUI-GGUF-Loader is ChrisColeTech's fork-and-superset of city96's ComfyUI-GGUF - the pack that dragged GGUF quantization out of llama.cpp and onto diffusion transformers back when Flux's 12B parameters priced everyone off fp16. The fork backports upstream PRs and bolts on a pile of "convenience pipelines," and local speech is one of them. Worth knowing before you install: you're not pulling a small TTS helper, and the OmniVoice nodes are three doors in a much larger house.
The upside: if you already run GGUF Flux or Wan, you're not adding a second copy of half of PyTorch. The downside: one shared dependency file for everything the pack does.
How the loader actually behaves
The model dropdown is built at node-registration time by scanning ComfyUI/models/omnivoice/ for folders that contain config.json or actual weight files. Two entries are always there - OmniVoice (auto download) and OmniVoice-bf16 (auto download) - mapping to k2-fsa/OmniVoice and drbaph/OmniVoice-bf16. Pick one and hit queue, and it does a HuggingFace snapshot download into models/omnivoice/<name>, skipping the usual dead weight (*.msgpack, flax/tf/h5 files). Once it's on disk, the plain folder name also appears in the dropdown, so you can tell your downloaded copy from a fresh pull.
local_model_path is the escape hatch: an absolute path to any complete OmniVoice folder, which overrides the dropdown. Use it when your models live on another drive.
The rest of the widgets are residency and precision policy, and they matter more than they look:
device-autowalks cuda → mps → xpu → cpu. Fine, leave it.dtype-autoresolves to bf16 on Ampere-or-newer CUDA, fp16 on older cards and Apple silicon, fp32 on CPU. Forcing bf16 on a pre-Ampere GPU warns you and does it anyway; pick fp16.attention-autoandeagerboth load with stock eager attention.sage_attentionrequires the separatesageattentionpackage, then monkey-patches every Qwen3 attention layer with the right kernel for your compute capability (fp8 on 8.9/9.0/12.0, fp16 on 8.0+). No package installed means a console warning and a silent fallback to eager - no speedup, no crash. Don't assume you got it because you selected it.keep_model_loaded- on (default), weights get shunted to CPU after each generation and pulled back when you queue again. Off, and the model is dropped from cache and reloaded from disk next time.
That last one has a sharp edge: the cache is keyed on path + device + dtype + attention + keep_model_loaded. Change any of those mid-session and the old copy is force-unloaded, so toggling keep_model_loaded to "see if it's faster" costs you a full reload both ways.
Wiring and installing
The output is a single omnivoice_model handle - not a MODEL, not a CLIP. It's a bundle that keeps the resident weights around, and it feeds either OmniVoice Voice Clone TTS or OmniVoice Longform TTS. One loader, several generators, no duplicate copies.
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
cd ComfyUI-GGUF-Loader
python -m pip install omnivoice==0.2.1 "transformers>=5.3.0" soxr
ComfyUI Manager will also find it as ComfyUI-GGUF-Loader (publisher chriscoletech), and it will offer to install requirements.txt - which is the whole optional set for the entire pack: qwen-tts, timm, trimesh, scikit-image, einops, addict, and friends. If TTS is all you wanted, the pip line above is the minimum - everything else in that file is for the diffusion, video and 3D half of the pack. On the Windows portable build, swap the python call for .\python_embeded\python.exe -s -m pip install ....
Note that OmniVoice 0.2.1 needs transformers>=5.3.0 for HiggsAudioV2TokenizerModel. That is a genuinely aggressive pin in a ComfyUI install, and it's the same class of collision the ecosystem has been fighting for years - audio node packs are the worst offenders because they all want a different transformers floor. If you hit import errors afterwards, that version bump is the first thing to suspect, not this pack's code.
Where people get burned
The nodes register even when the optional package isn't installed - imports are lazy - so the menu looks fine and the failure only shows up at queue time. The error you'll see mentions the missing omnivoice package, and if the import failed on HiggsAudioV2Tokenizer it appends its own hint to upgrade transformers. Fix the dependency, not the workflow.
Two more, briefly. First run is slow and needs network: a fresh auto-download is several gigabytes before any speech comes out, and an offline box will just fail with a folder-not-found once it's done failing to download. Second, this is not a cheap co-tenant: five-plus GB of TTS alongside a 12B diffusion model is how ComfyUI starts paging weights mid-session. On 12–16 GB, run the audio in its own pass.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | OmniVoice (auto download) | 2 options: OmniVoice (auto download), OmniVoice-bf16 (auto download) |
| device | COMBO | auto | 5 options: auto, cuda, cpu, mps, xpu |
| dtype | COMBO | auto | 4 options: auto, bf16, fp16, fp32 |
| attention | COMBO | auto | 3 options: auto, eager, sage_attention |
| keep_model_loaded | BOOLEAN | true | Keep weights cached on CPU between runs; otherwise fully unload and reload safely. |
| local_model_pathopt | STRING | Absolute path to any complete local OmniVoice model folder. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| omnivoice_model | OMNIVOICE_MODEL | — |