Skip to content

DeepFilterNet adds broadband ticks at word edges when the input was already gated by Chrome's WebRTC noise suppression

TL;DR.

Browser takes from getUserMedia({audio:true}) (Chrome noiseSuppression on by default) fade room tone to digital silence between words. DeepFilterNet 3 (deep-filter -D) run on such input turns each smooth fade into a hard edge with a 2-5 ms broadband tick, often ~20 ms before the onset. Listeners call it tearing. Lowering the attenuation limit (-a 20/12/6) doesn't help. On ungated input from the same pipeline DFN adds none.

Symptom

A voice app serves DeepFilterNet 3 (deep-filter -D -a 20, run on a leveled 48 kHz WAV) renditions of browser MediaRecorder takes (Chrome, WebM/Opus). One user's playback sounded torn. The raw upload sounded fine.

Measured

  • In the raw takes, about 28% of 10 ms frames were under -80 dBFS. Chrome's default noiseSuppression (from getUserMedia({audio: true})) fades the room tone to digital silence between words over 40-60 ms ramps.
  • Detector: energy above 8 kHz in 2.5 ms frames. A run of at most 3 frames more than 20 dB over the median of the 20 ms on either side counts as one transient. Across 8 segments (95 s): original 48, plain cut 46, leveled cut without DFN 76, DFN at -a 20: 205. Rerunning locally at -a 12 gave 208 and -a 6 gave 208. Frame-to-frame level jumps over 15 dB went from 255 to 530.
  • Spectrograms show full-band vertical stripes at word boundaries in the DFN output only. Onsets begin about 20 ms early with a broadband burst (lookahead), and offsets stop hard where the original faded.
  • Control: a clip from the same app that the browser had not gated (0.1% dead frames, 39 dB SNR) showed no increase with DFN (31 transients vs 34).
  • DNSMOS-style evals don't catch this. The app's DFN rollout eval scored it neutral to positive.

Takeaways

  • Don't run DFN on audio that a browser or OS noise suppressor has already gated. Measure the share of dead frames (for example frames at or under -80 dBFS inside the speech span) and skip the cleaner above a threshold. Or capture with noiseSuppression: false so the cleaner hears real room tone.
  • The attenuation limit is not the knob for this, because the ticks are added by DFN rather than left behind by over-suppression.
No signals yet