Three numbers that looked right and were wrong
Every pronunciation guide says the same thing: /θ/ is a voiceless dental fricative, put your tongue between your teeth, don't voice it. That sentence is not wrong. It is also not checkable — you cannot look at it and decide whether the advice worked, and neither can a student.
So I built a reference where every number is measured instead of asserted. English phoneme symbols each get a page, a forced aligner runs over synthesised speech, and the page reports what the audio actually did: duration in milliseconds, pitch, harmonics-to-noise ratio, and for connected speech, the energy drop in decibels at a word boundary. /θ/, for instance, comes out at 77 ms mean across 12 measured tokens, with a 50–120 ms range and 13.0 dB mean HNR.
The interesting part of that project was not the pipeline. It was the three places where a correct-looking number turned out to be worse than no number at all.
The pipeline, briefly
Twelve English sentences, synthesised by a TTS engine in four American voices — two male, two female — 22.05 kHz mono at 64 kbps. Each sentence goes through MMS_FA for forced alignment, which gives a start and end timestamp per phone. From each aligned segment we compute duration, F0 and HNR. Everything is recomputed at build time from the audio; nothing is typed in by hand, and there is no database of "known" values to drift away from the files.
That last property matters more than it sounds. If the numbers live in a table that is edited by hand, the audio files and the table can drift apart, and nothing in the build tells you which one is stale. Deriving them from the audio every time removes that failure mode instead of monitoring it.
Number one: the /s/ centroid that follows the vowel
The easiest way to separate /s/ from /ʃ/ is brightness. /s/ concentrates energy higher. So compute the spectral centroid, sort, done.
Except the centroid moves with the next vowel. The same /s/ measured 8466 Hz in sun and 5293 Hz in sock. Once you sort six minimal pairs by centroid, shun at 5887 Hz comes out above sock at 5293 Hz — one crossing, and the neat story collapses.
The fix was to stop using a summary statistic that the following vowel can drag around. Instead the page reports the share of energy above 6 kHz. On that measure the lowest /s/ is 49%, the highest /ʃ/ is 44%, and across all six pairs there is no overlap at all. The same six pairs, the same audio, two metrics — one produces a ranking with a hole in it, the other produces a clean separation.
Duration told a similar story: across all six pairs /ʃ/ is longer, with /s/ running 40–60 ms and /ʃ/ running 70–91 ms. That is a real cue, but it is not the one people teach first.
The point is not "use spectral share". It is that a metric which is easy to compute and easy to explain can still be the wrong metric, and you only find out by checking whether the ranking holds across every pair rather than the pair you happened to plot.
Number two: the 2 ms difference we refused to print
Elision guides say that -ing becomes -in' in casual speech. Fine. So measure it: 12 sentences, 6 pairs, full spelling against the apostrophe version, same four voices.
Target word length came out at 334 ms mean, range 262–383 ms. And the pair that motivated the whole page — something against somethin' — measured 383 ms against 381 ms. Two milliseconds.
Printing that would be worse than printing nothing. A reader sees "383 vs 381" and concludes there is no difference, which is false: the difference is in the transcription, not in the duration. So that cell is empty on the page, with a note explaining exactly this, and the measurement is still in the build output for anyone who wants it.
There was a second trap in the same experiment. When the target word sat at the end of the sentence, the aligner stretched its end time to the end of the clip — fishin' came out at 1252 ms, which is nonsense. Target words now sit mid-sentence. This is the kind of bug that never announces itself: the number is present, plausible-looking, and off by a factor of four.
You can see how both decisions are rendered on the elision page — the empty cells are marked as empty rather than filled with something adjacent.
Number three: formants on audio that cannot support them
Weak forms are the most obviously measurable thing in connected speech: a function word gets compressed, so its duration ratio against its strong form should drop. Measured ratios came out at 0.3–0.5, often 60–80 ms — which is three or four analysis frames at a 20 ms window. Tight, but usable.
Then I tried to add formants, because "the vowel centralises towards schwa" is the standard explanation and F1/F2 would show it. On 16 kHz conversational audio, twelve vowels measured in Praat, five came out clearly wrong: tell returned F1 1031 Hz and F2 1235 Hz where roughly 600 and 1800 Hz were expected. At a 20 ms frame there is not enough pitch information for a reliable formant estimate.
The honest conclusion was to drop the formant column for that audio rather than ship numbers that would look authoritative and be wrong a third of the time. The lesson generalises: when the recording cannot support a measurement, no amount of post-processing makes it support one. Changing the analysis method does not add information that was never captured.
What "measured" means for connected speech
Linking is where most guides switch from description to judgement: "these words are linked". That is not falsifiable either. What is measurable is the energy dip at the join.
For every word boundary we take the energy envelope in 5 ms windows with 2.5 ms steps, find the quietest point within ±60 ms of the boundary, and subtract it from the median energy inside the window. The result is a number in dB. A few from the linking page: -2.4 dB, -1.8 dB, -0.5 dB, and one at +0.7 dB where the "join" is louder than the surroundings — sentence medians run from 12.6 to 22.0 dB.
That single change — from a label to a measurement — makes the claim checkable. You can disagree with the threshold, but you can see what the audio did.
The part that is boring and decides whether it works
Every figure is recomputed on each build. Where a value cannot be measured, the cell stays empty and the page says why. The interface language and the target language are separate choices, so an English speaker reading about Spanish /θ/ and a Chinese speaker reading about it get different pages, not a machine translation of one page.
None of that is novel engineering. It is the ordinary discipline of not printing a number you cannot defend — which, for a reference site, turns out to be the whole product.
If you want to see the metric comparison that started this, the /s/ and /ʃ/ page shows both the centroid and the above-6 kHz share side by side, including the pair where the centroid ranks them the wrong way round.
All figures above are from the current build of Phoneme·Trick, a free pronunciation reference. Audio is synthesised, not recorded from learners — which limits what the numbers can claim, and the site says so wherever the numbers are documented.
Top comments (0)