Nodes/ComfyUI_AIIA/🧵 AIIA Podcast Stitcher
ComfyUI Node

🧵 AIIA Podcast Stitcher

Stitching It Back Together

By havvk·Created about a year ago·Updated 6 months ago· 13
🧵 AIIA Podcast Stitcher
  • audio_A
  • audio_B
  • asr_A
  • asr_B
  • audio
  • segments_info
split_map
gap_duration0.25
padding0.10
fade_ms30
use_vadfalse
use_forced_alignfalse

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 the ASR_RESULT objects 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.

CategoryAIIA/Podcast

Inputs (10)

NameTypeDefaultDescription
split_mapSTRING
audio_AAUDIO
audio_BAUDIO
asr_AASR_RESULT
asr_BASR_RESULT
gap_durationoptFLOAT0.250–2说话人交替时插入的过渡时长(秒)
paddingoptFLOAT0.100–0.5每个切片前后保留的呼吸/尾音余量(秒)
fade_msoptINT305–100切片首尾的余弦淡入淡出时长(毫秒),越长越平滑
use_vadoptBOOLEANfalse启用 Silero VAD 模型精确检测语音边界(首次使用自动下载 ~2MB 模型)
use_forced_alignoptBOOLEANfalse启用 MMS Forced Alignment 字级强制对齐(需要 ~1.2GB 模型,精度最高)

Outputs (2)

NameTypeDescription
audioAUDIO
segments_infoSTRING