Skip to content
Case No. VB-2026 · validity, not accuracy

VERITAS

The instrument that puts clinical-speech AI on trial.

A validity instrument for the training-free severity metrics that score dysarthria from frozen self-supervised embeddings. It does not report one more correlation — it cross-examines any such metric against six confound controls and returns a verdict.

Runs locally · FastAPI :8000 + Vite :5173
Subjectatd_wavlm_19 · training-free SSL metricFAIL
SIX CONTROLS/ONE VERDICT/ρ 0.756 → 0.181/76% WAS SILENCE/AUC 0.996–0.999/PARTIAL ρ = −0.001/n ≈ 2 EMA/SEED 42/FROZEN WAVLM-L9/SPEAKER-DISJOINT/VERITAS-BENCH / 1.0/PASS · WARN · FAIL/SIX CONTROLS/ONE VERDICT/ρ 0.756 → 0.181/76% WAS SILENCE/AUC 0.996–0.999/PARTIAL ρ = −0.001/n ≈ 2 EMA/SEED 42/FROZEN WAVLM-L9/SPEAKER-DISJOINT/VERITAS-BENCH / 1.0/PASS · WARN · FAIL/
The verdict

Six controls. One verdict.

Every training-free metric arrives with one headline correlation. VERITAS runs six independent controls and aggregates them the honest way: one FAIL fails the card — no averaging a confound away.

01PASS
Predictiveρ = 0.772
02PASS
EnergyΔE = 2.1%
03FAIL
IdentityAUC = 0.996
04FAIL
Silence24% retained
05FAIL
Transferρ = 0.432 n.s.
06PASS
LeakageAUC = 0.051
Aggregate verdict — atd_wavlm_193 FAIL · 3 PASSFAIL
The VERITAS instrument: a benchtop AI-truth analyzer with a live PASS / WARN / FAIL readout, a pass-warn-fail gauge, and a printed verdict slip reading FAIL — DO NOT DISCARD.
The instrument
The problem

One number, right for the wrong reason.

Training-free severity metrics are multiplying, and almost every one is “validated” by a single correlation on one dataset. That is not validation; it is one number that can be right for the wrong reason.

Audited properly, the failures are systemic. A popular trajectory-distance metric posts a strong ρ = 0.756 — yet 76% of that signal lives in silence: remove the pauses and it collapses to ρ = 0.181 (n.s.), while silence frames alone reproduce it (ρ = 0.775). Every metric’s frozen representation is almost perfectly speaker-identifiable (AUC 0.996–0.999, chance is 0.5) — a leakage risk no published metric reports checking. And the ground truth needed to check any of it barely exists: usable dysarthric EMA sessions in all of public data number n ≈ 2.

The battery

What it actually checks.

Each control is an independent question with a documented threshold. Any metric plugs in through one method (predictive_scores → {speaker: float}), so its validity becomes a re-runnable regression test.

01

Predictive validity

Does the score actually track clinical severity? The one number every paper reports — and, too often, the only one it checks.

02

Speaker-identity leakage

Under a leave-one-control-out reference, is the score just re-identifying the speaker? A leakage risk no published metric reports checking.

03

Silence & pausing

Strip the pauses. If the signal collapses, it was measuring how much the patient stopped talking, not how they articulated.

04

Speech energy

Control for loudness. A metric that only tracks how loud someone spoke is not measuring dysarthria.

05

Cross-corpus transfer

Does the metric survive a change of dataset, or was it quietly fit to one corpus’ quirks?

06

Representation identifiability

At the representation level, how speaker-identifiable is the frozen embedding? AUC 0.996–0.999, where 0.5 is chance.

The black-box metric under interrogation — a sealed analyzer wired to amber patch cables beside a torn VERDICT SLIP stamped FAIL.

The metric is a black box. VERITAS wires it to the bench, runs the controls, and signs the slip. Verdict: FAIL — do not discard.

The evidence
0.000headline ρ, before the audit
0.000ρ once the silence is removed — not significant
0%% of the signal that lived in the pauses
0.000speaker-identity AUC — the metric is the speaker
0.000partial ρ vs real articulatory error, 22,854 frames
n ≈ 0usable dysarthric EMA sessions in all of public data
The engines

Six components. Five deterministic, one that reasons.

