CROSS EXAM / HACKGT 13

HEARSAY

Is this voice real?

CHALLENGENSA HEARSAY
CREATED BYNathan, Hrushi & Tharakesh
DELIVERABLEAudio authentication

PROJECT
OVERVIEW

PROBLEM

A convincing synthetic voice can sound real. Calling real speech synthetic is the expensive error in this challenge.

SOLUTION

One decode path, ten forensic detectors, a fixed router, and an explained probability for every file.

MEASURED RESULTS

0.0065 holdout · 0.228 In-the-Wild normalized minDCF.

PROJECT OVERVIEW

Give HEARSAY an audio file. It returns a score, the evidence behind it, and a record of how the decision was made.

THE OUTPUT

A submission TSV and one explanation JSON per file.

THE PRINCIPLE

Every detector runs; the router decides which findings may affect the score.

SCOPE

CORE SYSTEM

  • Decode audio once to a shared format
  • Run ten detectors behind one contract
  • Fuse M1b, handcrafted, and M5 by rank
  • Let Spectra only lower a likely false alarm
  • Write a score and evidence report

OUT OF SCOPE

  • No hardware signal or device attestation
  • No hosted model on the scoring path
  • No retraining during inference

THE SHIPPED PIPELINE

Diagram of the HEARSAY audio-to-score pipelineRead the full method ↗

IMPACT
VS EFFORT

Each technique had to earn its place in the shipped rule.

LowImpactHigh
Spectra as a one-way vote

Lowered the holdout cost from 0.0200 to 0.0065.

M5 as a minority vote

Cut the previous fusion holdout from 0.014 to 0.0065.

Speech gate

Protects undecidable audio; no NSA test file was gated.

Extra real-speech corpus

Planned, then set aside when it could not fit the event time box.

LowEffortHigh

TECHNICAL APPROACH

MODEL STACK

  • XLS-R layer-7 probe (M1b)
  • Handcrafted spectral and prosody model
  • Fine-tuned XLS-R head (M5)
  • Spectra-AASIST as a suppressor

ARCHITECTURE PRINCIPLES

  1. Decode once for consistent inputs
  2. Run every detector and route by role
  3. Fuse ranks, then calibrate
  4. Keep inference local and explainable

MILESTONES

PHASE 01

FOUNDATIONS & DETECTORS

  • Common audio loader and detector contract
  • Fold file and the XLS-R probe
  • Engineered forensic techniques
Comparable detector scores and evidence

PHASE 02

ROUTING & FUSION

  • Pre-declared selection rule
  • Rank blend and Spectra suppression
  • Holdout and In-the-Wild validation
An auditable shipped rule

PHASE 03

SUBMISSION & REVIEW

  • Run the full test set
  • Write the TSV and explanation JSON
  • Check parity and document limits
Reproducible output and documentation

DETECTORS

WAYS OF WORKING

DECISION RULE

We wrote the fusion selection rule before viewing results and applied it once. Rejected ideas stay in the record.

AUDIT TRAIL

Each file keeps detector reasons and a routing log. Sources, tests, and known limits are linked throughout the docs.

THE LESSONS / 01–04

WHAT WE LEARNED

01 / 02
  1. 01

    Our test data lied to us, five times.

    Real and fake clips differed in volume, silence at the start, length, file format, and a filter cutoff at 7.2 kHz. A model could “win” on any of those without hearing the voice. We found each one and removed it. Next time we check for this on day one.

  2. 02

    Good scores at home don't mean good scores in the wild.

    Our best models scored around 0.1 on our own held-out data and around 0.4 on real-world recordings. The fusion rule that looked best at home was the worst in the wild. We only avoided shipping it because we wrote down the selection rule before seeing the numbers.

  3. 03

    Fix the data before adding more of it.

    Adding 40 real speakers made things worse until we matched our training audio to the test set's filter. Then the same speakers made things better.

  4. 04

    One false alarm costs 9 misses. Design for that.

    This one number shaped everything: a detector that can only lower a score, a model tuned for fewer false alarms, and unreadable files pinned to the bottom of the list.

Explore the evidence ↗

THE LESSONS / 05–08

WHAT WE LEARNED

02 / 02
  1. 05

    Half our detectors don't vote, and that's fine.

    Five of ten detectors turned out to detect the recording setup, not the voice. Mains hum means “recorded at home”. Compression means “went through a pipeline”. Those detectors now explain the answer instead of setting it.

  2. 06

    A weak model can still help.

    Our fine-tuned model lost to the simple one on every test. But it makes different mistakes, so giving it a small vote cut errors in half.

  3. 07

    If you can't check a model, limit what it can do.

    Spectra-AASIST scored perfectly on our data, but nobody knows what it was trained on. So it can only say “this is real”, never “this is fake”.

  4. 08

    Test for weaknesses before you freeze.

    We found that background noise breaks the shipped model after it was too late to fix.

