Inspiration

Judging interpretive, persuasive and extemporaneous speeches is subjective. Two judges can hear the same performance and give different scores, and the feedback is often vague ("pick up the pace", "more energy").

What stayed with us was credibility and accountability. A judge who can't say why a delivery was marked down is hard to trust, and a speaker who can't see where it slipped has nothing to practice. We also kept coming back to a distinction: being inspired by someone's speech is entirely different from copying it. Learning from a great delivery means understanding what made it work, not reproducing it beat for beat.

So Arachne uses a reference recording of the same words as a yardstick, not a template to imitate. It shows where a performance measurably differs, and it keeps the judgment with the person: every finding is evidence tied to a measurement and a rule, never a verdict.

What it does

Arachne takes a speech recording and its transcript, aligns the words to the audio, and compares the performance with a documented reference for the same text. It then:

  • measures pacing, pause placement and duration, and a relative energy (or pitch) contour,
  • marks time-bounded regions where the delivery deviates from the reference,
  • maps each deviation to an explicit rubric rule and a score, and
  • shows everything in an interactive dashboard: audio playback, transcript, time-series overlays, and an explanation card for each flag.

Every explanation names the measured feature, both values, the time span and the rubric rule behind it. A deviation is evidence for a rubric finding. It is not proof that the delivery was wrong or why it happened, and a delivery that differs from the reference is not automatically worse. Arachne returns "insufficient evidence" when the alignment, audio quality or reference coverage isn't good enough.

How we built it

Dataset. Three public-domain US speeches (Gettysburg Address, Second Inaugural, FDR First Inaugural). For each text we built 21 items: near-perfect mirrors, six single-factor flaw families (fast/slow pace, excess/missing pauses, flat pitch, quiet energy) at three severities, and a three-flaw combination. Audio is synthetic (espeak-ng) so ground-truth flaw spans are exact by construction. Each item keeps its source text, transformation settings and span labels. Real recordings and human-reviewed labels are the main next step.

Features. Words are forced-aligned to the audio, then we extract word timings, pauses and energy in dB. To compare different speakers fairly, pitch is expressed relative to each speaker's own median:

$$\mathrm{st}(t) = 12\,\log_2!\left(\frac{f_0(t)}{\tilde f_0}\right)$$

Scoring. Scoring is deterministic and rule-based, with no language model in the scoring path. We compare each participant against the reference using robust z-scores, with the spread estimated from calibration pairs of near-perfect reads:

$$z = \frac{\Delta - \tilde{\Delta}{\mathrm{cal}}}{1.4826\cdot \mathrm{MAD}{\mathrm{cal}}}$$

Same input and same pinned configuration give the same output.

Evaluation. We compare predicted regions with reviewed ground-truth spans using intersection-over-union and start/end boundary error, and we report missed and false-positive regions:

$$\mathrm{IoU}=\frac{|P\cap G|}{|P\cup G|}$$

Dashboard. An interactive React/Vite plus FastAPI app with Plotly time-series overlays, synchronized audio playback and transcript highlighting, and a limits panel that shows what is and isn't measured.

Tech stack

Layer What we used
Language and data Python; WAV audio (16 kHz mono for analysis, originals kept); plain-text transcripts; JSON manifests and feature/score files with versioned schemas; YAML configuration with a config hash
Alignment WhisperX forced alignment against the supplied transcript, with a flagged fallback when alignment fails
Features Word durations and local speaking rate, pause intervals, energy contour in dB, voicing; F0 in semitones relative to the speaker's median and MFCC/spectral features where used; numpy and scipy for processing; ffmpeg for decoding uploads
Dataset tooling Scripted, seeded audio edits for Tier 1 flaws (time, gain and silence edits); human re-recordings for Tier 2; reviewed span labels; public-domain and rights-checked sources such as the Miller Center collection
Scoring Median and MAD robust z-scores; versioned rubric rules; template-based explanations; evaluation by IoU, boundary error, precision and recall, and severity ordering
App React with Vite, Plotly via react-plotly.js for time-series overlays, wavesurfer.js for playback and flaw regions
Reproducibility Pinned dependencies and configuration; repeat-run tests; fresh-clone verification
Delivery GitHub repository and README; public dataset link (GitHub or Google Drive); six-page technical document; YouTube demo; Devpost
Design Inter and Instrument Serif (italic) typography; a black, white and single-icy-accent visual system shared by the landing page spec and the dashboard theme; hand-coded HTML/CSS/vanilla JS for the landing page; Mermaid for architecture and workflow diagrams

