r/DSP•
am3su

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?

https://github.com/Amesu-afk/tarnveil-denoise

Posted Aug 13, 2026, 4:54 PM UTC

29
Loading comments…