Inspiration

Every speech-coaching tool we tried judged us against one "ideal" reading, or against generic rules like "speak at 150 words per minute" and "pause every sentence." Great speakers break those rules all the time. Listen to five strong readings of the Gettysburg Address: they pause in different places, speed up in different places and stress different words, and all of them are good.

So we asked a different question: where, word by word, does this delivery leave the range that strong speakers of the same text occupy, and by how much? If good readers disagree about a pause, it's a style choice, not a mistake. If every good reader pauses there and you don't, that's worth telling you.

What it does

Cadence takes a recording of a known passage and returns a word-level report:

  • Flags only real outliers: rushed or dragging pace, missing pause, misplaced pause, monotone, missed emphasis, volume fade.
  • Explains every flag in measured units, for example: "You rushed 'that we here highly'. Speaking rate 1.17× your own typical value; the good renditions spanned 0.87–0.94 across six. Slow down from 'that' to 'highly'."
  • Shows you the evidence: your line drawn against the grey band of good readers, A/B playback of your words against a good reader's same words, and six rubric scores from 0 to 10.
  • Coaches you: a Practice mode with live read-along and a pace gauge, a Test mode, and a before/after card.
  • Is deterministic: no language model judges anything, and the same audio gives a byte-identical report with a hash.

How we built it

Pipeline. ffmpeg decode → 16 kHz, −23 LUFS → wav2vec2 finds the passage in the audio → forced alignment (MFA, or CTC wav2vec2) gives every word a time span → Praat/openSMILE measure per-word rate, pause, pitch range, loudness and prominence, normalised to the speaker's own median so voice type and microphone gain don't count.

The consensus envelope. For word $w$, feature $f$ and $K$ good renditions:

$$ L = \min_k x_k - m_f, \qquad U = \max_k x_k + m_f, \qquad d = \frac{\max(0,\; L - x,\; x - U)}{s_f} $$

Here $m_f$ is the 95th percentile of the measurement noise between a reference and a null-edited copy of it, and $s_f$ is the median envelope width. Inside the range, $d = 0$. With $K = 1$ this is exactly the single-reference baseline, so the comparison is fair by construction.

Regions come from hysteresis on $d$, and each dimension score is

$$ \text{score}_d = 10\, e^{-\lambda_d \sum_r \bar d_r \,\text{dur}_r / T}. $$

Ground truth we could trust. Human flaw labels are slow and noisy, so we built a flaw injector: Praat PSOLA edits inject each of the 6 flaw types at 5 severities into good readings, with exact time labels. Null-edit controls (processed but unchanged) prove that resynthesis alone doesn't trigger the detector. That gave us 443 labelled clips over 132 real recordings and 8 texts, published on Hugging Face, including held-out Indian-accented speakers and an Indian-authored text (Tagore).

Scientific hygiene. Thresholds are fitted on one calibration text only. A pre-registered ship rule decided between detector versions, and it rejected our own newer v3 detector. The results include where we lose.

Interfaces. A coach web app (FastAPI and vanilla JS), a Gradio research dashboard, a REST API and a CLI, with a Makefile, Docker, and CI that checks byte-identical reruns.

Results

On the Gettysburg opening (T4), the envelope reached a 40% Matching Score at 0.24 false alarms/min, against 29% / 0.94 for a single reference and 16% / 19.3 for generic rules. It beats the single reference on four of six test texts, including the held-out Indian-accented speakers (27% vs 22%), and loses on Kipling's If—. We report both.

Challenges

  • Getting good readings legally. TED is CC BY-NC-ND, so we built the dataset from public-domain LibriVox readings and the Speech Accent Archive.
  • The detector couldn't see what we injected. Early ladders put emphasis flaws where good readers didn't agree on stress, so recall was 0%. Restricting targets to perceptible consensus stress points fixed the evaluation.
  • Accent bias in the aligner. An English aligner ranks accented readers lower, so we held out Indian speakers explicitly and documented the bias rather than hiding it.
  • Determinism. Rounding, sorted JSON, fixed seeds and PYTHONHASHSEED, all enforced in CI.

What we learned

"Correct" delivery is a range, not a point. Comparing against a consensus instead of a single exemplar is what lets a coach tell a mistake from a style choice. We also learned that pre-registering our decisions kept us honest, even when it meant not shipping our newest model.

What's next

Human listening studies to calibrate perceived severity, more texts including famous original recordings, and learning envelopes for any text from a handful of volunteer readings.

Built With

Share this project:

Updates

Submission history