Systems and subsystems
Splice and discontinuity detection
Looks for the seams an edit leaves: a single-sample click, or a jump in the DC offset between short windows. On this data it finds vocoder artifacts more often than edits, and the sponsor said no test clip is partially synthetic, so it is evidence.
In plain words
Inserting or replacing words in a recording leaves a spliceA discontinuity where audio was cut or inserted: a single-sample click or a jump in the DC offset between windows. Evidence of editing, though on this data it mostly finds vocoder artifacts., a discontinuity where the cut is, unless the editor is careful. Two cheap signals catch careless cuts: a sample step far larger than its neighbours, and a shift in the waveform's mean between one window and the next. On the training data those signals fire on several generators' outputs and on some real LibriSpeech clips alike, so they describe artifacts, not the class.
What goes in and comes out
In: the clip normalized to peak 1. Out: the counts and sizes of clicks and DC jumps, the time of the first seam, an informational background-floor range, and a sentence such as editing seam at 1.59 s: 1 click(s) (largest step 17x the surrounding waveform); consistent with a cut or inserted segment (background-floor range 26 dB, informational), or no clicks or DC-offset jumps: no sign of a cut or inserted segment.
Where it lives
Parameters and where each is set
- A click is a sample step more than 15.0source: src/hearsay/detectors/splice.py line 30 (GitHub; assumes main is public) times the RMS of the steps in the surrounding 20 ms (the step itself excluded) and larger than 0.15source: src/hearsay/detectors/splice.py line 30 (GitHub; assumes main is public) of full scale; hits within 5 ms are merged (splice.py, line 30 and lines 52–56).
- A DC jump is a change in the mean between consecutive windows a tenth of a second long, larger than both 0.02source: src/hearsay/detectors/splice.py line 31 (GitHub; assumes main is public) and 6.0source: src/hearsay/detectors/splice.py line 31 (GitHub; assumes main is public) times the median window-to-window change (splice.py, lines 57–61).
- Scores: a seam 0.6source: src/hearsay/detectors/splice.py line 33 (GitHub; assumes main is public), none 0.5source: src/hearsay/detectors/splice.py line 33 (GitHub; assumes main is public); never fused.
Status
Built; evidence only.
Numbers
On training data the seams are single-sample clicks in 27%source: README.md, section what-did-not-work of WaveGrad2 and DC jumps in 9–13%source: README.md, section what-did-not-work of several generators and 9%source: README.md, section what-did-not-work of LibriSpeech. It flags 58source: README.md, section what-did-not-work test files; in the ablation 504source: README.md, section orchestration-what-routing-changes holdout rows, without moving a score.
Known limits
A plosive can look like a click; the local-RMS rule and the absolute floor are what keep it from firing on speech, and a test pins that a burst is not a click. The rubric's phase breaks and background seams beyond DC are not measured.
Tests that pin it
tests/test_splice_detector.py: a continuous signal is neutral, a click is a seam at the right time, a DC jump is a seam, a plosive burst is not a click, short and silent clips, the contract, the analysis keys, registration.
Sources
The CPU detectors report, "Splice / discontinuity detector"; worked example 8.