Nodes/ComfyUI-AudioX/AudioX Advanced Volume Control
ComfyUI Node

AudioX Advanced Volume Control

LUFS normalization, fades, and a limiter — with a catch

By lum3on·Created about a year ago·Updated about a year ago· 53
AudioX Advanced Volume Control
  • audio
  • audio
  • peak_level_db
  • lufs_level
  • info
volume_db0.00
step_size0.100
target_lufs-23.0
auto_normalize_lufsfalse
limiter_threshold_db-1.0
limiter_enabledtrue
fade_in_ms0
fade_out_ms0

The README sells this as "professional volume control with LUFS normalization, soft limiting, and fade controls," and it delivers most of that - auto loudness-matching to a target, a proper tanh limiter, fade in/out, and a volume range that goes to -80 dB. It's the node you'd use to make a batch of generated clips sit at roughly the same loudness, which matters when you're cutting them together.

But here's the catch you should know before you trust the LUFS number: the "LUFS" reading here is a simplified RMS approximation, not a true K-weighted loudness measurement. The code computes 20 * log10(rms) - 0.691 and calls it LUFS. Real loudness metering (pyloudnorm/BS.1770) applies frequency weighting and gating - and despite pyloudnorm sitting in the pack's requirements.txt, nothing ever imports it. The result: the auto-normalize gets you in the right ballpark for matching clips to each other, but "normalize to -23 LUFS" is not broadcast-standard loudness. Fine for demo mixes, don't master with it.

Inputs that matter

  • audio - the AUDIO to process.
  • volume_db - -80 to +30, default 0. Used when auto-normalize is off.
  • target_lufs (optional) - -40 to -10, default -23 (the broadcast standard number, even if the measurement is approximate).
  • auto_normalize_lufs (optional, default off) - when on, computes the gain needed to hit target_lufs and applies it, ignoring volume_db. This is the headline feature.
  • limiter_threshold_db / limiter_enabled (optional) - the soft limiter, threshold default -1 dB, on by default. Only samples above the threshold get compressed via a tanh curve, so normal-level audio keeps its dynamics.
  • fade_in_ms / fade_out_ms (optional) - 0–5000 ms fades, handy for smooth loop starts or tail-free endings.
  • step_size (optional) - 0.001–5, slider precision that also rounds the applied gain.

Outputs: audio, plus peak_level_db and lufs_level as FLOATs (you can wire the loudness reading into downstream logic), and an info string.

Install & troubleshooting

Same pack setup, no model weights needed:

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

Wrinkles that actually bite:

  • Loudness numbers are relative, not absolute. Two clips normalized with the same target will sit near each other - which is the actual use case. Don't compare the output number to a real loudness meter and expect agreement.
  • auto_normalize + limiter both on. The normalizer may push peaks into the limiter, which then shaves them - that's correct behavior (it's how you end up loud and clean), but if levels look odd, that's why.
  • Fades before limiting. The code fades first, then limits, which is the right order - a fade doesn't get re-peaked by the limiter.

For its actual job - "make these generated clips match in loudness and end cleanly" - it's genuinely useful and the best utility in the pack. Just keep the asterisk on the LUFS claim in your head.

CategoryAudioX/Utils

Inputs (9)

NameTypeDefaultDescription
audioAUDIO
volume_dbFLOAT0.00-80–30Volume adjustment in decibels (dB)
step_sizeoptFLOAT0.1000.001–5Step size for volume slider precision
target_lufsoptFLOAT-23.0-40–-10Target LUFS for automatic loudness normalization (-23 LUFS is broadcast standard)
auto_normalize_lufsoptBOOLEANfalseAutomatically normalize to target LUFS instead of using volume_db
limiter_threshold_dboptFLOAT-1.0-10–0Limiter threshold in dB to prevent clipping
limiter_enabledoptBOOLEANtrueEnable soft limiting to prevent clipping
fade_in_msoptFLOAT00–5000Fade in duration in milliseconds
fade_out_msoptFLOAT00–5000Fade out duration in milliseconds

Outputs (4)

NameTypeDescription
audioAUDIO
peak_level_dbFLOAT
lufs_levelFLOAT
infoSTRING