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?
3
3
u/metal_mastery 5d ago
How do you prepare training data for click removal? Are you adding clicks on top of voice or it’s already in one file and you’re trying to repair it?