Nodes/ComfyUI-Rennart/🎵 Rennart Audio Concatenate
ComfyUI Node

🎵 Rennart Audio Concatenate

Thirty clips in, one track out (and the trap that eats audio_5)

By Rennart2025·Created 2 months ago·Updated 4 days ago· 4
🎵 Rennart Audio Concatenate
  • audio_1
  • audio_2
  • audio_3
  • audio_4
  • audio_5
  • audio_6
  • audio_7
  • audio_8
  • audio_9
  • audio_10
  • audio_11
  • audio_12
  • audio_13
  • audio_14
  • audio_15
  • audio_16
  • audio_17
  • audio_18
  • audio_19
  • audio_20
  • audio_21
  • audio_22
  • audio_23
  • audio_24
  • audio_25
  • audio_26
  • audio_27
  • audio_28
  • audio_29
  • audio_30
  • audio
◄number_of_inputs2►
◄pause_seconds1.0►

What it's for

Audio in ComfyUI got bolted on late and sideways. TTS, music and foley each arrive through their own pack with its own dependency stack, so you rarely end up with one clean soundtrack - you end up with a pile of separate AUDIO clips. A narration line per scene from Chatterbox, three ACE-Step chunks, some MMAudio foley. And then something downstream wants exactly one input: a lip-sync model, a video model with a soundtrack, or a Save Audio.

Rennart Audio Concatenate is the glue for that moment: clips in order, first to last, an optional stretch of silence between them, one AUDIO back. No mixing, no crossfade, no ducking. If you were hoping to lay a music bed under the narration, this isn't it - concatenate means after, not on top of.

How it works

Internally, ComfyUI's AUDIO type is a dict: a waveform tensor shaped [batch, channels, samples] plus a sample_rate. The node reads that shape directly, so the mechanism tells you the failure modes in advance:

  • it walks audio_1 … audio_N in order, skipping any socket you left empty;
  • it checks that all incoming clips share one sample_rate and one channel count, and raises if they don't;
  • it builds a single silence tensor (sample_rate × pause_seconds samples) using the dtype and device of the first clip;
  • then torch.cats everything along the sample dimension, inserting a pause between each pair but never after the last clip.

Two things fall out of that loop. Gaps in the numbering collapse instead of erroring - audio_1 and audio_3 wired with audio_2 empty gives you those two back to back, in that order. And if only one clip arrives, the node returns it untouched rather than appending a stray pause.

The inputs that matter

number_of_inputs (2–30) is the one you actually touch. All thirty sockets exist, but the node only reads the first number_of_inputs of them. So if you wire audio_5 and leave the widget at its default of 2, clip five is silently dropped and you'll spend an evening wondering where it went. Bump the count to match your highest wired socket.

pause_seconds (default 1.0, max 60) is the gap between clips, in seconds. Zero means no gap at all. As the author's own tooltip points out, pauses go between clips only.

audio_1 and audio_2 are required; audio_3 through audio_30 are optional. Output is a single socket named audio - wire it into Save Audio, a lip-sync/video node, or another glue node.

Install

ComfyUI Manager: search ComfyUI-Rennart and install, then restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/Rennart2025/ComfyUI-Rennart
# restart ComfyUI

That's the whole install: requirements.txt is torch and numpy, no model files, nothing new to download.

Two quirks worth knowing before you go hunting. The README's node list is stale - it doesn't mention this node at all, nor RGBA to RGB, nor a couple of others shipping in the folder. Search the Add Node menu for "Rennart" or open category Rennart/Audio instead of trusting the docs. Otherwise: solo pack, version 1.0.0, tooltips and error strings in Russian, a few other nodes forked by the author's own admission from WAS Node Suite and the Ideogram palette tools, MIT, and basically no community track record. The whole node is about forty readable lines.

One install detail explains a lot of confusion: the pack's __init__.py auto-imports every .py file in its folder at startup. If a sibling node fails, you get a [Rennart] ⚠️ Не удалось загрузить ... line in the console and the rest of the pack still loads. A missing node plus a Cyrillic warning is that, not a broken install.

Common issues

"Sample rates don't match." The node refuses to stitch clips of different sample_rate rather than guessing, and it's right not to - a wrong guess gives you pitched-down narration. You hit this the moment TTS output meets a music or foley model - they rarely agree on a rate. Resample first: ffmpeg -i in.wav -ar 44100 out.wav, or whatever resample node your TTS pack ships.

Same error, different numbers: channel count. One mono clip against a stereo clip fails the same check. Make them all stereo (or all mono) before they reach the node.

"I added a fifth clip and it vanished." Almost always number_of_inputs - the number-one trap on this node.

"The pauses look wrong." pause_seconds goes between clips only, never trailing, a fixed duration rather than silence detection. If a clip already has room tone at the head, you get both.

"It's eating my RAM." This isn't a streaming mixer - every input sits in memory and the result is one new tensor from a single torch.cat. A few TTS lines are nothing; a ten-minute podcast from thirty full clips is a job for ffmpeg.

CategoryRennart/Audio

Inputs (32)

NameTypeDefaultDescription
number_of_inputsINT22–30Количество аудио для склейки (от 2 до 30).
pause_secondsFLOAT1.00–60Длительность паузы между склейками в секундах (0 = без пауз).
audio_1AUDIO—
audio_2AUDIO—
audio_3optAUDIO—
audio_4optAUDIO—
audio_5optAUDIO—
audio_6optAUDIO—
audio_7optAUDIO—
audio_8optAUDIO—
audio_9optAUDIO—
audio_10optAUDIO—
audio_11optAUDIO—
audio_12optAUDIO—
audio_13optAUDIO—
audio_14optAUDIO—
audio_15optAUDIO—
audio_16optAUDIO—
audio_17optAUDIO—
audio_18optAUDIO—
audio_19optAUDIO—
audio_20optAUDIO—
audio_21optAUDIO—
audio_22optAUDIO—
audio_23optAUDIO—
audio_24optAUDIO—
audio_25optAUDIO—
audio_26optAUDIO—
audio_27optAUDIO—
audio_28optAUDIO—
audio_29optAUDIO—
audio_30optAUDIO—

Outputs (1)

NameTypeDescription
audioAUDIO—