Music - LUFS Normalizer
Measure It Properly
- audio
- AUDIO
- CURRENT_LUFS
Peak level lies to you. Two tracks can both hit exactly −1 dBFS and one sounds twice as loud, because loudness is an integrated measurement across time, not a peak. That's what LUFS (Loudness Units Full Scale, per ITU-R BS.1770) measures, and it's the standard the streaming platforms actually use. Music - LUFS Normalizer from ComfyUI Music Tools is the pack's proper implementation of that measurement and normalization - via the pyloudnorm library - and it's the node you want at the end of a mastering chain when "loud enough" needs to mean something.
The inputs and outputs
One input, one knob:
target_lufs(FLOAT, −60 to −5, default −14) - where you want the integrated loudness to land.
And two outputs, which is the part people overlook:
AUDIO- the normalized audio.CURRENT_LUFS(FLOAT) - the measured loudness of your input before normalization.
That second output is genuinely useful. Wire it into a text/display node and you get a free loudness meter for the whole pipeline. Before you know what to set target_lufs to, you should know what you're at - and this gives you both numbers in one pass.
Sensible targets
The README lists common starting points (treat them as starting points, not rules):
- Streaming music: around −14 LUFS
- Spoken word / podcast: often −16 LUFS stereo
- EBU R128 broadcast: −23 LUFS
- Louder modern masters: numerically lower targets (like −9 or −10), which is a loudness-war choice, not a quality one
For generated audio, −14 is the right default and the pack's own default. It's loud enough to not sound quiet next to commercial tracks, and it leaves headroom that a true-peak limiter can actually use.
The gotcha: it can't make headroom it doesn't have
Here's the real-world failure mode, and the README flags it directly: normalization may finish below its target when peak headroom is insufficient. LUFS normalization applies a single gain - it can't conjure loudness out of a waveform that's already peaking. If your input is already at −1 dBFS but measures −10 LUFS, raising it to −14 LUFS would clip, and the node won't do that to you. The result: you asked for −14, you got −12, and the node is right.
The fix is the one-two punch: compress/limit first to even out dynamics and free up headroom, then normalize. That's exactly why the pack's master chain and Music Fix both put loudness management after compression with a true-peak ceiling in front. If you're using the standalone normalizer on something squashed, don't be surprised when it undershoots.
Install
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/jeankassio/ComfyUI_MusicTools.git
cd ComfyUI_MusicTools
python -m pip install -r requirements.txt
pyloudnorm is in the core requirements, so this works out of the box. Restart and it's under music. Pure measurement math, no models, instant on CPU.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| target_lufs | FLOAT | -14-60–-5 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |
| CURRENT_LUFS | FLOAT | — |