🔊🪡AGSoft Audio Concatenate Plus
Glue TTS clips into one track with crossfades and matched loudness
- audio_path
- duration_seconds
- duration_timecode
- file_size_mb
🔊🪡AGSoft Audio Concatenate Plus is the node that turns several audio files into one, with the two features that make raw concatenation sound amateurish: crossfades between tracks and loudness matching. If you've ever stitched TTS clips together and heard one sentence blast louder than the rest, you know exactly why the loudness part matters.
The classic workflow: generate a handful of voiceover lines, load them with AGSoft Load Audio, and feed them all into this node. Out comes one file that sounds like it was produced as a unit instead of stapled together.
How it works
Set inputs_count (2–10) and the node dynamically grows that many audio_N inputs. Then choose the joining mode:
concat- tracks play back-to-back, no transition.crossfade- a smooth transition between adjacent tracks, withcrossfade_duration(0.1–30s) and acrossfade_curveto shape it:tri(linear),exp,log, sine-basedqsin/hsin, sigmoiddese/desi, ornofade(hard cut).
The loudnorm toggle is the quiet hero here. It normalizes every track to EBU R128 (integrated −16 LUFS) before joining, so none of them overpowers the others. It's the difference between a podcast that sounds consistent and a mix where you're reaching for the volume knob at every junction.
You also get fade_in / fade_out for the whole result (0–60s each) - handy for a clip meant to loop or fade up from silence. Output is mp3 / wav / flac / ogg / m4a via format, with bitrate (96k–320k) for the lossy ones. output_name is the filename; output_path is the folder, empty = ComfyUI/output.
The inputs a beginner actually sets
mode- start withcrossfadeif the tracks are sentences in one narration;concatif they're discrete clips.crossfade_duration- 0.5–1s feels natural for speech. Bigger for music beds.loudnorm- honestly, just leave iton. The default is off, but matching loudness is why you're here.
Outputs
audio_path(STRING) - where the merged file was written.duration_seconds,duration_timecode- the total length (handy if you're fitting it to a video later).file_size_mb- size, so you can sanity-check your bitrate choice.
Install
Part of the comfyui-AGSoft pack - ComfyUI Manager → search "comfyui-AGSoft" → Install → restart, or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/Art-xmaster/comfyui-AGSoft
Restart and go. No models, no extra Python deps for audio work; it drives the bundled FFmpeg binary (or a system ffmpeg on PATH). If you see "ffmpeg not found", install FFmpeg and restart ComfyUI.
One note on feeding it: if you bring audio in through AUDIO sockets, the files arrive as decoded PCM and get written to temp WAVs. That's fine here - the whole point is re-encoding to one output - so unlike the split nodes, you don't need to fight to preserve the source codec.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| output_name | STRING | output_audio_plus.mp3 | Output filename. The extension is set by the chosen format. --- Имя итогового файла. Расширение задаётся выбранным форматом. |
| output_path | STRING | Output directory. If empty, ComfyUI/output is used. --- Папка сохранения. Если пусто, используется ComfyUI/output. | |
| inputs_count | COMBO | 2 | Number of audio tracks to concatenate. --- Количество аудио-дорожек для склейки. |
| mode | COMBO | concat | concat = join tracks back-to-back (no transition). crossfade = smooth transition between tracks. --- concat = склейка встык (без перехода). crossfade = плавный переход между треками. |
| crossfade_duration | FLOAT | 1.00.1–30 | Crossfade duration (seconds) between adjacent tracks. Used only in crossfade mode. --- Длительность кроссфейда (в секундах) между соседними треками. Только в режиме crossfade. |
| crossfade_curve | COMBO | tri | Crossfade curve. tri = linear, exp = exponential, log = logarithmic, qsin/hsin = sine-based, dese/desi = sigmoid, nofade = hard cut. --- Кривая кроссфейда. tri = линейная, exp = экспоненциальная, log = логарифмическая, qsin/hsin = синусоидные, dese/desi = сигмоидные, nofade = жёсткий рез. |
| loudnorm | COMBO | off | Normalize loudness of all tracks to EBU R128 (I=-16 LUFS) before joining, so no track is louder than another. --- Нормализовать громкость всех треков по EBU R128 (I=-16 LUFS) перед склейкой, чтобы ни один трек не был громче другого. |
| fade_in | FLOAT | 0.000–60 | Fade-in of the whole result (seconds). 0 = off. --- Нарастание всего результата (в секундах). 0 = выкл. |
| fade_out | FLOAT | 0.000–60 | Fade-out of the whole result (seconds). 0 = off. --- Затухание всего результата (в секундах). 0 = выкл. |
| format | COMBO | mp3 | Output format. mp3/wav/flac/ogg/m4a. --- Формат выхода. mp3/wav/flac/ogg/m4a. |
| bitrate | COMBO | 192k | Bitrate for lossy formats (mp3/ogg/m4a). Ignored for wav/flac. --- Битрейт для lossy-форматов (mp3/ogg/m4a). Игнорируется для wav/flac. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio_path | STRING | — |
| duration_seconds | FLOAT | — |
| duration_timecode | STRING | — |
| file_size_mb | FLOAT | — |