Skip to content
Sign in

/evidence/studies

Every test we ran, including the ones that failed.

Before a measure goes into the product we test it, with the pass mark written down first. Here is every one of those studies, one by one: the question, what we compared against, the data, the result and what changed because of it. A study that missed its mark stays on this list.

24 studies: 5 all criteria met, 5 some criteria met, 10 criteria missed, 4 exploratory, no pass mark. The status of every measure is on /lenses; where the two differ, /lenses is right.

01 · Checking the dates

The pass mark came first. Here is how you can check that.

Each study has a preregistration: a file with the criteria and the decision rule, committed before the measurement. Below each study is the SHA-256 of that file.

Every one of those hashes is in one list, stamped with OpenTimestamps, which anchors it in the Bitcoin blockchain (proof file). We first did this on 20 October 2026 and make a new list for every new preregistration. Run ots verify on the proof file, with the list next to it.

What this proves, and what it does not. The preregistrations themselves are not published yet. When we publish one, you can hash it and find the hash in the stamped list. For studies from before 20 October the stamp proves only that the text has not changed since that day; the earlier order rests on our own commit history. From now on every new preregistration is stamped before its measurement.

02 · The studies

Newest first

Live test4 The live monitor over stream paths

Some criteria met

Do the five detectors of the live monitor (gap, clipping, dead air, level drop, hum) meet the criteria of the file test when the audio arrives over a stream path instead of from a file?

Against:
Faults planted on purpose at known times in every recording, and stretches of ordinary speech for the false alarms; the thirteen criteria of the earlier file test, unchanged, for every path.
Data:
24 recordings of 600 s (a closed set), read over ten paths: the file, the build of /live, a WebSocket at 8 kHz mu-law, LiveKit before and after Opus, G.711 and Opus over RTP with 1% and 5% simulated packet loss, and the Pipecat bridge.
Result:
Criteria met on 4 of the 10 paths: the file, the build of /live, LiveKit before Opus and the Pipecat bridge, all four with the same 727 events. Not met: the WebSocket and both G.711 paths on clipping (19 of 24 found, 7.7 to 8.7 false alarms an hour), both Opus paths over RTP on gaps (under 2% found), and LiveKit after Opus on gaps, false level drops and dead air.
What changed:
The status of every detector stays signals. /live and the guides say on which paths the criteria were met. Nothing was adjusted after the run, and it was not run again.

Measured 11 November 2026. Preregistration: commit bb2e222, SHA-256 1717f422d5dff20fd20724c9d73d48a3aa17dbcb8df8fa254e36b80e2287a5fc

UP-2 A narrow band as a measurement

Some criteria met

Does one fixed rule (the bandwidth against half the sample rate) read upsampled speech as band-limited, without false alarms on speech at its own rate, and does it name the right source rate?

Against:
Speech upsampled with five resamplers (ffmpeg swr and soxr, scipy resample_poly and FFT, torchaudio) from 4, 8, 11.025 and 16 kHz to 16, 44.1 and 48 kHz, next to speech at its own rate.
Data:
2,490 files built from LibriSpeech and FLEURS (Arabic, Urdu): 1,650 upsampled, 450 at their own rate, and lossy and telephone versions reported on their own.
Result:
One criterion met: 2.2% undetermined. Not met: 1,613 of 1,650 upsampled files read band-limited (97.8%), but 2 of the 55 cells stayed under 95%; 6 of 150 LibriSpeech files read band-limited (4.0%, all one speaker), against 0 of 300 FLEURS files; the source rate was right in 83.9% (bar 90%). The upsampled measure we had found 1.0%.
What changed:
The upsampled measure is a proxy now. The measurement became the band limit, an opt-in and a proxy too, without a source rate. Under bandLimit.upsampled it can say no or cannot-say, never yes on its own. Nothing was adjusted after the run.

Measured 5 November 2026. Preregistration: commit 7003176, SHA-256 563697d5483afad10f85230afa7d77d85523197d59f194424a7d09a346d85358

UP-1 A phone line inside a wideband file

All criteria met

Can we tell that a 16 or 48 kHz file went through an 8 kHz phone line, from the bandwidth alone?

Against:
Versions built with a known origin: through G.711, AMR-NB or GSM at 8 kHz and back to 16 or 48 kHz, next to the untouched files.
Data:
782 FLEURS files (Dutch and Hindi) in six versions, read at the file's own rate and decoded at 48 kHz as a browser does.
Result:
All criteria met on both routes: a bandwidth under 5 kHz found the phone origin in 97.3 to 100% of the phone versions, and flagged 0.1 to 1.8% of the untouched files. The measure we had found it in 3.2% at most.
What changed:
Built as its own field, telephonyOrigin (9 November 2026), so upsampledFromHz kept its values. It is the only condition that lets bandLimit.upsampled say yes.

