Voice-Health Claim Audit — transparency dashboard

The result, in four steps

Each step removes something the model was getting for free, and asks what survives. Every number here is read from the artifact named beside it.

  1. F1/F3 — patient age sex duration rms reaches 0.8747 recording-level AUC; WavLM (ens_rank3) reaches 0.7443. The audio model loses to one demographic variable. n=8 repeats × 5 folds on 1,679 speakers · bench_svd_wavlm_mean_std.json
  2. F4 — projecting out the speaker-identity subspace costs WavLM more AUC than removing more variance any other way: 24–39% of its above-chance headroom is who is speaking. n=10 · V2_speaker_subspace.json, shares computed over the ranks whose CI excludes zero
  3. F7a — with age matched to a 0.77-year gap, age-only collapses 0.8747 → 0.5534. The confound is genuinely removed, not assumed away. n=10 · V1_ssl_vs_handcrafted.json
  4. F7b — on that matched subset eGeMAPS 0.6496 beats WavLM 0.6227 (paired difference -0.0269, 95% CI [-0.032, -0.022], 10/10 seeds). 88 handcrafted features beat 1536 learned ones.

What survives once demographics and identity are stripped is AUC ≈ 0.65 — real, well above chance, far below the ~0.85 the literature reports here, and nowhere near clinical usefulness.

Each step links to the run that produced it: bench-wavlm · v2-speaker-subspace · v1-ssl-vs-handcrafted.

An autonomous, pre-registered audit harness that systematically re-tests published voice-health classification claims for speaker leakage, acquisition confounds, and cross-corpus collapse — publishing a transparent ledger of which claims survive. This program does not build another voice-disease detector.

Generated by scripts/build_dashboard.py on 2026-08-08 14:48 UTC · commit dbf0abf9e074f5f5325e84c1a4ef051e782470aa · every number below is read from a file in this repository; nothing is hand-entered (R1: no orphan numbers, R2: the agent never states a metric it did not read from an artifact).

Not a medical device. No diagnosis, no clinical claim.

The three tiers of this site

This page is the master. Every claim on it drills down twice, and each tier is generated from the same declared artifacts, so the three cannot disagree.

Background — what this data is, and what it can actually detect

The idea

A person speaks; a model listens and predicts a health condition. The appeal is that the sensor is a microphone everyone already owns. Two mechanisms make it plausible rather than magical. First, the larynx is the instrument — a vocal-fold paralysis, a polyp, swelling, a tumour or surgical scarring changes the sound directly. Second, speech is a motor act needing breath control, timing and fine neuromuscular coordination, so neurological and respiratory disease can leave traces even when the larynx is healthy. The first mechanism is short and well-evidenced; the second is a long causal chain and correspondingly weaker. The literature also claims depression, diabetes and heart failure from voice — this program tests none of those, for the reason in the next block.

The corpus

The primary corpus is the Saarbrücken Voice Database, a clinical archive from Saarland University Hospital. Each participant records 14 short vocalisations: the sustained vowels /a/, /i/, /u/ at normal, high, low and rising-falling pitch, plus one spoken German sentence.

28,509
recordings decoded
2,042 sessions
1,679
speakers
1,008 pathological / 671 healthy
70
named pathologies
see the long tail below
22.2 yr
age gap
healthy 27.2 vs pathological 49.4 — the confound this program is about

How many diseases can it detect? Not 70.

Sorted by how many speakers carry each diagnosis — not how many recordings, since a condition with 200 clips from 8 people is an 8-person condition:

