OmniVoice Longform TTS
Longform TTS with 600 languages and no API key — this is the pack's all-rounder
- ref_audio
- whisper_model
- audio
If you install exactly one node from the OmniVoice pack, make it this one. OmniVoiceLongformTTS is the do-everything text-to-speech node: throw a whole paragraph - or a whole script - at it and it chunk the text at sentence boundaries, synthesize each piece, and hand you back one clean AUDIO track. Plug in a reference clip and it turns into a voice cloner. Leave the reference disconnected and it just picks a voice for you. No API, no key, fully local, and it claims 600+ languages - which is a much bigger deal than it sounds when most open TTS is English-first.
The engine underneath is OmniVoice by k2-fsa: a diffusion language model built on a Qwen3 backbone (the README is refreshingly honest about that in its attention-backend section) that generates speech token-by-token rather than in one shot. That's what makes it both fast - RTF down around 0.025, meaning 40x real-time - and multilingual. It landed in April 2026 to a genuinely split reception: half the thread loved it ("the model is great and fast"), the other half compared it to VibeVoice or Chatterbox and shrugged. My take: it's the best "one pack, many languages, no training" option in ComfyUI right now, and the longform node is the cleanest way to exercise it.
The input list is long, but a beginner only needs a handful. model is a dropdown - OmniVoice (full fp32, ~4GB) or OmniVoice-bf16 (~2GB), both auto-download to ComfyUI/models/omnivoice/ on first run. text is your script; it supports inline non-verbal tags like [laughter], [sigh], [question-en], which are nice when they work - fair warning from the community: they're hit or miss, and sometimes the model reads them aloud or ignores them entirely. words_per_chunk (default 100) is the chunking knob; 0 disables it. ref_audio and ref_text are optional - connect a 3–15 second clip and it becomes a voice-clone job; leave ref_text empty and Whisper transcribes the clip for you. instruct lets you force dialect and style, but only from a fixed list (male, indian accent, whisper, and a bunch of Chinese dialects like 河南话), so don't free-type there.
The sampler-ish knobs are shared across every OmniVoice node: steps (16 = fast, 32 = balanced, 64 = best), guidance_scale (2.0 default), speed, and the three temperature/penalty knobs you can safely ignore on day one. keep_model_loaded stays on - it offloads the model to CPU between runs rather than fully unloading. The output is a single audio (AUDIO) that wires straight into a save-audio node, or into the next stage of a talking-head pipeline if you're building a lip-sync workflow.
Install is ComfyUI Manager - search "OmniVoice" - or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Saganaki22/ComfyUI-OmniVoice-TTS.git
cd ComfyUI-OmniVoice-TTS
python install.py
One real gotcha, and the pack's README is upfront about it: the omnivoice pip package pins torch==2.8.*, which can downgrade your PyTorch to CPU-only and kill ComfyUI's GPU. The installer gets around it with --no-deps, but if your PyTorch ever goes weird, check the pack's pytorch_compatibility_matrix.md. The other classic failure: only the Whisper Loader node shows up and the TTS nodes are missing - that's omnivoice failing to import, usually because transformers is too old (pip install "transformers>=5.3.0" plus soxr), followed by a full ComfyUI restart. Expect roughly 5GB VRAM with the bf16 model and cloning enabled, per community measurements.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | OmniVoice model checkpoint. Models are stored in ComfyUI/models/omnivoice/ | |
| text | STRING | Hello! This is a test of OmniVoice text to speech synthesis. | Text to synthesize. Supports inline non-verbal tags like [laughter], [sigh], [sniff], [question-en], etc. Long text will be automatically chunked at sentence boundaries. |
| ref_text | STRING | Transcript of the reference audio. Leave empty to auto-transcribe with Whisper. Only used if 'ref_audio' is connected. | |
| steps | INT | 324–64 | Number of diffusion steps. 16 = faster, 32 = balanced, 64 = best quality. |
| guidance_scale | FLOAT | 2.00–10 | Classifier-free guidance scale. Higher = more aligned with text. |
| t_shift | FLOAT | 0.100–1 | Time-step shift for noise schedule. Smaller = emphasis on earlier steps. |
| speed | FLOAT | 1.00.5–2 | Speaking speed factor. >1.0 = faster, <1.0 = slower. |
| duration | FLOAT | 0.00–60 | Fixed output duration in seconds. 0 = automatic (uses speed). Overrides speed if set. |
| device | COMBO | auto | Compute device. 'auto' picks CUDA > MPS > XPU > CPU. |
| dtype | COMBO | auto | Model precision. 'auto' picks bf16 for CUDA (Ampere+) / XPU, fp16 for older CUDA/MPS, fp32 for CPU. |
| attention | COMBO | auto | Attention implementation. 'auto' uses model default (eager). 'sage_attention' uses SageAttention CUDA kernels (requires SM80+ GPU). |
| seed | INT | 00–2147483647 | Random seed. 0 = random. |
| words_per_chunk | INT | 1000–500 | Words per chunk for long text. 0 = no chunking. Chunks split at sentence boundaries, not mid-word. |
| position_temperature | FLOAT | 5.00–20 | Temperature for mask-position selection. 0 = greedy, higher = more random. |
| class_temperature | FLOAT | 0.00–5 | Temperature for token sampling. 0 = greedy, higher = more random. |
| layer_penalty_factor | FLOAT | 5.00–20 | Penalty on deeper codebook layers, encouraging lower layers to unmask first. |
| denoise | BOOLEAN | true | Prepend denoise token to input for cleaner output. |
| preprocess_prompt | BOOLEAN | true | Preprocess voice-clone prompt audio (remove silences, add punctuation). |
| postprocess_output | BOOLEAN | true | Post-process generated audio (remove long silences). |
| keep_model_loaded | BOOLEAN | true | Keep model loaded between runs. Model is automatically offloaded to CPU after generation to free VRAM, then resumed to GPU on the next run. |
| instruct | STRING | Dialect/style instruction from the model's supported values. English: american/british/australian/canadian/chinese/indian/japanese/korean/portuguese/russian accent, male/female, child/young adult/teenager/middle-aged/elderly, very low pitch/low pitch/moderate pitch/high pitch/very high pitch, whisper. Chinese: 四川话/东北话/陕西话/河南话/云南话/贵州话/甘肃话/宁夏话/石家庄话/济南话/青岛话/桂林话, 男/女, 儿童/少年/青年/中年/老年, 极低音调/低音调/中音调/高音调/极高音调, 耳语. Use comma-separated (English) or full-width comma (Chinese). Applied to every chunk. Leave empty for default. | |
| ref_audioopt | AUDIO | Optional reference audio for voice cloning. 3-15 seconds of clear speech works best. If not connected, uses automatic voice selection. | |
| whisper_modelopt | WHISPER_ASR | Optional pre-loaded Whisper ASR model for auto-transcription. Connect from OmniVoice Whisper Loader to avoid re-downloading. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |