Systems and subsystems

The fold file

One tracked CSV assigns every training clip to an inner fold or the outer holdout, grouping fakes by generator and real speech by speaker, so that no model is ever tested on a voice or a synthesis system it trained on.

In plain words

Splitting clips at random would let a model see every generator and every speaker in training and then be "tested" on more of the same. The fold file prevents that by moving whole groups. Two generators and about a fifth of the real-speech groups form a holdout that nothing is ever fitted or selected on and each model reads once; the rest forms five inner folds that each hold out whole generators. Extra training corpora are added to the inner folds only, so holdout numbers stay comparable across every model.

What goes in and comes out

In: the training manifest (path, label, generator, speaker, source). Out: splits/nsa_folds.csv with a group and a fold per row (0–4 or holdout); splits/nsa_folds_plus_asv19.csv with the ASVspoof 2019 rows added to the inner folds.

Where it lives

scripts/make_folds.py builds the base file; scripts/extend_folds.py adds extra rows; the M5 data module pins both files' hashes.

Parameters and where each is set

Status

Built and frozen on Friday night; hash-pinned by the M5 tests since Saturday.

Numbers

Known limits

Known leakage that grouping cannot fix is printed, not hidden: several DiffSSD generators clone the same voices, and LJ is one voice on both sides of every fold. grad_tts is invisible to the handcrafted features under this scheme because no other generator shows its phase cue.

Tests that pin it

tests/test_m5_manifest.py: the fold files' hashes, the extended file agrees with the shared one on all 20,000source: README.md, section validation core rows and never puts an extra row in the holdout, no holdout row in any training set. tests/test_cloud_scripts.py: the M5 code never writes the fold files.

Sources

Architecture §8; README, "Validation"; the M1b report.