(SP) Normalizer
Make everything the same volume, the right way
- audio_input
- processed_audio
If you generate a few audio clips in a row, they come out at wildly different volumes - and loudness-matching them by ear is misery. (SP) Normalizer is the pack's one-stop level fixer, and it's smarter than the average "make it 90% peak" utility because it bundles four normalization approaches into one node.
The four modes are the story here, because they measure different things:
- lufs - normalizes to a perceived loudness target (default -14 LUFS, the Spotify/streaming standard). This is the one you want for matching tracks or prepping for upload. It uses
pyloudnorm's integrated loudness meter, the same kind of measurement broadcasters use. - rms - matches average power (default target 0.1). Good for consistent levels between clips, and less "perceptual" than LUFS.
- peak - scales so the loudest sample hits a target (default 0.9). This is the "don't clip, ever" mode. It's the least musical of the four because it ignores how loud things feel.
- auto - an automatic gain control that continuously smooths gain toward a target level (default 0.7) using an alpha smoothing factor (
target_auto_alpha, default 0.1). Lower alpha = slower, smoother gain rides; higher alpha reacts faster and can pump.
Honest guidance: use lufs at -14 for anything you'll share or A/B against other music, use peak at 0.9 as a safety net at the very end of a chain, and treat auto as the interesting experimental one.
The knobs that matter
- mode - the dropdown above. Everything else is a target for whichever mode you picked.
- target_lufs_db - the LUFS target, default -14.0. Streaming platforms sit around -14 to -9; -14 is a safe, quiet-ish standard.
- target_peak - 0.0–1.0, default 0.9. Leave it unless you're specifically squeezing.
- target_rms / target_auto / target_auto_alpha - only read when their mode is selected. The other targets are inert, not harmful.
One processed_audio output. Clean and boring, which is what you want from a utility node.
How it fits a chain
The natural order in this pack: Load Audio → Normalizer (lufs, -14) → EQ → Filter → Limiter (to catch stray peaks) → done. A subtle trap: this node normalizes toward a target but doesn't limit, so a clip that's already loud and dynamic can still peak over 1.0 after a LUFS match - that's what the Limiter is for. And if you're comparing before/after, note that a lot of the other nodes in this pack also do a quiet LUFS re-normalization of their own, so you won't usually need both Normalizer and a loudness-preserving effect fighting each other.
Installing it
ComfyUI Manager → "Install Custom Nodes" → search ComfyUI Signal Processing, or:
cd ComfyUI/custom_nodes
git clone https://github.com/c0ffymachyne/ComfyUI_SignalProcessing
then restart ComfyUI. Dependencies from requirements.txt (scipy, pyfar, numpy, torch, torchaudio, pyloudnorm, cupy-cuda11x) - pyloudnorm is the one this node specifically leans on, and Manager installs the whole list for you. The repo is a work in progress; if the pack won't load at all, it's the pinned cupy-cuda11x (the Limiter imports CuPy kernels at startup) - fix that and Normalizer loads with everything else.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| audio_input | AUDIO | — | |
| mode | COMBO | 4 options: lufs, rms, peak, auto | |
| target_rms | FLOAT | 0.10–10 | — |
| target_lufs_db | FLOAT | -14.0-100–100 | — |
| target_peak | FLOAT | 0.90–1 | — |
| target_auto | FLOAT | 0.70–1 | — |
| target_auto_alpha | FLOAT | 0.10–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| processed_audio | AUDIO | — |