AIIA Dialogue TTS (Multi-Role)
Hand it a script, get back a two-voice conversation
- speaker_A_ref
- speaker_B_ref
- speaker_C_ref
- cosyvoice_model
- vibevoice_model
- qwen_model
- full_audio
- segments_info
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, orQwen3-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), orWhole (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_refis your zero-shot clone source;_idis for engines with fixed voices. - Model slots -
cosyvoice_model/vibevoice_model/qwen_model; connect the one matching yourtts_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
CosyVoicein the dropdown but connected aqwen_model, or vice versa. Match them. - Lines run together - raise
pause_durationor 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.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| dialogue_json | STRING | — | |
| tts_engine | COMBO | CosyVoice | 3 options: CosyVoice, VibeVoice, Qwen3-TTS |
| pause_duration | FLOAT | 0.50–5 | — |
| speed_global | FLOAT | 1.000.5–2 | — |
| batch_mode | COMBO | Natural (Hybrid) | 3 options: Natural (Hybrid), Strict (Per-Speaker), Whole (Single Batch) |
| speaker_A_refopt | AUDIO | — | |
| speaker_A_idopt | STRING | — | |
| speaker_A_emotionopt | COMBO | None | 44 options: None, Happy (开心), Sad (悲伤), Angry (愤怒), Excited (兴奋), Gentle (温柔), +38 |
| speaker_A_dialectopt | COMBO | None | 19 options: None, Mandarin (普通话), Cantonese (粤语), Shanghainese (上海话), Sichuanese (四川话), Northeastern (东北话), +13 |
| speaker_B_refopt | AUDIO | — | |
| speaker_B_idopt | STRING | — | |
| speaker_B_emotionopt | COMBO | None | 44 options: None, Happy (开心), Sad (悲伤), Angry (愤怒), Excited (兴奋), Gentle (温柔), +38 |
| speaker_B_dialectopt | COMBO | None | 19 options: None, Mandarin (普通话), Cantonese (粤语), Shanghainese (上海话), Sichuanese (四川话), Northeastern (东北话), +13 |
| speaker_C_refopt | AUDIO | — | |
| speaker_C_idopt | STRING | — | |
| speaker_C_emotionopt | COMBO | None | 44 options: None, Happy (开心), Sad (悲伤), Angry (愤怒), Excited (兴奋), Gentle (温柔), +38 |
| speaker_C_dialectopt | COMBO | None | 19 options: None, Mandarin (普通话), Cantonese (粤语), Shanghainese (上海话), Sichuanese (四川话), Northeastern (东北话), +13 |
| cosyvoice_modelopt | COSYVOICE_MODEL | — | |
| vibevoice_modelopt | VIBEVOICE_MODEL | — | |
| qwen_modelopt | QWEN_MODEL | — | |
| max_batch_charopt | INT | 1000100–32768 | — |
| cfg_scaleopt | FLOAT | 1.51–10 | — |
| temperatureopt | FLOAT | 0.800.1–2 | — |
| top_kopt | INT | 200–100 | — |
| top_popt | FLOAT | 0.950–1 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| full_audio | AUDIO | — |
| segments_info | STRING | — |