Recording Quality Check Guide

Reference for the DeskTest.net Recording Quality Check: what each number means, the ACX-style targets it grades against, why dBFS is not the same as loudness, and how to fix a failing measurement.

Open the Recording Quality Check ->

What does this check?

The Recording Quality Check answers one question: is this microphone, in this room, at this gain, clean enough to record? It does that in three steps, entirely in the browser:

  1. Setup and noise floor. It asks for the mic with echo cancellation, automatic gain control (AGC), and noise suppression all turned off, then records about 3 seconds of silence to measure the room's noise floor - how loud the "quiet" is.
  2. Speech. It records about 5 seconds of you talking normally, at the distance you would really record from, and measures the peak level, the average speech level, and how many samples hit digital full scale (clipping).
  3. Grade. It compares each number to a published spec (the ACX audiobook targets, which double as sensible general-podcast targets) and gives each a Pass, Check, or Fail with a specific fix.

How is this different from the Mic Test?

The Mic Test answers "does the mic work?" - permission, signal, playback. It happily passes a mic that is technically working but recording in a noisy room at a bad level. This tool answers the next question: "are the numbers good enough to publish?" It leaves the browser's audio processing off so the measurements reflect your real signal, and it grades against a spec instead of just checking for any signal at all.

dBFS is not loudness (SPL)

Important honesty note. Every number here is in dBFS or dB RMS - decibels relative to digital full scale, the loudest a sample can be before it clips. It is not SPL (sound pressure level), the calibrated "how loud is the room in the real world" measurement you would get from a sound-level meter. dBFS tells you how your signal sits inside the digital range at your current gain; turn the gain knob and every dBFS number moves, even though the room did not get any louder. Use these numbers to set levels, not to certify a room's absolute quietness.

Full scale is 0 dBFS. Everything you record is below it, so the numbers are negative. A peak of -3 dBFS is 3 dB below the ceiling; a noise floor of -60 dB RMS is very quiet relative to that ceiling.

The targets it grades against

These are the ACX audiobook submission targets, widely reused for spoken-word podcasts:

MeasurementTargetWhat it protects
Peak level-6 to -3 dBFS, no clippingHeadroom - loud enough to use the range, with room before distortion.
Noise floorat or below -60 dB RMSQuiet background - hiss and hum stay below the voice.
Speech level (RMS)-23 to -18 dB RMSConsistent loudness - matches how loud published spoken word sits.

The tool marks a number Pass inside the band, Check when it is close but outside, and Fail when it is well outside or clipping. The overall verdict is the worst of the three.

Reading the three numbers

Peak level (headroom)

The single loudest sample in your speech capture, in dBFS. Too close to 0 (or clipping) means no headroom - a louder word will distort. Too far below -6 means you are recording quietly and will have to amplify later, which also lifts the noise. The sweet spot is a loudest peak between -6 and -3 dBFS. Any sample at or over full scale is counted as clipping and fails outright.

Noise floor

The RMS (average energy) of the silence capture, in dB RMS. This is the sound of your room and gear doing nothing: fans, AC, computer whine, mains hum, traffic. At or below -60 dB RMS is clean enough that listeners will not notice it under your voice. Above -50 dB RMS it becomes audible in pauses.

Speech level (loudness)

The RMS of the whole speech capture, in dB RMS - your average loudness, not the peaks. ACX asks for -23 to -18 dB RMS. Sitting in that band means your recording is already close to publish loudness before any mastering.

Why processing must be off (and Safari)

Browsers can apply echo cancellation, automatic gain control, and noise suppression to a mic stream. Those are great for a video call and ruinous for a measurement: AGC silently rides your gain so peak and RMS become meaningless, and noise suppression erases the very noise floor we are trying to measure. So the tool requests all three off.

Safari and iOS often ignore that request and force processing on anyway. When that happens the noise floor reading is not real - the browser has already cleaned the audio. The tool detects this by reading track.getSettings() after the mic opens; if it cannot confirm processing is off, it marks the floor Check, says the number is not trustworthy, and steers you to Chrome or Edge on desktop, which honour the request. It will never show a forced-clean floor as a genuine Pass.

Fixing each failing number

Clipping / peak too hot

Lower the input gain on your interface, mixer, or OS sound panel until the loudest words peak around -3 to -6 dBFS. Turn off any "mic boost" or "+20 dB" option. If there is no gain control, back off from the mic a couple of inches.

Peak too quiet

Move closer to the mic (a hand-span is typical for spoken word), raise the input gain, and confirm the intended mic is the selected input - not a distant built-in laptop mic.

Noise floor too high

Kill the sources: fans, AC, air purifiers, a nearby computer or projector. Close windows and doors. Record in a smaller, softer space (soft furnishings, curtains, even a closet) to cut reflections and hiss. A dynamic mic held close to the mouth rejects far-off room noise far better than a condenser.

Speech level off

If too quiet, speak up slightly or move closer and raise the gain so your average sits near -20 dB RMS. If too loud, ease the gain down or move back. Aim for -23 to -18 dB RMS.

Floor marked "not trustworthy"

Re-run in Chrome or Edge on desktop. Safari and many mobile browsers force noise suppression on, which hides your real floor.

Behind the scenes

getUserMedia({audio:{echoCancellation:false, autoGainControl:false, noiseSuppression:false, channelCount:1}}) runs inside the Run-button click so the browser counts it as a user gesture. Immediately after, track.getSettings() reports which of those processors the browser actually applied; anything it will not confirm as off downgrades the floor result.

Each capture routes the MediaStream through a MediaStreamSource into a ScriptProcessorNode, whose onaudioprocess callback sees every sample in contiguous blocks. For each block the tool tracks the maximum absolute sample (peak), sums the squares (for RMS), and counts samples at or over 0.99 (clipping). Because it reads every sample rather than sampling an FFT window, the peak and clip counts are exact rather than estimated. The processor's output buffer is left silent, so nothing is routed back to your speakers - no echo.

Peak is 20 * log10(maxAbsSample); RMS is 20 * log10(sqrt(meanOfSquares)). Nothing is written to a file, saved, or uploaded; this page makes no network requests. On completion, reset, or leaving the page the tool stops every track and closes the AudioContext.