AudioX Advanced Volume Control
LUFS normalization, fades, and a limiter — with a catch
- audio
- audio
- peak_level_db
- lufs_level
- info
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
AUDIOto 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_lufsand applies it, ignoringvolume_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.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| volume_db | FLOAT | 0.00-80–30 | Volume adjustment in decibels (dB) |
| step_sizeopt | FLOAT | 0.1000.001–5 | Step size for volume slider precision |
| target_lufsopt | FLOAT | -23.0-40–-10 | Target LUFS for automatic loudness normalization (-23 LUFS is broadcast standard) |
| auto_normalize_lufsopt | BOOLEAN | false | Automatically normalize to target LUFS instead of using volume_db |
| limiter_threshold_dbopt | FLOAT | -1.0-10–0 | Limiter threshold in dB to prevent clipping |
| limiter_enabledopt | BOOLEAN | true | Enable soft limiting to prevent clipping |
| fade_in_msopt | FLOAT | 00–5000 | Fade in duration in milliseconds |
| fade_out_msopt | FLOAT | 00–5000 | Fade out duration in milliseconds |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| peak_level_db | FLOAT | — |
| lufs_level | FLOAT | — |
| info | STRING | — |