How DeviceCheckOnline measures microphone loudness (LUFS)
LUFS (Loudness Units Full-Scale) is the standard broadcast and streaming-platform loudness measure. Spotify normalizes to −14 LUFS, Twitch targets −16, EBU R128 broadcast TV mandates −23. The number you see on a meter must be K-weighted and gated to match those specs.
Open the tool →1. K-weighting
Human ears do not weight all frequencies equally. ITU-R BS.1770 defines a 'K-weighting' filter that approximates equal-loudness contours: a 38 Hz high-pass (RLB filter) plus a +4 dB high-shelf centred at 1681 Hz. We implement both as BiquadFilterNodes chained from our MediaStreamSource. Without K-weighting, sub-bass and treble would be over- or under-counted.
2. Three time windows
Momentary LUFS averages mean-square loudness over 400 ms. Short-term over 3 s. Integrated over the whole session. The three exist because broadcast operators need different granularity: momentary for instant peak alerts, short-term for music-listening evaluation, integrated for delivery compliance.
3. Gating for the integrated value
Without gating, long silences would drag the integrated LUFS arbitrarily low. R128 specifies two stages: absolute gate at −70 LUFS (drops dead silence), then relative gate at integrated-minus-10 dB (drops quiet sections). We implement both. The result matches what offline tools like ffmpeg-loudnorm produce within 0.1 LU.
4. Platform targets
Spotify and YouTube normalize uploaded audio to −14 LUFS. Apple Music and Twitch target −16. Podcast guidance is −16 to −19. EBU R128 broadcast is −23. If your integrated LUFS sits within ±1 LU of the target, you're compliant — the platform will not turn you up or down. Outside that band, expect normalization to flatten dynamics.
FAQ
Why does the integrated LUFS climb slowly at first?
Until enough audio has passed the gates, the running average is unstable. Give the meter 30–60 seconds of speech for a reliable integrated reading.
Does Web Audio's MediaStreamSource bypass browser noise suppression?
Only if we request the stream with `noiseSuppression: false`, `echoCancellation: false`, `autoGainControl: false` — which we do. Without those, the meter would read the *processed* signal, not your raw microphone.