The anchor wave · an instrument made of your own throat

The Chart Doesn’t Know How Big You Are

Hold one steady vowel. This page reports the two lowest resonances of your own vocal tract in hertz, with an interval it worked out by measuring its own misses on 180 signals whose answers it already knew. Then it puts you on the 1952 vowel space Peterson and Barney measured from 76 speakers at Bell Labs, where you may well land inside somebody else’s vowel.

A formant is a resonance of the tube between your glottis and your lips, and what a formant is is the subject of The Vowel in the Tube, one page over. This page starts later, at the hard part: getting the number out of an actual recording, knowing how wrong it is, and finding out that the number on its own barely identifies the vowel at all.

Before it measures you, it measures four things it already knows

Four recordings ship with this page. Each one is a source and filter vowel synthesised by research/vowel-space-formants/make-specimens.mjs: an impulse train at a fixed pitch, through a glottal tilt, through a cascade of two-pole resonators, through a lip radiation difference. The resonators’ poles are placed at frequencies we typed, so the true first and second formants of those files are exact integers rather than anyone’s measurement. Two vowel shapes, each at two pitches:

The estimator below receives three fields and nothing else: samples, a sample rate, and a duration. It is never told what it is looking at. The shipped recordings and your microphone reach it through the identical call.

waiting for the calibration to finish…

not run yet.

What a fake would do

The same four recordings, the same tolerances, run through an estimator that ignores its input and always returns the anchor’s value with a tiny error bar. This is not an argument that a constant would fail; it is the constant, failing, in front of you.

Here is what that slate does not prove, said plainly rather than left for someone to find. Four recordings cannot rule out an estimator that has simply memorised these two vowels: a two-entry lookup keyed on nothing but the zero-crossing rate passes all eight rows above, and this page’s verifier builds exactly that stub and shows it passing. What catches it is the next section, where the same code meets 180 shapes with 180 different answers, and the live gate, where Chromium’s microphone is replaced by a vowel that is on neither the slate nor that grid, at a pitch neither uses, and the number the page reports is checked against the poles that made it. Until 2026-08-17 the second half of that sentence was false here: both gate injections were the slate’s own two shapes at the slate’s own pitch, so the memorising lookup sailed through the gate as well. The injections are now two vowels the slate does not contain, and the verifier runs that same lookup against them and requires it to miss.

the one choice that moves everything

Linear prediction must be told how many poles to fit, and nothing in the signal tells you. This page uses twelve, which is twice the five formants expected below 5 kHz plus two, and that number was fixed before the page had a reader. Here is what the same four recordings say at five different orders. The truth never moves; only our choice does.

LPC order/ɑ/ 120 Hz/ɑ/ 250 Hz /i/ 120 Hz/i/ 250 Hz

Each cell is the error in F1 and F2, in hertz, against poles we placed. Order 12 is not the best of the five everywhere, and the page says so rather than pretending its default is optimal.

How wrong it is, and when

On the four recordings above, whose vowels are steady by construction, the frame-to-frame spread of this estimator is a fraction of a hertz. That number is not the error. Linear prediction fits a smooth envelope to a spectrum made of harmonics, and it is pulled toward whichever harmonic sits nearest a resonance, so at a high pitch the estimate can be tens of hertz wrong while being beautifully consistent about it. The statistic that looks like an error bar is not one.

So the page measures the error directly, in your browser, on load. It takes the corpus’s own thirty group and vowel centroids, resynthesises each of them at six pitches from 100 to 300 Hz with the formants set exactly, and runs the same estimator over all 180. The allowance below is the ninetieth percentile of the absolute error over the thirty shapes at each pitch.

building the calibration grid…

Every dot is one synthesised vowel whose true F1 we set: blue for a shape from the men’s means, pink from the women’s, green from the children’s. Height is how far this page’s estimate missed it. The gold line is the ninetieth percentile at each pitch, which is the allowance your own reading is given.
pitch (Hz)F1 allowanceF2 allowanceshapes

