OmniVoice Multi-Speaker TTS
A two-person podcast argument, one node, zero editing — OmniVoice multi-speaker
- audio
The demo that sells this pack. OmniVoiceMultiSpeakerTTS generates a whole conversation in one pass - two, three, up to ten different cloned voices trading lines, with proper pauses between speakers - and outputs a single AUDIO file. No stitching clips together in an editor, no per-speaker generation and concatenation, no alignment pain. If you've ever tried to fake a dialogue with a single TTS voice, this node is the reason to stop.
The trick is dead simple on your side: mark each line with a [Speaker_N]: tag and wire each speaker's reference audio to its numbered input.
[Speaker_1]: Hello, I'm speaker one.
[Speaker_2]: And I'm speaker two!
[Speaker_1]: Nice to meet you!
num_speakers (2–10) controls how many speaker inputs appear. On ComfyUI 0.8.1+ these are dynamic inputs that show and hide as you change the count; on older ComfyUI the node falls back to a legacy mode where the inputs are always present. For each speaker you get three optional inputs: speaker_N_audio (their 3–15 second reference clip - required if that speaker is going to sound like anyone in particular), speaker_N_ref_text (transcript; empty = auto-transcribed with Whisper), and speaker_N_instruct (a per-speaker dialect/style push, from the model's fixed list like male, elderly, 河南话). If you leave a speaker's audio unconnected, OmniVoice will still render their lines with a synthetic voice - handy for that one extra character you don't have a reference for.
Under the hood it's the same zero-shot diffusion TTS as the rest of the pack, just parsing your tagged script, generating each speaker's lines against their own voice tokens, and layering in pause_between_speakers (0.3s default) so the back-and-forth reads as a real conversation rather than clipped together. Generation runs per speaker, so steps (32 default) and speed apply to all of them; the other knobs - guidance_scale, t_shift, the temperature trio - match the other nodes. The output is one audio (AUDIO) track with everyone already in place.
Quality follows the same rules as the single-speaker clone node, and they're worth repeating because a bad reference ruins a whole dialogue: use clear, 3–15 second samples, and if you want an argument that actually escalates, pick references with emotional range - the model's expression stays close to what its source clips contain. The non-verbal tags ([laughter], [sigh]) work in multi-speaker text too, with the usual caveat that they're sometimes ignored or spoken aloud.
Install is pack-standard: search "OmniVoice" in ComfyUI Manager, or git clone https://github.com/Saganaki22/ComfyUI-OmniVoice-TTS and run python install.py. The shared gotchas all apply: the installer uses --no-deps on omnivoice specifically because its torch==2.8.* pin can downgrade your PyTorch and break GPU acceleration - don't install it any other way. If the node is red or missing while the Whisper Loader works, that's the omnivoice import failing, almost always a transformers too old for the model's tokenizer (5.3+ needed) or a missing soxr, fixed with a pip install and a full restart. VRAM with bf16 lands around 4–6GB depending on how many speakers are live at once - keep_model_loaded offloads to CPU between runs, so it settles back down.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | OmniVoice model checkpoint. Models are stored in ComfyUI/models/omnivoice/ | |
| text | STRING | [Speaker_1]: Hello, I'm speaker one. [Speaker_2]: And I'm speaker two! | Multi-speaker text. Use [Speaker_N]: to assign lines to each connected speaker. Supports inline tags: [laughter], [sigh], etc. |
| steps | INT | 324–64 | Diffusion steps per speaker. |
| guidance_scale | FLOAT | 2.00–10 | Classifier-free guidance scale. |
| t_shift | FLOAT | 0.100–1 | Time-step shift for noise schedule. |
| speed | FLOAT | 1.00.5–2 | Speaking speed for all speakers. |
| pause_between_speakers | FLOAT | 0.30–2 | Seconds of silence between speakers. |
| device | COMBO | Compute device. | |
| dtype | COMBO | Model precision. | |
| attention | COMBO | Attention implementation. | |
| position_temperature | FLOAT | 5.00–20 | Temperature for mask-position selection. 0 = greedy. |
| class_temperature | FLOAT | 0.00–5 | Temperature for token sampling. 0 = greedy. |
| layer_penalty_factor | FLOAT | 5.00–20 | Penalty on deeper codebook layers. |
| denoise | BOOLEAN | true | Prepend denoise token for cleaner output. |
| preprocess_prompt | BOOLEAN | true | Preprocess reference audio (remove silences). |
| postprocess_output | BOOLEAN | true | Post-process audio (remove long silences). |
| seed | INT | 00–2147483647 | Random seed. 0 = random. |
| keep_model_loaded | BOOLEAN | true | Keep model loaded between runs. |
| num_speakers | COMBO | How many speakers (2-10). Changing this shows/hides speaker audio inputs. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |