🧵 AIIA Podcast Stitcher
Stitching It Back Together
- audio_A
- audio_B
- asr_A
- asr_B
- audio
- segments_info
Generating two voices separately is easy. Fusing them back into one natural-sounding conversation is where multi-voice podcast workflows actually die - naive concatenation gives you clipped syllables, botched timing, and dialogues that sound like two robots passing the mic. 🧵 AIIA Podcast Stitcher is the reassembly node, and it's the most technically interesting part of the split-stitch pipeline: it uses speech-recognition timestamps to find where each sentence actually starts and ends in the audio, then interleaves the tracks in the original script order.
How it works
The inputs are split_map (from AIIA Podcast Splitter, telling it the original order), the two separately generated tracks audio_A and audio_B, and - here's the key - asr_A and asr_B, the ASR results for each track with word-level timestamps. By matching the script sentences against the ASR word timeline (via exact match, then edit-distance fuzzy matching to tolerate ASR errors), it locates every sentence's true boundaries and slices exactly there. Then it interleaves A/B per the script order with a cosine fade at each join so the handoff is inaudible.
The inputs that matter
asr_A/asr_B- required, and easy to miss. These are theASR_RESULTobjects from the pack's AIIA ASR Node (FunASR-based, produces word-level timestamps). Without them there's no boundary detection. This is the #1 wiring mistake in this workflow - people hook up the audio and forget ASR, then wonder why the stitcher can't find anything.gap_duration(0.25s default) - silence inserted at speaker handoffs. The natural-conversation dial; raise it for a more deliberate back-and-forth.padding(0.1s default) - breathing room kept before/after each slice so you don't clip the start of syllables.fade_ms(30ms default) - cosine fade length at slice edges. Longer is smoother but can smear consonants.use_vad- optional Silero VAD (auto-downloads ~2MB on first use) for precise speech-boundary detection. Good when ASR timestamps are jittery.use_forced_align- the high-precision option: Facebook MMS forced alignment (~1.2GB model) does character-level alignment, with Chinese text auto-converted to pinyin. Slowest and most accurate; the README describes a hybrid strategy that uses FA for onsets and energy detection for natural endings.
Outputs are the stitched audio and a segments_info JSON (timeline per line), which feeds AIIA Subtitle Gen - so you get a subtitled, speaker-tagged result straight out of the stitcher.
When you'd use it
Only in the split-stitch flow - per-speaker TTS, then reassembly. If you're using the pack's single dialogue node (CosyVoice or Qwen3), you don't need it, since those already output a combined timeline. But for the "different engine per character" setup, this is the node that makes the result sound like a real conversation instead of a cut-and-paste job.
Install
Standard pack install: havvk/ComfyUI_AIIA via ComfyUI Manager or git clone https://github.com/havvk/ComfyUI_AIIA.git into custom_nodes/, restart. The Silero VAD and MMS FA models auto-download on first use; the forced-align one is a big download, so only flip that toggle when you need the precision.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| split_map | STRING | — | |
| audio_A | AUDIO | — | |
| audio_B | AUDIO | — | |
| asr_A | ASR_RESULT | — | |
| asr_B | ASR_RESULT | — | |
| gap_durationopt | FLOAT | 0.250–2 | 说话人交替时插入的过渡时长(秒) |
| paddingopt | FLOAT | 0.100–0.5 | 每个切片前后保留的呼吸/尾音余量(秒) |
| fade_msopt | INT | 305–100 | 切片首尾的余弦淡入淡出时长(毫秒),越长越平滑 |
| use_vadopt | BOOLEAN | false | 启用 Silero VAD 模型精确检测语音边界(首次使用自动下载 ~2MB 模型) |
| use_forced_alignopt | BOOLEAN | false | 启用 MMS Forced Alignment 字级强制对齐(需要 ~1.2GB 模型,精度最高) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| segments_info | STRING | — |