Measured 21 October 2026. Preregistration: commit d68af20, SHA-256 778d8ebaed8b48a26a33b8874763527352e4371f56120b6603cf8171c50bb2fd

GR-3 Rules against a set of one source

Some criteria met

Do loudness, noise and a silent-pause flag work against the median of one source (one speaker, one session)?

Against:
Each file against the other files of its LibriSpeech chapter, with known damage built in.
Data:
2,220 fresh test files no earlier study used, their phone versions, and 200 files in seven damaged versions.
Result:
Loudness against the own source met all its criteria, for recorded and phone speech: under 1% false flags, and 200 of 200 files 20 dB softer caught (limit 7 LU). Noise against the own source caught added noise in 65 to 73% only; a silent-pause flag failed after a phone codec; bandwidth read an 8 kHz origin as about 4.3 kHz, above the 4.1 kHz we set.
What changed:
The loudness rule is proposed for sets of one source (one voice, one pipeline, one session). The other three go to a next study.

Measured 20 October 2026. Preregistration: commit 0eee9a7, SHA-256 e87cdaef8e7c85436ff274bd056c1c6778d4bde2fc257f67549e86397b6d73fd

GR-2 Better rules for real recordings

Criteria missed

Do a signal-to-noise minimum, loudness against the own set and a fixed-band bandwidth work better?

Against:
The same sets, plus noise 25 dB under the speech and a simple noise gate.
Data:
5,187 rows: 3,587 scans and 1,600 bandwidth readings at 16, 44.1 and 48 kHz.
Result:
No part met all criteria. A signal-to-noise minimum cannot tell noisy real speech from added noise; a set of many speakers varies too much for loudness; bandwidth still depends on the decoding rate.
What changed:
Nothing changed. For TTS output, one source, the loudness rule did work: the next study tests sets of one source.

Measured 20 October 2026. Preregistration: commit d72b56d, SHA-256 5179c938e0cbe2283b985a5fcc1e196c40733a440dd0b67108fbcb4894b49705

GR-1 Starting limits per use

Criteria missed

Do fixed limits from good recordings catch damage, per kind of use (recorded speech, phone, TTS output)?

Against:
Good recordings, and damage built in: 20 dB softer, noise 15 dB under the speech, a 3.4 kHz low-pass.
Data:
3,287 files: LibriSpeech, the same through three phone codecs, TTS output of 9 voices, FLEURS Dutch and Hindi.
Result:
No use met all criteria. For human speech fixed loudness and noise-floor limits catch the damage in 49 to 86% only. Our starting limits fail 98 to 100% of real speech.
What changed:
No new starting limits. The site says next to a verdict that it is judged against our starting limits, not yours.

Measured 20 October 2026. Preregistration: commit cd5cc71, SHA-256 f5a2b30a0e42feefee43f6a4271511d58bf995d1547ebc6c35331decadd1da2b

V03-ENG The engine on a voice-AI stress set

Exploratory, no pass mark

What does the engine read on audio with known damage: level, clipping, codecs, cut-offs?

Against:
What the set builder knows about each file.
Data:
432 files: 17 conditions x 24 utterances from test-clean, plus the clean base.
Result:
Clipping flagged in every clipped file with 0 of 96 false alarms; bandwidth separates narrowband from wideband codecs; speech codecs are not recognised as lossy (0 of 168).
What changed:
Limits and numbers added to the status text of twelve measures.

Measured 15 October 2026. No preregistration: exploratory, no pass mark set.

OV-1 A second voice at the same time

Exploratory, no pass mark

Can signal processing find a second voice talking over the first?

Against:
A built set with known overlap; the test half stays closed.
Data:
Development half only: 256 files.
Result:
Two attempts gave no usable signal (AUC 0.45, and 0.69 to 0.78).
What changed:
No measure. A trained model is being studied separately.

Measured 14 October 2026. No preregistration: exploratory, no pass mark set.

SB-3 Echo and slapback, third try

All criteria met

Does a steadiness test (an echo is present everywhere) fix it?

Against:
Built copies, also of the direct sound in a real hall; clean recordings.
Data:
360 new synthetic recordings (9 voices, 6 languages) plus a closed test half of 256 files.
Result:
All six criteria met: 282 of 284 copies found, 0 false alarms in 332 recordings without one, 120 of them real read speech.
What changed:
Verified on known signals and offered in the API and the MCP server since 20 October 2026.