That curve is not a caveat paragraph. It is your error bar: the page reads the allowance off it at whatever pitch it measures in your voice, and hands a higher voice a wider interval, by a rule you have just watched it derive.

Now your own throat

Pick the vowel you are going to say, hold it steady for three seconds at a normal speaking pitch, and press the button. The audio is analysed inside this page. Nothing is uploaded, nothing is written to disk, and the samples are dropped as soon as the numbers are out.

This page will not tell you your accent, your dialect, your sex, your age or your size, and it has no machinery to. You say which vowel you meant; it reports hertz, an interval, and whether a chart from 1952 happens to agree with you.

the vowel you are about to say

the instrument has not armed yet.

F1

F2

F3

no interval; F3 is not calibrated here

pitch F0

from the same autocorrelation

the same three seconds, at five model orders

Linear prediction has to be told how many poles to fit. This page uses twelve. Here is what your own recording would have said under the other four, computed from the same buffer before it was dropped.

LPC orderyour F1your F2your F3what changed
no reading yet.

your kept vowels

what a partial vowel set is actually worth

The two spaces at the top of the ladder below are computed over a speaker’s whole inventory, and you are not going to give this page twenty tokens. So before it lets you into them, here is what they do at your sample size, measured by walking your own path over the 1952 rows: take a speaker, keep k of their vowels and one token of each, normalise using only those k, and classify each against centroids fitted on all 1520 rows. That is exactly what the page does with your tokens, with somebody else’s throat.

vowels keptraw hertzlog-mean z-scoresz, labels shuffled

The chart you are about to land on

Peterson and Barney recorded 76 people at Bell Telephone Laboratories saying ten vowels in an hVd frame, twice each, and measured F1, F2 and F3 off spectrograms by hand. Those 1520 measurements are the whole reference frame of this page, and they ship with it as data/pb52.json. The paper says who was in the room:

A total of 76 speakers, including 33 men, 28 women and 15 children, each recorded two lists of 10 words, making a total of 1520 recorded words.

Peterson & Barney (1952), pp.176–177. The sentence runs across the page break, which is why the count below is the authors’ own and not ours.

Recomputed from the raw rows shipped here, with no number transcribed: .

One thing to be exact about before any of it is used, because the difference turns out to be measurable rather than pedantic. What ships here is not the authors’ laboratory notebook; it is a transmission of it. The rows come from the phonTools package on CRAN, built in turn from tables bundled with Praat, whose own manual records that they were downloaded from a University of Pennsylvania FTP site and were reportedly based on a printed version supplied by Ignatius Mattingly. So this page says recomputed from the rows as distributed by Praat and phonTools, and never from Peterson and Barney’s raw data. The next section is where that distinction stops being a formality: the F1 and F2 columns reproduce the authors’ own printed table to within its rounding, and the F3 column measurably does not.

reproducing their printed table before reporting anything they did not print

Reading a fifty-year-old R data file with a parser written from scratch is exactly the kind of step that fails silently. So the page runs its own aggregation over the raw rows and compares every cell against Table II on page 183 of the paper, which the authors printed and we did not. The published values are rounded to 10 cycles per second, so they carry about ±5 Hz of their own.

groupvoweln F1 pubF1 oursΔ F2 pubF2 oursΔ F3 pubF3 oursΔ

Every dot on the chart below is one of those 1520 measurements. The gold rings are the ten centroids: the mean position of each vowel over all 76 speakers, in whichever space you choose. Your own kept vowels appear in white. Both axes run high to low, which is the phonetician’s convention and makes the picture roughly the shape of the inside of a mouth.

the space the chart is drawn in

What a vowel chart is actually worth

Here is the sophisticated dismissal this page exists to answer. A vowel chart is a solved thing. You measure F1 and F2 and read off the label. Peterson and Barney knew better and said so in the paper itself:

