Nodes/ComfyUI_AIIA/AIIA Dialogue TTS (Multi-Role)
ComfyUI Node

AIIA Dialogue TTS (Multi-Role)

Hand it a script, get back a two-voice conversation

By havvk·Created about a year ago·Updated 6 months ago· 13
AIIA Dialogue TTS (Multi-Role)
  • speaker_A_ref
  • speaker_B_ref
  • speaker_C_ref
  • cosyvoice_model
  • vibevoice_model
  • qwen_model
  • full_audio
  • segments_info
dialogue_json
tts_engineCosyVoice
pause_duration0.5
speed_global1.00
batch_modeNatural (Hybrid)
speaker_A_id
speaker_A_emotionNone
speaker_A_dialectNone
speaker_B_id
speaker_B_emotionNone
speaker_B_dialectNone
speaker_C_id
speaker_C_emotionNone
speaker_C_dialectNone
max_batch_char1000
cfg_scale1.5
temperature0.80
top_k20
top_p0.95

This is the multi-role endgame node of the AIIA pack: it takes a parsed dialogue script, assigns each character a voice, runs the whole thing through a TTS engine, and stitches it into a single conversation track - with pauses, turn-taking, and per-speaker emotion preserved. If you've ever manually wired three TTS nodes and mixed the results in an audio editor, you know why this exists. It's the "podcast in a node" step, and it's the reason the pack ships a script parser and a stitcher around it.

The pipeline it belongs to

Script Parser → [Emotion Annotator] → Dialogue TTS → Podcast Stitcher. This node expects a dialogue_json - the structured script from the pack's AIIA Podcast Script Parser - in the 角色名: 台词 (Character: line) format. Feed it raw text and it won't know what to do; the parser is the required upstream. The optional Emotion Annotator (an LLM that tags lines with [Happy]/[Sad]-style emotions) slots in between, and this node reads those tags if they're present.

The inputs

  • dialogue_json - the parsed script. This is the load-bearing input.
  • tts_engine - CosyVoice (default), VibeVoice, or Qwen3-TTS. Pick the engine whose model you connected; CosyVoice is the default because it handles emotion tags and dialects natively.
  • pause_duration - seconds of silence between lines, 0.5 default. The (Pause N) tags in the script override this per-line.
  • speed_global - a master tempo, 1.0.
  • batch_mode - Natural (Hybrid) (default: groups lines sensibly for the engine), Strict (Per-Speaker) (each speaker's lines batched together - best when a voice model keeps consistency per speaker), or Whole (Single Batch).
  • speaker_A/B/C ref/id/emotion/dialect - up to three speakers, each with an optional reference audio (_ref), an optional built-in id (_id), a per-speaker emotion default, and a dialect. The _ref is your zero-shot clone source; _id is for engines with fixed voices.
  • Model slots - cosyvoice_model / vibevoice_model / qwen_model; connect the one matching your tts_engine.
  • Sampler panel - max_batch_char (1000), cfg_scale (1.5), temperature, top_k, top_p; passed through to the underlying engine when relevant.

Outputs

  • full_audio (AUDIO) - the whole conversation, mixed, with pauses.
  • segments_info (STRING) - per-line timing/segment metadata, which the downstream stitcher and subtitle nodes consume.

Where it fits and honest caveats

This node is the middle of a bigger machine, not a standalone. The full flow - parse → annotate → dialogue TTS → stitcher → subtitle/web-export - is the pack's flagship "generate a podcast from a script" story, and it's genuinely impressive when it works. The honest caveats:

  • It's engine-dependent by design. CosyVoice gives you emotion tags and dialects; VibeVoice gives you long-form naturalness; Qwen3 gives you instruction control. Your results change with the engine, so test the same script across them.
  • Speaker consistency is the real job. If Speaker A keeps drifting into Speaker B's voice across a long script, switch to Strict (Per-Speaker) batching - that's exactly what the mode is for.
  • Reference audio quality sets the ceiling. A noisy 10-second clip of a voice gives you a noisy cloned voice for the whole conversation.

Troubleshooting

  • No output / wrong engine error - you picked CosyVoice in the dropdown but connected a qwen_model, or vice versa. Match them.
  • Lines run together - raise pause_duration or add (Pause 1.0) tags in the script.
  • Emotions ignored - the engine must support them (CosyVoice does; VibeVoice explicitly doesn't, per the source) and the tags must come from the annotator or your script.
CategoryAIIA/Podcast

Inputs (25)

NameTypeDefaultDescription
dialogue_jsonSTRING
tts_engineCOMBOCosyVoice3 options: CosyVoice, VibeVoice, Qwen3-TTS
pause_durationFLOAT0.50–5
speed_globalFLOAT1.000.5–2
batch_modeCOMBONatural (Hybrid)3 options: Natural (Hybrid), Strict (Per-Speaker), Whole (Single Batch)
speaker_A_refoptAUDIO
speaker_A_idoptSTRING
speaker_A_emotionoptCOMBONone44 options: None, Happy (开心), Sad (悲伤), Angry (愤怒), Excited (兴奋), Gentle (温柔), +38
speaker_A_dialectoptCOMBONone19 options: None, Mandarin (普通话), Cantonese (粤语), Shanghainese (上海话), Sichuanese (四川话), Northeastern (东北话), +13
speaker_B_refoptAUDIO
speaker_B_idoptSTRING
speaker_B_emotionoptCOMBONone44 options: None, Happy (开心), Sad (悲伤), Angry (愤怒), Excited (兴奋), Gentle (温柔), +38
speaker_B_dialectoptCOMBONone19 options: None, Mandarin (普通话), Cantonese (粤语), Shanghainese (上海话), Sichuanese (四川话), Northeastern (东北话), +13
speaker_C_refoptAUDIO
speaker_C_idoptSTRING
speaker_C_emotionoptCOMBONone44 options: None, Happy (开心), Sad (悲伤), Angry (愤怒), Excited (兴奋), Gentle (温柔), +38
speaker_C_dialectoptCOMBONone19 options: None, Mandarin (普通话), Cantonese (粤语), Shanghainese (上海话), Sichuanese (四川话), Northeastern (东北话), +13
cosyvoice_modeloptCOSYVOICE_MODEL
vibevoice_modeloptVIBEVOICE_MODEL
qwen_modeloptQWEN_MODEL
max_batch_charoptINT1000100–32768
cfg_scaleoptFLOAT1.51–10
temperatureoptFLOAT0.800.1–2
top_koptINT200–100
top_poptFLOAT0.950–1

Outputs (2)

NameTypeDescription
full_audioAUDIO
segments_infoSTRING