Nodes/ComfyUI-OmniVoice-TTS/OmniVoice Multi-Speaker TTS
ComfyUI Node

OmniVoice Multi-Speaker TTS

A two-person podcast argument, one node, zero editing — OmniVoice multi-speaker

By Saganaki22·Created 5 months ago·Updated 3 months ago· 537
OmniVoice Multi-Speaker TTS
    • audio
    model
    text[Speaker_1]: Hello, I'm speaker one. [Speaker_2]: And I'm speaker two!
    steps32
    guidance_scale2.0
    t_shift0.10
    speed1.0
    pause_between_speakers0.3
    device
    dtype
    attention
    position_temperature5.0
    class_temperature0.0
    layer_penalty_factor5.0
    denoisetrue
    preprocess_prompttrue
    postprocess_outputtrue
    seed0
    keep_model_loadedtrue
    num_speakers

    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.

    CategoryOmniVoice

    Inputs (19)

    NameTypeDefaultDescription
    modelCOMBOOmniVoice model checkpoint. Models are stored in ComfyUI/models/omnivoice/
    textSTRING[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.
    stepsINT324–64Diffusion steps per speaker.
    guidance_scaleFLOAT2.00–10Classifier-free guidance scale.
    t_shiftFLOAT0.100–1Time-step shift for noise schedule.
    speedFLOAT1.00.5–2Speaking speed for all speakers.
    pause_between_speakersFLOAT0.30–2Seconds of silence between speakers.
    deviceCOMBOCompute device.
    dtypeCOMBOModel precision.
    attentionCOMBOAttention implementation.
    position_temperatureFLOAT5.00–20Temperature for mask-position selection. 0 = greedy.
    class_temperatureFLOAT0.00–5Temperature for token sampling. 0 = greedy.
    layer_penalty_factorFLOAT5.00–20Penalty on deeper codebook layers.
    denoiseBOOLEANtruePrepend denoise token for cleaner output.
    preprocess_promptBOOLEANtruePreprocess reference audio (remove silences).
    postprocess_outputBOOLEANtruePost-process audio (remove long silences).
    seedINT00–2147483647Random seed. 0 = random.
    keep_model_loadedBOOLEANtrueKeep model loaded between runs.
    num_speakersCOMBOHow many speakers (2-10). Changing this shows/hides speaker audio inputs.

    Outputs (1)

    NameTypeDescription
    audioAUDIO