the difference between successive utterances of the same sound by the same individual is much less significant statistically than the difference between utterances of the same sound by different individuals

Peterson & Barney (1952), p.182

They did put a number on that, and it is worth being exact about which number, because this page had it wrong until 2026-08-17. The next two sentences of the same paragraph on p.182 read: An analysis of variance of the data in Fig. 7 shows that the differences between callings of pairs are not significant. However, the value for the variance ratio when comparing speakers is much larger than that corresponding to a 0.1 percent probability. So the between-speaker effect is quantified, as a variance ratio past a one-in-a-thousand probability. What is not in the paper is how often the position alone recovers the vowel, because in 1952 nobody could run seventy-six cross-validation folds. Their rows are right here, so the page runs them, in your browser, now. The exact procedure, so that the number means something:

spacecorrectof 1520 needswhat it computes

Raw F1 and F2 in hertz identify the vowel the speaker intended % of the time. Turning every speaker’s formants into z-scores against that speaker’s own vowel set takes it to %, a gap of points. That gap is not one thing. The first points of it are free: measure the distances between your own peaks instead of their absolute positions and you get there on a single vowel, with nothing but your own F0 to F3. The last points are the expensive ones, because a mean and a standard deviation do not exist on one point. To buy them you have to hand over your entire vowel space, one vowel at a time, which is a thing this page will actually make you do.

the classifier, which is the free choice this page used to name without measuring

and the choice about which vowels are in the room at all

We could not find that first number published, as of 2026-08-17. That is a statement about our search, not a claim of discovery, and it needs a warning attached to be worth anything. Published vowel-classification rates on this same 1952 data range from roughly the fifties to the high eighties, because a classification percentage is a property of the classifier, the features and the cross-validation as much as of the data. A linear discriminant is not a nearest centroid; ten-fold is not leave-one-speaker-out; F1 and F2 alone is not F0 to F3. Our number is not comparable to any of theirs, and theirs are not comparable to each other. What it is comparable to is the row below it in the same table, computed by the same code on the same rows five milliseconds later, which is the only comparison this page actually makes.

the control on the ladder

An accuracy that nobody has seen collapse is not an accuracy. Press this and every vowel label is shuffled among that speaker’s own twenty tokens, with a seeded permutation. Every real structure in the data survives: the same speakers, the same formants, the same ten labels in the same proportions. Only the link between a token and its label is broken, and with ten vowels the only honest answer is then 10.0%.

not run yet.

Every free choice this page made

None of these is forced by physics, and they do not all move the same number. The model order moves the reading this page takes off your own throat, which is why your reading is shown at five of them above. The classifier moves the ladder, and it turns out to move it further than anything else here, which is why it is measured under the ladder rather than described.