Measured 14 October 2026. Preregistration: commit ee365a7, SHA-256 a576457eda976f05ad9afef99f72a7a24f0abd17a8eb3836624c8f8cb13384c7

SB-2 Echo and slapback, second try

Criteria missed

Does a comb test remove the false alarms on synthetic voices?

Against:
Built copies with a known delay and level; clean recordings.
Data:
300 new synthetic recordings from 7 voices.
Result:
False alarms on synthetic voices from 26% to 5%, 97.3% of copies found, but two criteria missed.
What changed:
Not offered.

Measured 14 October 2026. Preregistration: commit ccbaea4, SHA-256 ea1c1ceaaf04adb934b62da02e2444b01c681b1e6d04d65a197035242d05275b

PT-1 to PT-4 Pitch and voice quality

Some criteria met

Do pitch, harmonics-to-noise ratio, jitter and shimmer read the true values?

Against:
Constructed voices with exact values per frame, and a second pitch tracker on real speech.
Data:
1,092 constructed voices plus 40 readings of 30 s from test-clean.
Result:
Pitch and harmonics-to-noise met their marks; jitter and shimmer narrowly missed.
What changed:
Pitch and HNR Verified on known signals; jitter and shimmer not offered.

Measured 13 October 2026. Preregistration: commit cd68c34, SHA-256 181017c579b3b5ebcf256dd89b993165fd4e31fc65c743d59957b8d3ab8f6dab

DR-1 Dropouts

All criteria met

Does the dropout detector find gaps of digital silence inside sound?

Against:
Gaps cut in at a known place and length.
Data:
240 built recordings plus 1,630 scenario recordings; 8,411 gaps in sound.
Result:
All five criteria met: 99.8% of the gaps found, no false alarms.
What changed:
Verified, on known signals.

Measured 13 October 2026. Preregistration: commit f72beb8, SHA-256 7f0c51ecb422c265a1027d053d06e0c5bfee96a06e63e9532f33bf6c3149b5b9

SB-1 Echo and slapback

Criteria missed

Does the slapback detector find a delayed copy without false alarms?

Against:
Copies built in with a known delay and level; recordings without a copy.
Data:
220 built recordings plus 1,630 scenario recordings, 1,575 of them without a copy.
Result:
Found every built copy, but 27% false alarms on recordings without one (mark: 2%).
What changed:
Not offered.

Measured 13 October 2026. Preregistration: commit f72beb8, SHA-256 3e19a7df5297197d88b117cb2eed9b37157aa1820de31cd6ea1be22fef9c4174

RM-1 Room acoustics

Exploratory, no pass mark

Does the room measurement in the engine read the same as our RoomLab app?

Against:
The RoomLab app code and an independent implementation, on real impulse responses.
Data:
385 real impulse responses from two public collections.
Result:
Reverberation time per octave band equal to RoomLab; the clap pipeline has a median error of 3.9%.
What changed:
The room measures are Verified, against a reference.

Measured 13 October 2026. No preregistration: exploratory, no pass mark set.

SNR-3 Signal-to-noise, correction

All criteria met

Does a correction under 16 dB, on the K2 detector, remove the optimism?

Against:
The ratio set when mixing (20 to 0 dB).
Data:
520 mixtures from test-clean with three noise environments in no development set.
Result:
All four criteria met: at 5 dB the mean error went from +5.95 to +1.87 dB.
What changed:
Adopted under 16 dB, with K2 only.

Measured 13 October 2026. Preregistration: commit 2e4a0d3, SHA-256 00474f340406c5731538cc2b1990f06b07208570b1fd77f9977a5b510f06fd2a

SNR-2 Signal-to-noise, hybrid

Criteria missed

Does a hybrid estimator read signal-to-noise closer to the truth?

Against:
The ratio set when mixing (20, 10 and 5 dB).
Data:
The 1,344 scene files, six of nine environments new to the estimator.
Result:
Missed one criterion by a hair: 90th percentile error 6.21 dB at 10 dB, against 6.0.
What changed:
Not adopted.

Measured 13 October 2026. Preregistration: commit 43ebeca, SHA-256 7a09b5f91af6a85bb12e95f4daadacaeb4352448c5f91ea23eef69615d4a84d6

VAD-2 Speech detection, K2

All criteria met

Does hysteresis make the speech detector better on new speakers?

Against:
The forced alignment of LibriSpeech test-clean, new speakers.
Data:
680 mixtures from test-clean plus the 1,344 scene files.
Result:
All five criteria met for the new detector (K2). The stricter mark of VAD-1 stays out of reach.
What changed:
K2 is an option ("speechDetector": "k2") and the default on the site; speech measures stay Indicative.

