Systems and subsystems

Systems and subsystems

One page per system and subsystem, all with the same shape: what it is in plain words, what goes in and comes out, where it lives, every parameter with the line that sets it, status, numbers, known limits, the tests that pin it, and sources.

Ingest

  • Audio loader and probe One decode path for every file: FFmpeg turns any container or codec into 16 kHz mono float32, once, and the header is read separately. Nothing downstream ever sees the original format.
  • Detector contract and safe runner Every detector takes the same read-only clip and returns the same kind of result: a score that rises with synthetic likelihood, one sentence of evidence, named features and a status. A wrapper guarantees that a crashing detector becomes a neutral, flagged result and never costs a file its row.
  • Segment preparation and band match Training and test audio must look the same to a detector, or the detector learns the difference instead of the voice. This stage low-passes every clip at the test set's roll-off, trims silence, crops training rows to test-like lengths, caps the length and normalizes the level.

Orchestration

  • The runner and its routing rules One script takes a directory of audio and produces the TSV, one explanation JSON per file, timings and a resumable cache. Inside it, a short list of fixed rules over measured facts decides what each detector's result may do. That list is the orchestrator.
  • The routing log and explanation JSON For every file the runner writes one JSON record: every detector's score, status, sentence and features, the fusion inputs and arithmetic, the routing log, and the version of everything that produced it. It is the explainability deliverable and the frontend's data.
  • The local API A thin FastAPI wrapper around the pipeline for the demo frontend: upload a file, get the same explanation record the runner writes. It is not on the scoring path.
  • The speech gate and the default-answer policy Five cheap cues decide whether a file contains speech to judge. A file that fails skips fusion and is placed in a block strictly below every judged file, at the real end of the ranking, where an uncertain file belongs under the sponsor's cost.

Deep detectors

  • The XLS-R probe (M1, M1b) A frozen self-supervised speech model, one of its middle layers averaged over time, and a small logistic classifier on top. It is the primary detector, with the largest weight in the fusion, and the one every other rung was measured against.
  • Spectra-AASIST (M3) An off-the-shelf anti-spoofing model run with no training through the same input path as everything else. The strongest detector on every set we hold, and the one we trust least, because its training data is undisclosed. It may only lower a score.
  • The M5 head on XLS-R A trained head on the first twelve layers of XLS-R: learned layer weights, attentive statistics pooling and a linear output, trained on rented A100s with heavy class-blind augmentation. It failed its gate as a replacement for the probe and ships as a fifth of the fusion vote, because it errs on different files.

Engineered detectors

  • Handcrafted spectral and prosody features Two hundred and thirty-four engineered features of the spectrum and the prosody of a clip, fed to gradient-boosted trees that are evaluated in plain numpy at inference. Interpretable by construction: every sentence it writes names the three features that moved it and by how many standard deviations from real speech.
  • Compression forensics Nineteen features that read the traces a lossy codec leaves in the upper band, trained with both classes laundered so the model cannot learn that MP3 means a particular generator. It detects codec history well and the class barely, so it is evidence and routing, never score.
  • Container and metadata Reads the header facts of a file (format, codec, rate, bit depth, tags) and applies a few rules. On this test set it returns a constant score by design, because on our training data the container is the label; its facts route the compression detector instead.
  • ENF: mains hum Tracks the 50 or 60 Hz hum a mains-powered recording chain leaves behind, and whether it is stable across the clip. Rule-based and mild on purpose: on our training data hum means a home studio, which means one real corpus, so a learned version would learn the corpus.
  • 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.
  • Speaker drift Speaker embeddings on one-second windows, compared pairwise, to ask whether the voice stays the same within a clip. It works as a detector of edits and second voices, and it points the wrong way as a detector of fakes: cloned voices are the most self-consistent voices in the data.

Fusion

  • The fusion rule Three detectors are turned into ranks against their own training distributions, blended with fixed weights, checked once by Spectra-AASIST, which may only halve a high rank, and mapped through a Platt map into a probability. Everything it needs is in one constants file that the runner never refits.
  • The pre-declared sweeps and the orchestration ablation Two scripts that chose the fusion rule under rules written before they ran, and one that measures what the router changes by switching each rule off. Together they are the record of how the shipped rule was picked and what it buys.

Outputs

  • The submission writer and the experiment log One function writes the TSV and refuses anything that would make it invalid: a wrong header, a duplicate file, a non-finite or out-of-range score, or an existing path. Every TSV gets a row in a tracked log with its validation score. A submitted file is never overwritten.
  • The metric module The normalized detection cost used for every selection and every reported number, plus an exact re-implementation of the sponsor's shipped scoring code, so each result can be read both ways.

Validation

  • 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.
  • The stress sets Two public sets that nothing was selected on: In-the-Wild, web-sourced real and fake speech that no model ever trained on, for false alarms on unfamiliar voices; and MLAAD, synthetic speech from many generators, as training-only data for M5 and a miss-rate readout for the others.
  • Inventories and the shortcut ledger Before any model trained, scripts measured how the training and test data differ in ways that have nothing to do with the voice. Every difference found is a shortcut a model would learn instead of the task, and each one is closed somewhere in the pipeline. The ledger is the list.
  • The channel-robustness probes Three diagnostic scripts run on Saturday afternoon: how wild is the test set, is the 7.2 kHzsource: README.md, section what-worked wall a codec, and is the off-the-shelf Spectra model memorising. Diagnostic only: no TSV, no rule change.

Delivery

  • The Docker image An offline, CPU-only image whose entrypoint is the runner, with every model and weight inside, a hash manifest checked at start, and a refusal to run if the network is on. Not a graded deliverable since Saturday noon; kept as evidence that the pipeline runs from a clean build.
  • The frontend contract The demo frontend is a separate application built by another team member. What it may rely on is written down as a contract over the explanation record, so the UI and the pipeline can move independently. This page documents the contract; the frontend itself is outside this site.