choiceset towhat it costs
working sample rate Resample whatever your device gives to 10 kHz, so five formants are expected below the 5 kHz Nyquist, and nothing above 5 kHz is ever reported. That is Praat’s setting for an average adult male voice; Praat’s own standard ceiling is 5500 Hz, which would resample to 11 kHz. This page reads women and children through the male setting, and a shorter tract than the setting assumes has resonances crowded above that line where this page cannot see them.
LPC order Twice the five expected formants, plus two. Fixed before this page had a reader, and the order every measured number on this page is taken at. The 1952 ladder is not one of them: it is computed from Peterson and Barney’s own hand-measured rows and never passes through this estimator at all. Order 12 is not the best of the five on every specimen: at order 10 the shipped /i/ token’s F2 comes back closer. Changing it after seeing a result would be choosing the instrument to fit the answer.
frame and hop 25 ms of signal per estimate. Shorter frames track a changing vowel better and resolve frequency worse, which is the trade The Window You Cannot Win is entirely about.
pre-emphasis Flattens the glottal source tilt so the fit spends its poles on the tract rather than on the slope. A different coefficient moves F1 by a few hertz.
voicing gate A frame is used only if its normalised autocorrelation peak clears this in the lag range for 80 to 400 Hz. Too low and breath gets measured as a vowel; too high and a creaky voice is refused. It is a test for periodicity and not for speech, which has a consequence listed below.
where a pole may be a formant Roots outside this band, or too heavily damped, are discarded. A genuine F1 below 90 Hz would be thrown away, which no human vowel has, but a rumbling air conditioner does.
refusal floor Fewer usable frames than this and the page reports what failed and plots nothing, rather than placing a dot it cannot support.
bootstrap The frame-to-frame spread of the median, seeded so it is the same number every time it is computed.
bias allowance A ninetieth percentile, so by construction three shapes in thirty are worse than it. The worst single miss in the grid is printed above for exactly that reason. A maximum would let one pathological shape set every reader’s error bar; a median would be an allowance half the shapes exceed.
calibration grid skips the bootstrap180 × 0 resamples The grid measures error, not spread, and never reads an interval. Running the bootstrap on it would add several seconds to page load for a number nothing uses.
refusal on instability Two floors, and only the first can see a vowel move. The bootstrap resamples the frames with replacement, so it says how well the median of this frame set is pinned down: an F1 walked from 270 to 730 Hz across three seconds pins down beautifully, and the bootstrap would have reported a confident number for a frequency the signal never held. Widening either until it swallowed the failure would be the dishonest option.
bark scale26.81 f / (1960 + f) − 0.53 An analytic formula rather than an interpolated table, so you can check it. The formula is printed rather than named because the paper it is usually cited from is paywalled and the arithmetic is not. It is also the plain form: end corrections of z + 0.15(2 − z) below 2 bark and z + 0.22(z − 20.1) above 20.1 bark are commonly used alongside it, and this page does not apply them. That is worth saying out loud rather than leaving for a later build to trip over, because the low branch fires below 204 Hz, which is not F1 or F2 territory but F0 territory, and F0 is exactly the term the three bark-difference rows are built from: it would fire on of the 1520 tokens. Applying both corrections , which is small enough to be a footnote and large enough to turn a check red if nobody had written this sentence.
classifiernearest centroid, squared Euclidean The simplest thing that can be stated in one line, and it puts no fitted covariance between you and the data. It is also the choice that moves the headline furthest, so it is the one free choice on this page that is measured rather than described: the same folds under a linear discriminant are computed and printed under the ladder above. Read the ladder down its own column and the comparison holds; carry 57.4 anywhere else and it does not.
where the extrinsic rows unlock 4 vowels for log-mean, 5 for z-scores Both floors are read off the partial-set table above rather than chosen. A mean and a standard deviation exist from two tokens onward, so any floor here is a judgement, and the measurement says a z-score built on four of your own vowels is worse than no transform at all.

What this instrument cannot do

The check

Every number above is computed in front of you, in this tab, from the shipped rows and the shipped recordings. Offline, node research/vowel-space-formants/verify-vowel-space-formants.mjs recomputes all of them from the sources and the equations, regenerates the four recordings and compares their sha256, re-derives the slate’s tolerances from the calibration rule, asserts the refusal paths fire, and string-matches the figures against the bytes of this page: 301/301 checks passed.

The recordings and the synthesiser that makes them are ours and are dedicated to the public domain under CC0 1.0. The 1520 measurement rows come from phonTools (CRAN, BSD 2 clause, copyright 2015 Santiago Barreda), itself built from tables bundled with Praat; the licence text ships beside the data at data/LICENCE. No third-party audio is shipped on this page at all. The Hillenbrand et al. (1995) recordings were considered and rejected: the only live mirror carries a permissive badge applied by the mirror’s owner over data described there as merely hosted with permission, which is a permission to that host and not a grant to anyone else.

sources


Built for the anchor wave, whose rule is that an instrument must recover a known answer before it may report yours. The kit that enforces it is at /_kit/anchor.js; the estimator, the synthesiser and the whole normalisation ladder are one file, formants.js, loaded unchanged by this page and by its verifier.