Measured 13 October 2026. Preregistration: commit e9e73d6, SHA-256 6f0350c95272b69802231d926dad948ab726119dcfa0a8f1855e84a31a6945da

CT-2 Content type, model v2

Criteria missed

Does a second content model do better than the first?

Against:
The MUSAN categories, and three noise environments the model never saw.
Data:
690 fragments: the 600 of CT-1 plus 90 of unseen environments.
Result:
Missed its criterion (noise recall 0.444), but beat the first model in every class.
What changed:
Offered as an option ("contentModel": "v2"); it becomes the default on 15 January 2027.

Measured 12 October 2026. Preregistration: commit b7b2973, SHA-256 13a55459331394d57638b4b13eeec7e84fe2d0dec7932d74cd293b48f415c1ce

SC-1 Background scene

Some criteria met

Do the scene measures tell machine noise from crowd noise?

Against:
Real noise environments of the DEMAND corpus, grouped by type, at known levels.
Data:
1,344 files: 9 environments x 3 levels x 48 utterances, plus controls.
Result:
Two scene measures met their mark; one worked the wrong way round (AUC 0.23).
What changed:
All four stay Indicative, the miss is named next to the measure.

Measured 12 October 2026. Preregistration: commit 5727a9d, SHA-256 bef3b39d9aa93669cd2fc0ce4674c453247ed818ca5da9983891506bc3929c35

MX-1 Speech over music

Criteria missed

Is speech over music recognised as a mix?

Against:
Mixtures with a known music-to-speech ratio, and pure controls.
Data:
500 MUSAN fragments of 20 s: speech, instrumental music and three mixing levels.
Result:
The label "mixed" was rarely used where it belongs: 29 of 100 with music 6 dB under the speech.
What changed:
Stays Indicative.

Measured 12 October 2026. Preregistration: commit 22eb5b8, SHA-256 467db8d5cb73c1011e70e059ea129e7aa1129619acdd5409129e54895f534313

TD-1 Reverberation (old measure)

Criteria missed

Do the two decay measures follow the real reverberation of a room?

Against:
Measured reverberation time (T20) of 24 real impulse responses.
Data:
120 files: 24 real rooms x 5 clean sentences.
Result:
Rank correlation 0.56 and 0.30, against a required 0.70.
What changed:
Both stay Indicative; we no longer say they measure the room itself.

Measured 12 October 2026. Preregistration: commit 5b3b31e, SHA-256 7ac8845125e61975ea6d1fabc58e8e168dfe0c931191c1e473eb4fe881ae5e7d

CT-1 Content type

Criteria missed

Does the content-type guess tell speech, music and noise apart?

Against:
The category of each fragment in the MUSAN corpus.
Data:
600 fragments of 20 s from MUSAN: 200 speech, 200 music, 200 noise.
Result:
Neither content measure met its criterion; noise was almost never called noise.
What changed:
Both stay Indicative.

Measured 12 October 2026. Preregistration: commit ac4ac36, SHA-256 1e37d5205bd6527c361ace312ea8a3f26f3771a1937008a9b79426dc54260765

SNR-1 Signal-to-noise

Exploratory, no pass mark

How far is the signal-to-noise reading from the true ratio?

Against:
The signal-to-noise ratio we set when mixing.
Data:
The same 680 mixtures as VAD-1.
Result:
Reads too high at low ratios, up to +10.7 dB at 0 dB.
What changed:
The margin went into the status text of the measure.

Measured 12 October 2026. No preregistration: exploratory, no pass mark set.

VAD-1 Speech detection

Criteria missed

Does the speech detector find the speech and the pauses in read speech under noise?

Against:
Word timings from a published forced alignment of LibriSpeech, and a known added noise level.
Data:
680 mixtures: 40 readings from LibriSpeech dev-clean in 17 conditions (four real noise types at 20 to 0 dB).
Result:
No criterion met. F1 0.92 on clean speech; the speech share read 12.5 points too low.
What changed:
All speech and pause measures stay Indicative, with these numbers in their status text.

Measured 12 October 2026. Preregistration: commit c704f2c, SHA-256 7265482d02dd601c96ca3e7488a8587852701c17f53059281b483b6e7c7d388f

03 · More

The written report of each study (the question, the recordings, the pass mark, the result and what it does not show) is shared on request with customers, partners and researchers. Public datasets used: LibriSpeech, FLEURS, MUSAN and DEMAND, under their own licences; built versions are made from those.