VoiceBridge Audio List Merger by SRT
Stitch any TTS's sentences back into one synced track
- srt_items
- audios
- audio
- adjusted_srt
The decoupled pipeline - the one that lets you use any TTS node - dumps a pile of per-sentence audio clips at its end, and this node is the stitching machine that turns that pile back into one synced track. If VoiceBridge SRT Splitter is what makes "any TTS" possible, this is what makes it useful: without it you'd have 200 loose audio clips and no way to line them up with the video.
How it works
It takes the srt_items metadata from VoiceBridge SRT Splitter (the original (index, start_ms, end_ms, text) timing) plus the audios list - the per-sentence AUDIO outputs from whatever TTS node you ran - and merges them into a single AUDIO placed at each subtitle's original timestamp. Then it applies the same duration-matching engine that the bundled SRT To Audio uses: if a clip is too long for its slot, it speeds it up (capped by tempo_limit), and if it still overflows it cascades the later subtitles forward to make room, always preserving the mini_gap_ms breathing room between cues.
Two implementation details worth knowing:
- Sample rate is handled for you. It reads the sample rate from the first incoming AUDIO dict and resamples every other sentence to match. No manual rate-setting, no "why is half my audio pitched wrong" surprises.
- It leans on ComfyUI's list-iteration. The
audiosinput is declared as a list type, so the graph collects each TTS output automatically as the splitter feeds sentences through. You don't build the list by hand; the framework does it.
The inputs that matter
srt_items- fromVoiceBridge SRT Splitter. The timing map; without it there's nothing to align to.audios- the per-sentence AUDIO outputs from your TTS node. This is the "bring your own voice" slot: Qwen3-TTS, VoxCPM, Fish Audio S2, CosyVoice, anything that takes a string and returns an AUDIO.tempo_limit(default 1.5, range 1.0–5.0) - max speed-up factor for clips that overflow their subtitle slot.mini_gap_ms(default 100, range 0–10,000) - minimum gap preserved between subtitles.
Outputs
audio- the merged track in ComfyUI format (waveform,sample_rate), ready for a Save Audio / preview / VideoCombine.adjusted_srt- the retimed SRT string reflecting the actual audio durations after tempo/shift corrections. Wire it toSave SRT From Stringto keep subtitles that match what the voice actually did.
Installing it
Part of the comfyui_voicebridge pack. ComfyUI Manager search "VoiceBridge", or:
cd ComfyUI/custom_nodes
git clone https://github.com/YanTianlong-01/comfyui_voicebridge.git
cd comfyui_voicebridge
pip install -r requirements.txt
Restart ComfyUI. This node itself runs no model - the TTS work happened upstream - so it's cheap to run.
The honest catch
This node is the payoff of a more complex graph, and the price is that "merge by list" means every downstream TTS call runs per-sentence. On a long subtitle file that's a slow render and a real memory question, which is precisely why the pack keeps the one-node SRT To Audio around for when you don't need a specific third-party voice. Pick the merger when voice choice matters more than simplicity; pick SRT To Audio when you just want it finished.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| srt_items | VB_SRT_ITEMS | — | |
| audios | AUDIO | — | |
| tempo_limitopt | FLOAT | 1.51–5 | Maximum speed-up factor for audio that exceeds subtitle duration |
| mini_gap_msopt | INT | 1000–10000 | Minimum gap between subtitles in milliseconds |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| adjusted_srt | STRING | — |