Explore the evidence ↗

NEXT STEPS

NSA READOUT

0.0733 minDCF

NSA returned 3.534% EER for the exact file we ship. The result fell in our pre-declared 0.00–0.20 band, so we kept the rule unchanged.

Read the validation record ↗

Continue into the complete HEARSAY documentation.

Created by Nathan, Hrushi & Tharakesh.

Open the full record ↗Browse the library ↗

THANK YOU.

Full documentation and sources

The numbers

All figures are normalized minDCFMinimum detection cost function. The scorer sweeps every possible threshold over our scores and reports the lowest cost it finds, with a false alarm weighted far more than a miss and the whole thing scaled so that 1.0 equals the best constant answer and 0.0 is perfect. Because the threshold is chosen by the scorer, only the order of our scores matters. (lower is better). The rule was chosen by a pre-declaredWritten down before any result was looked at: the candidates, the readouts, and the rule that picks a winner. Once the rule has been applied there is no second try. selection rule, applied once; the out-of-foldA score a model gives to a training row it never saw: the training data is split into folds, and each row is scored by the model fitted on the other folds. Every selection decision in this project uses out-of-fold scores. figure is the training-side readout, the holdoutA slice of the training data that no model was ever fitted, tuned or selected on: two generators and a set of real-speech groups. Each model reads it once. With only two held-out generators it is noisy, so small differences on it are not evidence. and In-the-WildA public set of web-sourced real and fake speech, used only as a stress test for false alarms on unfamiliar real voices. Nothing was ever trained on it. figures were each read once after the choice.

Outer holdout0.0065source: README.md, section results-at-a-glancetwo unseen generators and 26 unseen real-speech groups
In-the-Wild, brief cost0.228source: README.md, section results-at-a-glanceweb-sourced speech we never trained on; 0.239source: README.md, section numbers under the sponsor code'sThe evaluation script the sponsor shipped. It reads a higher score as real, the opposite of the instructions, and puts the heavier weight on a missed fake. We report every result under both readings and never flip our scores. cost
Inner out-of-fold0.135source: README.md, section results-at-a-glancepooled over the five inner folds
NSA test set, draft review0.0733source: README.md, section validationreturned minDCF; EER 3.534%source: README.md, section validation on the submitted file

The cost function we are judged on

minDCF = 9.33 × PFA + 1 × Pmiss

One real file called synthetic costs as much as 9.33 missed fakes. That single ratio shaped every decision in this system.

PFA
false-alarm rate: the share of real files scored above the threshold
Pmiss
miss rate: the share of synthetic files scored below it
min
the best threshold is chosen by the scorer, so only the ranking of scores matters

Built from the sponsor's weights CFA = 4, Cmiss = 1 and a prior of 0.3 synthetic (about 0.7 of files are real): cost = 4 · PFA · 0.7 + 1 · Pmiss · 0.3 = 2.8 · PFA + 0.3 · Pmiss, divided by the best constant decision, 0.3, so that 1.0 means "no better than always saying real" and 0.0 is perfect. source: src/hearsay/metrics.py lines 29-31 (GitHub; assumes main is public)

How it decides, in one picture

One decode path, ten detectors behind one contract, a router that tells each result what it may do, and a fusion rule that reads only ranks: 0.6 × rank(M1b) + 0.2 × rank(handcrafted) + 0.2 × rank(M5), then Spectra-AASISTAn off-the-shelf anti-spoofing model run without any training. It is the strongest detector on every set we hold, but its training data is undisclosed, so it is allowed only to lower scores, never to raise them. allowed only to pull a file toward real, then a Platt mapA one-dimensional logistic fit that turns a raw decision value into a probability. It is monotone, so it changes the numbers a reader sees without changing the ranking the metric scores., with undecidable files in the pinned blockFiles the system cannot judge (no speech, or a failed decode) are placed strictly below every judged file, at the real end of the ranking, in a deterministic order. Under the sponsor's cost, an uncertain file belongs there. at the real end. The full walk-through, with a real test file, is on How it decides.