Challenges we ran into

  • No natural spread for a z-score. With one reference per speech there is no distribution to scale against, so we estimated it from near-perfect re-reads instead of the participant's own deltas.
  • Different speakers and microphones. Raw pitch and loudness differ between people and recordings, so we normalized relative to each speaker and recording.
  • Rights and reuse. Each source recording and its transcript needed its own check, and anything uncertain stayed out of the dataset.
  • Public audio isn't clean. Old or noisy recordings hurt alignment and pitch tracking, so we chose cleaner sources and flag low-confidence regions instead of hiding them.
  • Reference is a yardstick, not a goal. Matching the reference is not the same as speaking well, so Arachne reports measured differences and never claims a deviation is objectively wrong.
  • Honest claims. We avoid claiming millisecond accuracy, and we report small-sample results as a prototype evaluation.
  • Twelve days, four people. We kept the scope small (three speeches, three delivery dimensions) and protected review quality and integration time.

Results

Setup. Synthetic dev dataset (63 items, 3 speeches × 21) with ground-truth spans that are exact by construction, not human-reviewed. Predicted regions are matched one-to-one to ground-truth spans of the same dimension by IoU (greedy, highest IoU first). We report recall at IoU 0.3 and 0.5, mean IoU of matches, mean absolute start/end error, false-positive regions, flags on near-perfect mirrors, and whether the dimension score falls as severity rises. Thresholds were set on one dev speech (Gettysburg). Second Inaugural and FDR 1933 were held out and not used for tuning.

Held-out: 2 speeches, 42 items

Dimension GT spans [email protected] [email protected] Mean IoU Start err (s) End err (s)
Pacing 14 0.857 0.857 0.919 0.174 0.113
Pauses 20 1.000 1.000 0.952 0.012 0.012
Pitch contour 8 0.875 0.875 0.663 0.808 0.645
Energy 6 1.000 0.833 0.886 0.284 0.239

4 false-positive regions. 0 flags on 4 near-perfect mirrors. Severity ordering correct in 12/12 series.

All 63 items

Dimension GT spans [email protected] [email protected] Mean IoU
Pacing 21 0.905 0.857 0.894
Pauses 30 1.000 1.000 0.951
Pitch contour 12 0.833 0.833 0.657
Energy 9 1.000 0.889 0.921

5 false-positive regions. 0 flags on 6 near-perfect mirrors. Severity ordering correct in 18/18 series.

Stress test (Gettysburg, 21 items, each recording perturbed and re-analyzed)

Variant FP regions [email protected] (pace / pause / pitch / energy)
Clean 1 1.00 / 1.00 / 0.75 / 1.00
MP3 48 kbps → 44.1 kHz 1 1.00 / 1.00 / 0.75 / 1.00
+3 s lead/trail silence 1 1.00 / 1.00 / 0.75 / 1.00
Noise 30 dB SNR 5 1.00 / 0.80 / 0.75 / 1.00
Noise 20 dB SNR 42 0.57 / 0.40 / 0.75 / 0.67
Noise 10 dB SNR 27 0.71 / 0.60 / 1.00 / 0.67

Failures and limits (reported, not hidden)

  • Pause and energy flaws are located almost exactly. Pitch boundaries are loose (about 0.7 s) because the detector uses a 5-word window.
  • The mildest pitch flattening (60% compression) was missed on the dev speech.
  • Results survive MP3 compression, resampling and added silence, but not additive noise: at 20 dB SNR, false positives rise from 1 to 42 and pause recall falls from 1.00 to 0.40.
  • Our SNR estimate only warned near 10 dB and never returned "insufficient evidence", so noisy recordings still received scores. This is our top planned fix.
  • With 21 items per run, differences between noise levels (e.g. 10 dB looking better than 20 dB) are measurement noise, not a trend.
  • These numbers show pipeline behaviour on controlled, noise-free, single-factor synthetic audio. They are not accuracy on human speech, and real recordings will be harder.

Reproduce with make evaluate and make stress. Raw outputs are in results/evaluation.json and results/stress.md.