EngineInputModelOutputSpeed
Feature Extractor16 kHz audioFrozen WavLM-Large, layer 9(T, 1024) trajectory, 50 fpsReal-time; offline/online parity verified
ATD ScorerTrajectory + control referencePCA-64 + length-normalised fastDTWPer-speaker severity scoreStreaming-capable, per-frame
Validity AuditorAny metric + corpusVERITAS-Bench 6-control batteryPASS / WARN / FAIL report cardFull 4-metric card in one run
Identity-Leakage ProberRepresentation + speaker IDsStratified-K-fold logistic regressionSpeaker-identity AUC (0.5–1.0)Seconds
Articulatory Inverter · MirrorAudioSPARC encode → decode12-channel EMA + resynth / MP4Near real-time
Clinical Reporterz-scored phoneme / manner statsGroq / Gemini LLMPlain-language clinician reportLLM latency, a few seconds
What it ships
01

Six-control validity battery — predictive validity, identity leakage, silence, energy, cross-corpus transfer, and representation identifiability, each with a published PASS / WARN / FAIL threshold.

02

Metric-agnostic plug-in API — implement one method and any severity metric (reference, probe, or intrinsic) receives a machine-readable report card.

03

A state-of-the-art audit, done fairly — an independent reimplementation of the strongest published metric family (phonological-subspace d′) is certified where sound, and caught on the one confound its authors never checked.

04

Live audit console — a real FastAPI backend runs the production threshold code on your own numbers; four one-click presets load the real committed metric profiles.

05

Grounded in real articulography — validated against AG500 electromagnetic tongue-sensor data, exposing that dysarthric EMA ground truth is effectively n ≈ 2.

06

Fully reproducible research stack — ~50 seeded, numbered pipeline scripts; ~57 tests; two papers; every headline number footnotes a committed JSON.

The stack

Client

React 18TypeScriptVitereact-three-fiber (Three.js)Framer Motion

Server

Python 3.11FastAPIUvicornPydanticHF Spaces / Gradio

AI

WavLM-Large (frozen SSL)SPARC (articulatory coding)Montreal Forced Alignerscikit-learn (Ridge / logistic)fastDTWGroq + Gemini LLMs

Data

NumPypandasSciPystatsmodelsTORGO / IPVS / EasyCallAG500 EMAGit LFSDockerconda
System architecture
01Ingest audio
02Extract · WavLM-L9
03Align · MFA
04Score · ATD / probe / d′
05Audit · 6 controls
06Verdict · PASS/WARN/FAIL
07Serve · API → console
Data
  • TORGO (n=15 + AG500 EMA)
  • IPVS (n=61)
  • EasyCall (n=55)
  • Speaker-disjoint splits
Feature
  • Frozen WavLM-Large, 1024-d
  • SPARC articulatory codes
  • MFA phoneme / word alignments
  • Cached embeddings
Metric
  • ATD · PCA-64 + DTW reference
  • Pooled WavLM Ridge probe
  • Phonological-subspace d′ (SOTA)
Validity
  • thresholds.py policy
  • battery.py · six controls
  • stats.py · Spearman / partial / LOCO
  • report-card · veritas-bench/1.0
Serving
  • FastAPI · /audit /report-cards /summary
  • Imports the real policy via importlib
  • React / Vite console
  • Live verdict matrix
The film
The reel
Validity, not accuracy

Six controls. One verdict.

  • 76% of the signal was silence.
  • AUC 0.999 — the metric is the speaker.
  • Partial ρ = −0.001 — it measured loudness.
Why this one

I built the machine that catches the machines.

A whole family of clinical-speech metrics reports one correlation and calls it validated. I kept finding that the number was real and the reason was wrong — the score was tracking silence, or loudness, or simply who the speaker was.

So I stopped writing another metric and built the instrument that interrogates them. Six controls, documented thresholds, one FAIL fails the card. The exact policy that grades the papers is the same code the console runs live — delete a result file and the site goes blank. Seed 42, frozen weights, speaker-disjoint splits, every figure traced to a committed file.

It is a released test-suite, a live audit console, and a two-paper contribution — built solo, on real dysarthric speech. Validity, not accuracy. That is the whole point.

Validity, not accuracy

SIX CONTROLS. ONE VERDICT.