The shipped pipeline: decode once, route, ten detectors, three fused by rank, Spectra as a one-way vote, Platt map, pinned block, TSV and explanation JSON.
The shipped pipeline: decode once, route, ten detectors, three fused by rank, Spectra as a one-way vote, Platt map, pinned block, TSV and explanation JSON. Open full size
Mermaid source
%% The shipped pipeline, one file at a time. Numbers cited below.
%% cites: README.md#how-it-decides, README.md#orchestration-what-routing-changes, README.md#the-eight-forensic-techniques
flowchart TB
  F["audio file · any container or codec"] --> L["probe the header, then decode once<br/>FFmpeg → 16 kHz mono float32"]
  L --> C["ClipContext<br/>read-only audio + header facts + a per-clip cache"]
  C --> R["router: fixed rules on measured facts<br/>every detector runs; each result is told what it may do"]
  R --> FD["fused by rank<br/>XLS-R probe M1b · 0.6<br/>handcrafted spectral + prosody · 0.2<br/>M5 fine-tuned head · 0.2"]
  R --> SD["suppression only<br/>Spectra-AASIST · can only halve a high score"]
  R --> ED["evidence and routing, never scored<br/>compression · ENF hum · splice<br/>speaker drift · container"]
  R --> G["speech gate<br/>is there speech to judge?"]
  FD --> FU["base = 0.6 · rank(M1b) + 0.2 · rank(handcrafted) + 0.2 · rank(M5)"]
  FU --> S["Spectra step: margin below −3 and base above 0.5 → halve"]
  SD --> S
  S --> PL["Platt map → probability<br/>judged files score in [0.001, 1]"]
  G -->|"no speech, or the decode failed"| PB["pinned block · below 0.001<br/>at the real end of the ranking"]
  PL --> T["CrossExam_predictions.tsv"]
  PB --> T
  ED --> X["explanation JSON per file<br/>every detector's sentence + the routing log"]
  PL --> X
  classDef fusedC fill:#00254b,stroke:#00254b,color:#ffffff
  classDef suppC fill:#fff3d1,stroke:#c37530,color:#101a2b
  classDef evC fill:#ffffff,stroke:#c37530,color:#101a2b,stroke-dasharray:4
  classDef gateC fill:#e9eff6,stroke:#005493,color:#101a2b
  class FD,FU fusedC
  class SD,S suppC
  class ED,X evC
  class G,PB gateC

Results at a glance

Inner OOFHoldoutIn-the-Wild, brief costIn-the-Wild, sponsor-code cost
Shipped rule (A3 w 0.2 + E: M1b, handcrafted and M5 by rank, Spectra suppression)0.135source: README.md, section results-at-a-glance0.0065source: README.md, section results-at-a-glance0.228source: README.md, section results-at-a-glance0.239source: README.md, section numbers
Previous rule (E on α 0.2source: README.md, section results-at-a-glance, no M5), the fallback0.140source: README.md, section results-at-a-glance0.014source: README.md, section results-at-a-glance0.260source: README.md, section results-at-a-glance0.267source: README.md, section numbers
M1bOur primary detector: a frozen XLS-R with a small logistic classifier on one hidden layer. M1b is the version whose training folds also include a set of extra real speakers. alone, the best single detector we trained0.301source: README.md, section results-at-a-glance0.072source: README.md, section results-at-a-glance0.343source: README.md, section results-at-a-glance0.296source: README.md, section numbers
Spectra-AASISTAn off-the-shelf anti-spoofing model run without any training. It is the strongest detector on every set we hold, but its training data is undisclosed, so it is allowed only to lower scores, never to raise them. off the shelf, a suppressorThe one-way role given to Spectra-AASIST: when it is confident a voice is real and the fused rank is high, the rank is halved. It can never raise a score, so if it is wrong the cost is a miss, never a false alarm. onlynot fused: its training data is undisclosed, so no row of ours is provably out-of-sample for it0.065source: README.md, section numbers, possibly in-sample for the same reason

The test set has 1,671source: README.md, section numbers files. The shipped rule scores 27.4%source: README.md, section numbers of them above 0.5source: README.md, section numbers against the roughly 30%source: README.md, section numbers synthetic the brief states (the orchestration ablation, a different readout, reports 27.5%source: README.md, section orchestration-what-routing-changes); the speech gateFive cheap cues that decide whether a file contains speech at all (not silent, some voiced frames, pitch that moves, loudness that moves, not spectrally flat). A file that fails goes to the pinned block instead of fusion. abstains on 0 of 1,671source: README.md, section the-eight-forensic-techniques. Turning the routerThe fixed rules that decide what each detector's result is allowed to do for a given file: fused into the score, allowed only to lower it, or recorded as evidence. Every decision is written to a per-file routing log. off moves the holdout from 0.0065source: README.md, section orchestration-what-routing-changes to 0.0200source: README.md, section orchestration-what-routing-changes and In-the-Wild from 0.229source: README.md, section orchestration-what-routing-changes to 0.274source: README.md, section orchestration-what-routing-changes.