condition has ≥ N speakersnumber of conditionsspeakers covered
≥ 1002265
≥ 506535
≥ 30 (this program's data floor)12762
≥ 528938
≥ 1701,019

19 of the 70 conditions are represented by a single speaker. So the honest answer is:

And note what those conditions are: almost all are dysphonias and structural larynx disorders — the category where the sound changes because the sound-producing organ changed. This corpus contains essentially no systemic disease. A model trained here detects disordered voice, not disease in general, and describing it otherwise is a category error.

Why this program exists

Published SVD results report UAR in the mid-80s. But healthy participants here average 27 years and patients 49, so patient age alone reaches ROC-AUC 0.87 without hearing a single audio sample (F1 below). Any classifier that quietly learns "older ⇒ patient" inherits that score for free. The interesting quantity is therefore not the accuracy but the margin above the demographic baseline on the identical folds — a number the field does not currently report. Measuring it is the entire purpose of this repository.

Every count in this section is recomputed at build time from data/interim/svd/manifest.csv; none is hand-entered.

The rest of the field → the dataset landscape

SVD is one corpus of many. The companion page catalogues every dataset the field uses to claim a disease can be heard in a voice — 25 corpora across 7 disease families (larynx, Parkinson's, dementia, dysarthria, respiratory, mental health, multi-phenotype), 8 of them released or audited in 2026 — each scored on the question the published surveys do not ask: could a result on this dataset mean anything? Spoiler: 5 of the 25 can never carry a generalisation claim at all.

How to read this

Status at a glance

7
findings
1 certified · 2 evaluation · 2 partial · 2 screening — see the ledger below
8
artifact-backed runs
6 at EVALUATION tier · experiment_log.jsonl rows: 0 (the file does not exist; the run ledger is assembled from the artifacts themselves)
3
corpora decoded
75,315 files at 16 kHz mono — but see the corpus table for what each one can support
7 − 3
hypotheses registered − never executed
3 of 7 have no run at all. A hypothesis whose falsifier has not been executed is never SUPPORTED (R7); it is counted here as debt. registry →

Two inputs disagree about the same corpus

data/PREPROCESSING_STATUS.md (hand-maintained, last written 2026-07-25 22:39 UTC) states SVD at 667 decoded files from 49 speakers. data/interim/svd/summary.json (machine-written, 2026-07-28 03:12 UTC) states 61,170 decoded from 1,679 speakers.

Every count on this page comes from the JSON. The markdown is stale and is flagged rather than narrated — an earlier build of this page rendered the markdown in one panel and the JSON in the next, so two adjacent elements contradicted each other with nothing marking either. This panel is generated by a comparison, so it disappears on its own once the markdown is refreshed.

What is blocked right now

F1 — the headline finding

On SVD, patient age alone reaches ROC-AUC 0.8709 without hearing any audio

SCREENING metadata-only · artifact data/raw/svd_meta/voice_data.csv (md5 2ee9852a19ed…) · measured values in autoresearch_results/F1_demographic_baseline.json

Using only the demographic metadata distributed with the Saarbrücken Voice Database — no audio, no features, no model of speech — over n = 2,225 sessions (1,356 pathological / 869 healthy) from 1,853 unique speakers:

predictorROC-AUC (pathological vs healthy)n
age alone0.87092,225 sessions
sex alone0.51722,225 sessions
age + sex, logistic, speaker-disjoint 5-fold GroupKFold0.87682,225 sessions /
1,853 speaker groups

Underlying cause — a recruitment asymmetry

Healthy speakers are young volunteers; pathological speakers are older clinic patients. Mean age 28.3 years (healthy) vs 51.0 years (pathological) — a gap of 22.7 years.

Age distribution of healthy vs pathological SVD sessions, showing a 22.7-year gap in means
Recomputed from voice_data.csv by scripts/build_dashboard.py; the script aborts if the recomputed counts and means disagree with F1_demographic_baseline.json.

A live leakage trap in the same artifact

200 of 1,853 speakers contribute more than one session (max 24 sessions for a single speaker). Splitting SVD at the recording level — the default in any naive train_test_split — leaks those speakers across folds. All work in this repository splits on SprecherID via GroupKFold and asserts speaker-disjointness before every fit.

What this does NOT claim — read before citing

  1. This does not show any published result is wrong. UAR and ROC-AUC are different metrics and are not directly comparable; the comparison above is indicative, not a like-for-like contest. A proper audit must recompute the published pipeline's metric on matched splits — that is the next experiment, not this one.
  2. Several published pipelines may already control for age, use age-matched subsets, or report demographic baselines. The audit question is whether the margin above the demographic bar is reported at all — not whether these researchers were careless.
  3. Metadata-only baselines say nothing about whether voice does carry pathology signal. It very likely does. The claim is strictly about attribution.

Quoted verbatim from FINDINGS.md §F1. The published SVD benchmark is UAR 85.22 (arXiv:2410.10537) — different metric, indicative only.

Reproduce

# metadata (167 KB), then the baseline -- CPU, seconds, no audio required
python scripts/fetch_svd.py --metadata-only
python scripts/audit_demographic_baseline.py --dataset svd

First measured audio benchmark — a negative result, since superseded

eGeMAPS on the decoded SVD pilot slice does not clear its own age bar

EVALUATION SCOPE-LIMITED — 49 of 1,679 speakers CONFOUND BAR NOT CLEARED · artifact autoresearch_results/bench_svd_egemaps.json · config hash 3ffad10ed6634618 · run commit a640ceb19f59 · 2026-07-25T23:55:48Z · 58 min CPU

Command: run_benchmark.py --corpus svd --backbone egemaps --head all --folds 5 --repeats 10 — opensmile-eGeMAPSv02, 88 features, 5-fold speaker-disjoint × 10 repeated partitions, n=667 recordings / 49 speakers, 20 pathological / 29 healthy speakers.

head / baselinespeaker-level ROC-AUC95% CIrecording-level ROC-AUCUARECEverdict vs age bar
logreg0.6172[0.437, 0.777]0.57090.65600.204NOT CLEARED
linsvm0.5259[0.353, 0.697]0.53140.52500.088NOT CLEARED
mlp0.6310[0.460, 0.791]0.59580.65600.209NOT CLEARED
gbt0.7983[0.663, 0.925]0.69100.66550.152NOT CLEARED
ens_rank30.7190[0.566, 0.855]0.63940.64480.186NOT CLEARED
confound age_only0.7086[0.533, 0.874]0.70270.67160.244THE BAR
confound sex_only0.4569[0.286, 0.630]0.45520.63360.282baseline
confound age_sex0.6776[0.495, 0.853]0.67250.71380.188baseline
confound duration_only0.4414[0.283, 0.606]0.41490.50000.012baseline
confound intensity_rms_only0.5155[0.359, 0.689]0.46550.50000.087baseline
confound age_sex_duration_rms0.6759[0.495, 0.852]0.67230.71380.179baseline

Sortable: click a column header. CI = 2,000-resample speaker-level bootstrap. All rows: n=667 recordings / 49 speakers.

Result: the strongest confound baseline is age_only at speaker-level AUC 0.7086. The best audio head (gbt) reaches 0.7983, a delta of +0.0897 (95% CI [-0.076, 0.264]). All 5 heads are NOT CLEARED. On this slice, eGeMAPS carries no demonstrated signal above patient age.

What this does NOT claim, and what has since superseded it. This is 49 speakers — a speaker-disjoint test fold holds about ten people and the 95% CI on any accuracy is roughly ±15 pp, visible in the intervals above. It satisfies the repeat contract (10 repeats) and is still a narrow slice; both facts are stated because either alone would mislead. It is not evidence that eGeMAPS fails on full SVD. The same corpus has since been measured at 1,679 speakers with a different representation — see run-bench-wavlm, which reaches the same verdict against the same bar. This section is kept rather than deleted because a superseded null that is quietly removed is indistinguishable from one that was never run (R8).

Bar chart of measured confound baselines against the audio model and the published SVD target
Every bar is a measured speaker-level AUC read from bench_svd_egemaps.json or F1_demographic_baseline.json. The dashed line is the published target and is a different metric (UAR) on a different, larger slice — it is drawn for orientation, not as a like-for-like contest.

Benchmark scoreboard

Published SOTA cells are quoted verbatim from corpus/SURVEY_datasets.md §1. "Ours" is filled only from a measured artifact in autoresearch_results/; everything else says not yet measured. Margins are shown only where the two numbers are the same metric on a comparable slice — otherwise the cell says so.

datasetpublished SOTAoursmargin vs SOTAconfound baselinemargin vs confoundspeaker-disjoint?status
SVD (Saarbruecken Voice Database)UAR 85.61 (F) / 84.69 (M) / 85.22 (combined) — arXiv:2410.10537UAR 0.7676 / AUC 0.8650
n=28,509 recordings / 1,679 speakers, 8 repeats × 5 folds, WavLM ens_rank3, speaker-level EVALUATION
superseded pilot: eGeMAPS gbt AUC 0.7983 on n=667 recordings / 49 speakers — same corpus, 3% of the speakers
not comparable
the published figure is UAR; ours is ROC-AUC. Different metrics are not differenced here.
0.8649 AUC
age_sex_duration_rms, same folds, same run
0.8768 AUC
age+sex, metadata only, full corpus (F1)
+0.0001 AUC
95% CI [-0.017, 0.018] — includes 0
NOT CLEARED
YES — SprecherIDEVALUATION NEGATIVE
CoswaraAUC ~0.92 intra-datasetnot yet measurednot yet measurednot yet measurednot yet measuredYES — participant id
submission-disjoint, not person-disjoint: the returning-user flag is blank for 680 of 2,746
PENDING
PROCESS-2macro-F1 0.59 (3-way), F1 0.85 (2-way), MMSE RMSE 3.87 (DistilBERT)
arXiv:2605.14888
not yet measurednot yet measurednot yet measurednot yet measuredn/a — not obtainedBLOCKED
manual HF gate; 400 participants fails the 500/class bar — screening-tier only
ICBHI 2017 respiratory soundICBHI score (event-level)not yet measurednot yet measurednot yet measurednot yet measuredn/a — not obtainedBLOCKED
ADReSS / ADReSSo / ADReSS-MADReSS F-score ~0.79 (with age+sex as inputs); ADReSSo acoustic F-score ~0.76not yet measurednot yet measurednot yet measurednot yet measuredn/a — not obtainedBLOCKED

Corpus status

corpuson diskfiles founddecodedspeakersaudioclass balancelicence / accessspeaker-disjoint possible?
SVD (Saarbruecken)
33262 duplicate waveform hashes (within-speaker only)
152 MB61,17861,170
8 failed
1,6793639.2 min41,653 pathological
19,517 healthy
free to use ("free for reproducible voice science")YES
provenance: participant
COUGHVID2.30 GB13,53513,53513,5351856.9 min10,132 healthy
2,683 symptomatic
720 COVID-19
open (Creative Commons via Zenodo)NO — cannot support an evaluation claim (0 real speaker ids)
uuid is per-recording; one person may appear in both halves of any split and there is no way to detect it. Pretraining and OOD probing only.
Coswara12.98 GB684610
74 failed
72110.7 min529 healthy
45 no_resp_illness_exposed
36 resp_illness_not_identified
openYES
provenance: participant

Counts read from data/interim/<corpus>/summary.json and the row count of each manifest.csv; on-disk sizes from data/ACQUISITION_STATUS.md; licences from corpus/SURVEY_datasets.md. SVD and Coswara are partial acquisitions — the speaker counts here are what is decoded on this host, not corpus totals (SVD: 1,853 speakers exist in the distributed metadata, 1,679 decoded; Coswara: 2,746 exist, 72 decoded). Both totals are read, not typed: the SVD figure comes from F1_demographic_baseline.json and the Coswara figure from autoresearch_results/acquisition/coswara_meta_stats.json.

Run ledger — every artifact-backed run

There is no experiment_log.jsonl in this repository, so this table is assembled from the result artifacts themselves through a declared registry in scripts/build_common.py: a run that is renamed, deleted, or added without being declared fails the build. That gate exists because three executed hypotheses once sat on disk for days while every published surface reported them UNTESTED. Every row carries its n and its tier; click a column header to sort, type to filter, click a run to open its full page.

runtierncorpus / representationheadline metricreference barverdicthypothesisfindingwritten
v2-shuffle-control
Label-shuffle negative control for the V2 subspace ablation
CONTROL
SCOPE-LIMITED
3
×5 folds
svd
wavlm
0.5069
full-embedding disease AUC (shuffled labels)
0.5047
AUC after removing the speaker subspace (k=8)
CONTROL PASSES -- effect vanishes under shufflingV2F42026-07-28 21:11 UTC
v1-ssl-vs-handcrafted
SSL vs handcrafted features under age-matched speaker-disjoint splits
EVALUATION
SCOPE-LIMITED
10
×5 folds
svd
see artifact
0.6496
mean ROC-AUC, eGeMAPS (age-matched)
0.6227
mean ROC-AUC, WavLM (same folds)
SSL DOES NOT BEAT HANDCRAFTEDV1F72026-07-28 16:05 UTC
v6-preprocessing-leakage
Scaler-fit-before-split leakage, measured on embeddings
EVALUATION
SCOPE-LIMITED
10
×5 folds
svd
see artifact
0.0042
max |delta AUC| across the cells that ran
3 / 6
cells run / cells pre-registered
PARTIAL -- near-null reproduced; falsifier NOT evaluableV6F52026-07-28 14:03 UTC
v7-silence-shortcut
Silence-only features across three corpora -- the Clever-Hans probe
EVALUATION10
×5 folds
svd
see artifact
0.5264
highest silence-only AUC of 4 cells (coughvid)
4 / 6
cells run / cells pre-registered
PARTIAL -- shortcut does NOT generaliseV7F62026-07-28 12:56 UTC
v2-speaker-subspace
Speaker-identity subspace ablation against variance-matched controls
EVALUATION
SCOPE-LIMITED
10
×5 folds
svd
wavlm
0.7382
full-embedding disease AUC (real labels)
0.6104
AUC after removing the speaker subspace (k=8)
CLAIM SUPPORTED -- falsifier did NOT fireV2F42026-07-28 10:59 UTC
bench-wavlm
WavLM-base+ on full-corpus SVD vs its own confound battery
EVALUATION
SCOPE-LIMITED
8
×5 folds
svd
wavlm
0.8650
speaker-level ROC-AUC, ens_rank3
0.8649
confound bar (age_sex_duration_rms)
NOT CLEAREDpredates the registryF2, F32026-07-28 04:47 UTC
bench-egemaps
eGeMAPS on the decoded SVD pilot slice vs its own confound battery
EVALUATION
SCOPE-LIMITED
10
×5 folds
svd
egemaps
0.7983
speaker-level ROC-AUC, gbt
0.7086
confound bar (age_only)
NOT CLEAREDpredates the registry—2026-07-25 23:55 UTC
f1-demographics
SVD demographic baseline -- age and sex only, no audio
SCREENING
SCOPE-LIMITED
0
×5 folds
svd
metadata only
0.8709
ROC-AUC, age alone
0.5172
ROC-AUC, sex alone (negative control)
CONFOUND ESTABLISHEDpredates the registryF12026-07-25 21:28 UTC

No row is highlighted as a champion, because this program has no champion. COMPOSITE.md defines a Goodhart-resistant composite (VOICE_AUDIT_COMPOSITE v1.0.0, fingerprint 37e745ed9b0bb4bd…) whose implementation location src/voiceaudit/composite.py does not exist, so no composite is computed for any row and no row can be ranked against another. Ranking these runs by a number that was never computed would be exactly the kind of orphan number the rest of this page refuses to print. Run ledger page →

Findings ledger

One row per ## Fn section of FINDINGS.md, with the tier the finding claims for itself and the artifact it points at. Nulls, partials and blocked results appear here at the same prominence as positives (R8) — four of these seven are negative or partial.

idfindingtierartifactrun page
F1On SVD, patient AGE alone reaches ROC-AUC 0.871 without hearing any audio
SCREENING-tier, metadata-only. Reproducible in seconds on CPU.
SCREENINGdata/raw/svd_meta/voice_data.csvno single run artifact
F2WavLM embeddings do NOT clear the demographic bar on SVD (pilot)
SCREENING, and formally UNDERPOWERED — the harness refused to certify it.
SCREENINGautoresearch_results/bench_svd_wavlm_mean_std.jsonbench-wavlm
F3At FULL corpus scale (1,679 speakers), WavLM still does not clear the age bar
stated in prose; see FINDINGS.md
CERTIFIEDautoresearch_results/bench_svd_wavlm_mean_std.jsonbench-wavlm
F4About a third of WavLM's disease discrimination is speaker IDENTITY, not pathology
EVALUATION (n = 10 repeats × 5-fold speaker-disjoint, m = 14 pre-registered,
EVALUATIONautoresearch_results/V2_speaker_subspace.jsonv2-speaker-subspace
F5Scaler-before-split leakage is nothing on SVD embeddings (0.00004 AUC), but the corpus-specificity claim is UNTESTED
PARTIAL — 3 of 6 pre-registered cells ran; one is underpowered by construction. n = 10 × 5-fold speaker-disjoint,
PARTIALautoresearch_results/V6_preprocessing_leakage.jsonv6-preprocessing-leakage
F6The Clever-Hans silence shortcut does NOT generalise: near chance on all three corpora
PARTIAL — 4 of 6 cells; but the silence arm ran on all three corpora.
PARTIALautoresearch_results/V7_silence_shortcut.jsonv7-silence-shortcut
F7With age matched away, 88 handcrafted features BEAT a 1536-dim SSL model
EVALUATION for the cell that ran (n = 10 × 5-fold speaker-disjoint, m = 9
EVALUATIONautoresearch_results/V1_ssl_vs_handcrafted.jsonv1-ssl-vs-handcrafted

Audits — this program's criticism of itself

Six review documents, none of which was linked from any published surface before now. They are listed with their verdicts rather than their titles, because a link labelled “audit” that hides an INVALIDATES-RESULTS finding is worse than no link. Implementer, critic and judge share a model family (R5/R16), so none of these is external validation.

documentwhat it found
Data-split audit
audits/DATA_SPLIT_AUDIT.md · 2026-07-27 05:31 UTC
SVD conditional pass (screening only) · Coswara FAIL · COUGHVID HARD FAIL
Implementation critic
audits/IMPL_CRITIC.md · 2026-07-28 10:04 UTC
one INVALIDATES-RESULTS defect (embedding cache key omits labels), 5 biases, and an empty tests/ — no rung-0 UNIT layer
Scientific critic
audits/SCI_CRITIC.md · 2026-07-27 05:31 UTC
the composite fingerprint re-executes, but the composite is implemented nowhere; F1's 0.871 is on 1,853 speakers and was quoted against a 49-speaker slice
Novelty critique
audits/NOVELTY_CRITIQUE.md · 2026-07-25 20:52 UTC
the loop is not novel (arXiv:2606.20394); the domain survives under exactly one framing — audit engine, not detector factory
Prior-program archaeology
audits/PRIOR_AUTORESEARCH_REPOS.md · 2026-07-27 05:31 UTC
7 sibling programs replayed from their own logs; one ran 0 experiments across 324 scaffolded tasks
Audit index + circularity disclosure
audits/README.md · 2026-07-27 05:30 UTC
leads with the single most serious defect found across all audits

Hypothesis registry

Per-hypothesis pages → — each registered hypothesis has its own page carrying the claim, the published result it audits, the pre-registered falsifier and predicted effect, and the power arithmetic. The prediction is rendered whether or not a result exists, so a reader can see what was promised before seeing what happened.

Parsed from IDEA_TABLE.md. A hypothesis whose falsifier has not been executed is UNTESTED, never SUPPORTED (R7). Tier and family size are pre-registered in version control before the sweep; reclassifying a loser as screening afterwards is HARKing and is a blocker.

3 of 7 registered hypotheses have never been executed. They are rows in this table with an UNTESTED chip and a run count of zero, not omissions — the prediction is on the record and the run is the debt.

idclaimfalsifierrequired ntierruns on diskstatus
V1
"SSL beats handcrafted features" may be an artifact of leaky protocols
Under simultaneously speaker-disjoint and demographically balanced splits, frozen SSL/health embeddings do not reliably beat eGeMAPS.If eGeMAPS lands within 2σ_seed of the best of {HeAR, WavLM-base+, Whisper-small-enc} on ≥ 2 of 3 corpora under A3 = speaker_disjoint + demographically_matched, A4 = fit_per_fold, the "SSL wins" claim is falsified for this task family.10
m = 9 (3 encoders × 3 corpora, each vs eGeMAPS) · n = 10 → 0.001953 ≤ 0.05/9 = 0.005556 ✓
EVALUATIONv1-ssl-vs-handcrafted n=10CLAIM SUPPORTED
CLAIM SUPPORTED on SVD — matching works (age 0.874→0.553); eGeMAPS 0.6496 BEATS WavLM 0.6227, CI [−0.032, −0.022], 10/10 seeds. Not formally closed (falsifier wants ≥2 corpora) — see F7
V2
Speaker-identity subspace ablation: how much of the "disease" signal is identity?
A large fraction of frozen-embedding disease discrimination lives in a low-rank speaker-identity subspace, and removing it collapses AUC further than a variance-matched random projection of the same rank does.Two-sided, both pre-registered. (a) If projecting out the rank-k speaker subspace collapses disease AUC toward chance while a variance-matched same-rank random projection does not — i.e. D(k) = AUC_rand(k) − AUC_spk(k) has a Holm-corrected 95% CI excluding 0 and AUC_spk(k)'s CI includes 0.5 — the clinical-validity claim for that model/dataset pair is falsified. (b) Conversely, if D(k) is within...10
m = 14 (7 ranks k ∈ {1,2,4,8,16,32,64} × 2 corpora) · n = 10 → 0.001953 ≤ 0.05/14 = 0.003571 ✓
EVALUATIONv2-shuffle-control n=3
v2-speaker-subspace n=10
CLAIM SUPPORTED
CLAIM SUPPORTED, falsifier did NOT fire — see F4
V3
Where does health-specific pretraining actually cross general-purpose pretraining?
Health-acoustic pretraining buys sample-efficiency, not ceiling: HeAR leads at small labelled-set size and is overtaken by Whisper-enc as n grows.Sweep labelled-set size n_train ∈ {25, 50, 100, 200, 400, 800, all}, subject-disjoint. If HeAR never crosses Whisper-enc at any n_train on any of the 3 tasks (Holm-corrected), the "health pretraining is the right prior" claim is falsified and reduces to a low-data convenience argument. If HeAR wins low and loses high, the crossover point is the deliverable.12
m = 42 (2 contrasts {HeAR vs Whisper-enc, HeAR vs WavLM} × 7 sizes × 3 tasks) · n = 12 → 0.000488 ≤ 0.05/42 = 0.001190 ✓
EVALUATIONnoneUNTESTED
UNTESTED
V4
Does calibration degrade with distribution shift, or independently of it?
Calibration error does not track AUC collapse under corpus shift, so model confidence is unusable as an out-of-domain detector.Measure ECE, Brier, and reliability curves within- and cross-corpus on COUGHVID↔Coswara (both directions) and on SVD→VOICED. If ECE stays flat within its own seed noise band while AUC falls from ~0.80 to ~0.55, confidence is falsified as a shift detector — a negative result with direct deployment consequences. Raw and temperature-scaled variants reported separately.10
m = 6 (3 corpus pairings × {raw, temperature-scaled}) · n = 10 → 0.001953 ≤ 0.05/6 = 0.008333 ✓
EVALUATIONnoneUNTESTED
UNTESTED
V5
Zero-shot audio-LLMs as a leakage-free reference point
The gap between a supervised probe and a zero-shot audio-LLM is a cheap, model-free estimate of how much leakage a protocol admits, because a zero-shot model has no training split and therefore cannot leak speaker identity, demographics, or preprocessing statistics.Compute Δ_leaky = AUC_sup(random_recording split) − AUC_zeroshot and Δ_honest = AUC_sup(speaker_disjoint + demographically_matched) − AUC_zeroshot. If Δ_leaky ≈ Δ_honest (overlapping bootstrap CIs) on ≥ 2 of 3 datasets, the proposed leakage estimator is falsified — the gap tracks supervised capacity, not leakage. If Δ_leaky ≫ Δ_honest consistently across ≥ 3 datasets, the field gains a leakage audit...10
screening n ≤ 3 · promotion target m = 3 (3 datasets), n = 10 → 0.001953 ≤ 0.016667 ✓ (n = 8 would also satisfy m = 3)
EVALUATIONnoneUNTESTED
UNTESTED
V6
Preprocessing-fit leakage is corpus-specific and cannot be assumed small
The inflation from fitting the scaler/normaliser before splitting varies by an order of magnitude across corpora, so "we scaled before splitting but it's a small effect" is not defensible on an unmeasured corpus.If the fit_on_all − fit_per_fold AUC difference has a 95% CI contained within ±0.01 AUC on all of SVD, Coswara, COUGHVID for both eGeMAPS and a frozen SSL representation, the "corpus-specific magnitude" claim is falsified for this pipeline family and preprocessing scope can be de-prioritised as an audit axis.10
m = 6 (3 corpora × 2 representations) · n = 10 → 0.001953 ≤ 0.008333 ✓
EVALUATIONv6-preprocessing-leakage n=10PARTIAL
PARTIAL — SVD near-null reproduced on embeddings; falsifier NOT evaluable — see F5
V7
The Clever-Hans silence shortcut beyond the Pitt corpus
Non-phonatory signal alone (silence/pause structure, recording-level duration and intensity statistics) achieves a substantial fraction of headline performance on voice-health corpora outside the one where the effect was first documented.If silence_only and duration+intensity_only baselines both score < 0.60 AUC on all of SVD, Coswara and COUGHVID under A3 = speaker_disjoint, the generalisation claim is falsified and the shortcut is confirmed Pitt-specific for this corpus set.10
m = 6 (3 corpora × 2 shortcut feature sets) · n = 10 → 0.001953 ≤ 0.008333 ✓
EVALUATIONv7-silence-shortcut n=10PARTIAL
PARTIAL — shortcut does NOT generalise; my mechanism was WRONG — see F6

The methodological traps — the audit checklist

The 10 traps catalogued in corpus/SURVEY_datasets.md §3, each reduced to its operative rule. Every experiment in this program is checked against this list.

#trapoperative rule
3.1Speaker-dependent splits — the #1 leakage failureGroup-aware GroupKFold on speaker id, always. Never train_test_split on recordings. Report the speaker-level n alongside the recording-level n.
3.2Recruitment / symptom confound — the field's canonical negative resultAny respiratory claim in this program must report a confounder-matched number alongside the raw number, or it is not a claim.
3.3Recording-device and site confoundsEvery headline number needs a cross-corpus companion number. Log the recording device / site as a feature and check that a device-only classifier is near chance.
3.4Interviewer / prompt shortcutStrip all interviewer audio and text from any interview-based corpus before training.
3.5Age and sex confoundsReport per-sex and per-age-band metrics; include a demographics-only baseline classifier in every experiment and claim only the margin above it.
3.6Language and accent confoundsDo not report a cross-lingual result as if it were an in-language one.
3.7Tiny-n overfittingUnder the project's rigor contract these are screening-tier only: n<=3 seeds cannot reach p<0.05 under paired Wilcoxon, and a 12-speaker test fold has a standard error of roughly ±0.14 on accuracy.
3.8"Balanced" is not "deconfounded", and ASR quality is a hidden variableIt does not remove recording-session, task-administration, or transcription-pipeline effects.
3.9Label-provenance asymmetryThese are not interchangeable. A high AUC on a self-report corpus may be measuring self-report behaviour.
3.10Anonymisation degrades diagnostic signalVoice anonymisation, increasingly required for sharing, measurably harms downstream diagnostic classification (arXiv:2304.02181, COVID-19 case study).

Sources rendered on this page, and when each was last written

Every panel above is built from one of these files. The write times are shown because an input older than the run it describes is how a page ends up narrating a superseded state — the disagreement panel near the top is generated by exactly that comparison.

sourcebyteslast written (UTC)
autoresearch_results/F1_demographic_baseline.json6892026-07-25 21:28 UTC
autoresearch_results/bench_svd_wavlm_mean_std.json12,8942026-07-28 04:47 UTC
autoresearch_results/bench_svd_egemaps.json18,8132026-07-25 23:55 UTC
autoresearch_results/V1_ssl_vs_handcrafted.json4,2822026-07-28 16:05 UTC
autoresearch_results/V2_speaker_subspace.json6,7002026-07-28 10:59 UTC
FINDINGS.md28,3022026-07-28 21:12 UTC
IDEA_TABLE.md22,2432026-07-28 16:06 UTC
COMPOSITE.md17,2442026-07-25 21:10 UTC
corpus/SURVEY_datasets.md27,2792026-07-25 20:52 UTC
data/ACQUISITION_STATUS.md14,7262026-07-25 21:33 UTC
data/PREPROCESSING_STATUS.md11,5572026-07-25 22:39 UTC
data/interim/svd/summary.json4772026-07-28 03:12 UTC
data/interim/coswara/summary.json4632026-07-25 22:36 UTC
data/interim/coughvid/summary.json4552026-07-25 22:57 UTC
autoresearch_results/acquisition/coswara_meta_stats.json2,5362026-07-25 21:27 UTC
data/raw/svd_meta/voice_data.csv167,4572026-07-25 21:26 UTC