Why did per-sample repair of a 2.8 ms click do nothing?
Trained a small streaming denoiser for browser voice chat. 48 kHz, 20 ms window,
10 ms hop, spectral mask, runs in an AudioWorklet through ONNX.
Numbers from real recordings, not synthetic mixes:
- breath 13.3 dB down
- key click in a pause 20-27 dB down
- key click on top of speech 3 dB down
- speech 0.01 dB, basically untouched
The speech number is the one I was protecting. DeepFilterNet 3 on the same files
cleans pauses harder, 14.6 dB against my 8.9, but takes 1.37 dB of speech with it
and smears the click.
The 3 dB is where I'm stuck. I assumed resolution: 20 ms frame, 2.8 ms click, vowel
sitting in the same frame. So I threw the obvious things at it. Lookahead. Detector
hints as an extra input. Deep filtering. Shorter windows. A loss term just for
transients. Per-sample repair. More data. Longer training. One of the eight gave
0.7 dB, the rest gave nothing, including the ones I was most sure about.
That last part is what makes me think my diagnosis was wrong. For context, I came at
this from web audio, not DSP. Decent chance the answer is standard and I just don't
know the name for it. If the click really is localized in time, and a detector can
tell me where it is, why did repairing it sample by sample change nothing at all?
Posted Aug 13, 2026, 4:54 PM UTC