nonspeech fires on Speech < 0.30 — absence of speech, not presence of noise. On a master that still holds sub-second pauses, every pause qualifies.
Measured on two different files, and the difference between them is the point:
| file |
state |
PANNs alone |
PANNs + interior energy floor |
PANNs + micro-pause witness |
cueva-v4 (edited, pauses remain) |
27 spans |
1 real cough |
floor kills 26 of 27 |
— |
cueva-fix66 (silence pass applied) |
30 spans |
15 hits / 16 FP |
kills only 6 of 30 |
13 hits / 4 FP |
The trap
The interior-energy floor is a genuine discriminator on a file that still has silence: a cough over a pause is loud, a pause is not. On a master where the silence pass already ran, the surviving flagged spans are speech transitions, not coughs over silence — measured peak, minimum, range and fraction-below--30dB all overlap completely between true and false positives.
A threshold calibrated on one file gave a confident wrong answer on the other. Same failure class as the 24 dB source-vs-render silence gap already documented at auto-cut.ts:47.
What actually discriminates
A micro-pause witness: an energy dip of >=300ms (30ms windows, threshold median-18dB) near the flagged span. A speaker who coughs mid-sentence leaves one; a speech transition does not.
PANNs alone: 15 hits / 16 FP. PANNs requiring a seam: 13 hits / 4 FP.
Suggestion
nonspeechCuts currently requires overlap with a measured silence, which is why coughs riding on speech are declined entirely (they have no silence under them). A seam witness is the weaker, correct version of that requirement: it asks whether the speaker stalled, not whether the level dropped below a speech threshold.
Related: #66 (the pass that consumes these).
nonspeechfires onSpeech < 0.30— absence of speech, not presence of noise. On a master that still holds sub-second pauses, every pause qualifies.Measured on two different files, and the difference between them is the point:
cueva-v4(edited, pauses remain)cueva-fix66(silence pass applied)The trap
The interior-energy floor is a genuine discriminator on a file that still has silence: a cough over a pause is loud, a pause is not. On a master where the silence pass already ran, the surviving flagged spans are speech transitions, not coughs over silence — measured peak, minimum, range and fraction-below--30dB all overlap completely between true and false positives.
A threshold calibrated on one file gave a confident wrong answer on the other. Same failure class as the 24 dB source-vs-render silence gap already documented at
auto-cut.ts:47.What actually discriminates
A micro-pause witness: an energy dip of >=300ms (30ms windows, threshold median-18dB) near the flagged span. A speaker who coughs mid-sentence leaves one; a speech transition does not.
PANNs alone: 15 hits / 16 FP. PANNs requiring a seam: 13 hits / 4 FP.
Suggestion
nonspeechCutscurrently requires overlap with a measured silence, which is why coughs riding on speech are declined entirely (they have no silence under them). A seam witness is the weaker, correct version of that requirement: it asks whether the speaker stalled, not whether the level dropped below a speech threshold.Related: #66 (the pass that consumes these).