What we learned

Defining the rubric before generating data made everything downstream clearer. Matched-text comparison removes a lot of noise. Explanations people can trust come from showing the measurement and the rule, not just a score. And a small, carefully reviewed dataset taught us more than a large messy one would have.

The team: Kelambakkam Atti

Member Role Focus
Ammar Data lead Source speeches, rights checks, paired reference and flawed recordings, annotation and labels
Abdul Signal lead Alignment, preprocessing, normalization, feature extraction, repeatable pipeline
Rihan Grounding and scoring lead Rubric, deviation model, flaw-region detection, explanations, evaluation
Fadil Dashboard and delivery lead Dashboard, integration, README, technical document, demo video, Devpost submission

Each of us owned our own part, and everybody also worked in every department to help the others out: recording and reviewing data, testing the pipeline, checking scoring output, and polishing the dashboard and submission. The project came together because everyone did their own part and then helped the rest finish theirs.

AI assistance

We used Cursor, Gemini, ChatGPT and Claude, all on free plans. AI-assisted parts of the project:

  • Planning: breaking the project into workstreams, schedule and gates, and drafting the role process files.
  • Feasibility checks: testing whether scope, tools and timelines were realistic for twelve days.
  • Cross-validation: a second look at our rubric logic, scoring method, evaluation approach and submission checklist, and spotting gaps and contradictions in our plan.
  • Design help: the visual design spec, copy, and the architecture and workflow diagrams.
  • Coding assistance: things like debugging and documentation drafts were done using Claude, Cursor, Gemini and ChatGPT. All AI-written code was run and reviewed by a teammate.
  • Writing: drafts of documentation, the project story and the pitch, which the team edited.

Dataset recordings, label review, rubric decisions and the evaluation results are ours, and every AI suggestion was checked by a teammate before we used it.

What's next

More speakers and recording conditions, more delivery dimensions, a larger reviewed dataset, and a stronger calibration of the thresholds.

Built With

Share this project:

Updates

posted an update —

I was the Audio and Features lead. I built the signal-processing pipeline: audio decoding and validation (16 kHz mono, clear error codes for short, silent or mismatched input), word-level alignment with a deterministic fallback aligner and an optional WhisperX backend, and feature extraction (energy in dB, F0 via Praat autocorrelation, pitch in semitones relative to the speaker median, per-word and pause features). I made the normalization speaker-relative so comparisons don't rely on raw cross-speaker pitch or loudness, and I checked that the same input and config give the same output.

posted an update —

I was the Scoring and Grounding lead. I defined the rubric rules (pacing, pauses, pitch contour, energy), each with a feature, normalization, window, threshold and feedback template, and built the robust z-score (MAD-based) comparison that finds time-bounded deviation regions. I wrote the template explanations that name the measurement, the comparison, the time span and the rule ID, and the scoring that returns "insufficient evidence" rather than guessing. I also built the evaluation: IoU, boundary error, false positives and severity ordering on held-out speeches, plus a noise and compression stress test, and reported the failures honestly.

posted an update —

I was the Dataset and Annotation lead. I selected three public-domain US speech excerpts (Gettysburg Address, Second Inaugural, FDR First Inaugural) and built the contrastive dataset: for each text, 21 items covering near-perfect mirrors, six single-factor flaw families (fast and slow pace, excess and missing pauses, flat pitch, quiet energy) at three severities, and a three-flaw combination. I defined the dataset schema, stable item IDs, provenance fields and exact ground-truth flaw spans, and documented the dataset and its limits. I kept the held-out speeches separate from threshold calibration so the evaluation stays honest.

posted an update —

I was the Dashboard and Delivery lead for Arachne. I designed and built the React dashboard that lets a user upload a recording, pick a same-text reference, and see the analysis: audio playback, transcript, time-series comparison against the reference, flagged regions, and an explanation card showing the measurement and rubric rule behind each flag. I also wrote the project documentation (README, setup and run steps, dataset access, limitations), planned and recorded the demo video, and managed the Devpost submission, including the AI-assistance disclosure. I worked with the team to agree the API schema so the dashboard reads the real pipeline output rather than mock data. Parts of the code and documentation were written with AI coding assistants, as disclosed in the README.

Submission history