Found while implementing #63, and it means the deadAir warning shipped in 0.22.0 is underreporting on every render.
The defect
probeNoiseFloor anchors to the quietest window in the media. On a raw source that is the room. On an assembled render it is an artefact of the assembly: the quietest 2s of a cut is whatever the tightest splice left behind, not the noise floor the speech sits on.
Measured on run9.wav (374.9s, a real shipped render):
| threshold |
pauses over 0.8s |
total |
probeNoiseFloor derived, -68.7dB |
4 |
6.8s |
| median-anchored, -40.83dB |
19 |
33.9s |
A human listening to that render flagged three long silences by ear. The probeNoiseFloor threshold misses all three. The median-anchored one finds them, and its 19 spans / 33.9s independently match a manual -40dB sweep (19 / 34.4s).
Blast radius
findSurvivingDeadAir is what commit prints as its deadAir block since 0.22.0, so every round since then has been told there were 4 pauses when there were 19. That is the check whose entire purpose is to catch dead air surviving into the output, and it has been reporting a fifth of it.
#63's auto-cut pass already uses the median-anchored threshold and says so in its own report; this issue is about the warning path, which still uses the minimum-anchored one.
Direction
Anchor the floor to a robust statistic of the quiet portion rather than its minimum. Report both numbers where they disagree, since a large gap between them is itself evidence that the media is an assembly rather than a raw take.
Related: #43 (where the calibration was introduced), #63 (which routed around it).
Found while implementing #63, and it means the
deadAirwarning shipped in 0.22.0 is underreporting on every render.The defect
probeNoiseFlooranchors to the quietest window in the media. On a raw source that is the room. On an assembled render it is an artefact of the assembly: the quietest 2s of a cut is whatever the tightest splice left behind, not the noise floor the speech sits on.Measured on
run9.wav(374.9s, a real shipped render):probeNoiseFloorderived, -68.7dBA human listening to that render flagged three long silences by ear. The
probeNoiseFloorthreshold misses all three. The median-anchored one finds them, and its 19 spans / 33.9s independently match a manual -40dB sweep (19 / 34.4s).Blast radius
findSurvivingDeadAiris whatcommitprints as itsdeadAirblock since 0.22.0, so every round since then has been told there were 4 pauses when there were 19. That is the check whose entire purpose is to catch dead air surviving into the output, and it has been reporting a fifth of it.#63's auto-cut pass already uses the median-anchored threshold and says so in its own report; this issue is about the warning path, which still uses the minimum-anchored one.
Direction
Anchor the floor to a robust statistic of the quiet portion rather than its minimum. Report both numbers where they disagree, since a large gap between them is itself evidence that the media is an assembly rather than a raw take.
Related: #43 (where the calibration was introduced), #63 (which routed around it).