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(fromgetUserMedia({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: falseso 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.