Nodes/RyanOnTheInside/Audio Volume Normalization βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
ComfyUI Node

Audio Volume Normalization βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜

Get your track to a consistent loudness before anything else touches it

By ryanontheinsideΒ·Created 2 years agoΒ·Updated 5 months agoΒ· 852
Audio Volume Normalization βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
  • audio
  • AUDIO
β—„target_level-10.0β–Ί

Simple node, easy to skip, and one of the more useful early steps in any audio-reactive workflow: it normalizes your audio to a target RMS loudness. That matters more than it sounds like it should, because a lot of downstream nodes in this pack - AudioFeatureExtractor set to amplitude_envelope or rms_energy in particular - are directly reading loudness off the waveform. A quiet source clip gives you a flat, barely-moving feature curve no matter how good your extraction settings are; normalize first and the signal actually has something to work with.

Inputs and outputs

  • audio - the clip to normalize.
  • target_level - desired RMS level in decibels, -60.0 to 0.0, default -10.0.

Output is a single AUDIO.

RMS, not peak

This normalizes average loudness (RMS), not the loudest single sample (peak). That's a real distinction: a track with a few loud transients sitting over an otherwise quiet body can still clip on those transients even after RMS normalization, because RMS only cares about the overall energy level, not the individual spikes. If you're hearing distortion after normalizing, that's usually why - dial target_level down (more negative) to leave headroom for the peaks.

Where it sits in a chain

Order matters more than people expect with this one. If you separate stems first with AudioSeparatorSimple and then extract features per-stem, normalize after separation, per stem - a vocal isolated from a mix is almost always quieter than the mix itself, and normalizing the mix beforehand doesn't fix that. Similarly, if you're about to pitch-shift or time-stretch a clip, normalize first: both of those operations can shift perceived loudness slightly on their own, and you want your target level locked in before, not after, other processing touches the signal.

Installing it

Via ComfyUI Manager: search RyanOnTheInside, install, restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt

No model downloads for this one - it's a straightforward signal-processing operation.

Where people get burned

-10 dB RMS, the default, is already fairly hot. If your chain distorts or clips downstream, that's the first thing to check - push target_level lower (say, -18 to -14) rather than assume something else broke. And remember this changes loudness only, not tone or dynamics - it won't fix a track that's already been over-compressed or one that's badly mixed to begin with, it just brings whatever dynamics already exist up or down to a consistent average level. Run it before any node that reads amplitude as a signal, and you'll get much more consistent, comparable results across different source tracks.

CategoryRyanOnTheInside/Audio/Utility

Inputs (2)

NameTypeDefaultDescription
audioAUDIOInput audio to be processed
target_levelFLOAT-10.0-60–0Desired RMS level in decibels (-60.0 to 0.0 dB)

Outputs (1)

NameTypeDescription
AUDIOAUDIOβ€”