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:
- Two shapes are the discrimination. An /ɑ/ at 730 and 1090 Hz, and an /i/ at 270 and 2290 Hz. Those are 460 and 1200 Hz apart, and no constant sits inside both tolerances, so an estimator that ignores what it is handed dies here.
- Two pitches are the harder test. The same poles said at 120 Hz and at 250 Hz share no harmonic and look nothing alike, while the correct answer does not move at all. A lookup table keyed on gross spectral shape survives the first test and fails this one.
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…
| pitch (Hz) | F1 allowance | F2 allowance | shapes |
|---|
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 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 order | your F1 | your F2 | your F3 | what 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 kept | raw hertz | log-mean | z-scores | z, 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.
…
| group | vowel | n | F1 pub | F1 ours | Δ | F2 pub | F2 ours | Δ | F3 pub | F3 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.
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:
- Which rows. All 1520. No token is dropped, no speaker is dropped, no outlier is trimmed.
- Which centroid. For each of the ten vowels, the arithmetic mean of every token of that vowel, in the chosen space.
- Which distance. Squared Euclidean in that space, on the plotted dimensions (two, or three where the space has three).
- How folds work. Leave one speaker out: for each of the 76 speakers in turn, fit the ten centroids on the other 75 and classify all twenty of that speaker’s tokens. Nobody is ever classified against a centroid their own voice helped build.
- How ties break. By the fixed vowel order i ɪ ɛ æ ɑ ɔ ʊ u ʌ ɝ, declared before anything ran. Ties do not occur in floating point here, but a percentage whose tie rule is unstated is a percentage with an unanswered question in it.
- Normalisation is inside the fold, per speaker. Each speaker is normalised using only their own twenty tokens, never the corpus mean. That is what makes the two extrinsic rows below cost something.
…
| space | correct | of 1520 | needs | what 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.
| choice | set to | what 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 bootstrap | 180 × 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 scale | 26.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. |
| classifier | nearest 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
- It cannot separate your throat from your microphone. A formant is the location of a spectral peak, and a smooth microphone response moves peak locations far less than it moves levels, which is why this works at all. But a resonant laptop chassis, a cheap headset or a sharp low cut can and does move F1. There is no calibration signal here and no way to remove it, so no absolute level is reported anywhere on this page, for any purpose.
- Your browser may be processing the sound before this page sees it. Echo cancellation, noise suppression and automatic gain are on by default in most browsers, and noise suppression is spectral: it moves formants. This page asks for all three off and then reads back what the track actually granted, and prints it with your reading, because a request that is not checked is not a setting.
- The reference frame is 76 people recorded at Bell Labs around 1950. The paper notes that most of its women and children grew up in the Middle Atlantic area while the men were a broader sample. If your vowel lands outside every 1952 region, the honest reading is that the frame is small and old, not that your mouth is wrong. This is why the page asks which vowel you meant instead of guessing.
- The voicing gate is a periodicity test, not a speech test. A frame passes if its normalised autocorrelation peak clears the threshold in the lag range for 80 to 400 Hz, and a whistle, a hum, a fan or any other strongly periodic machine tone clears it just as a vowel does. Fed a steady 1 kHz tone this page calls almost every frame voiced and reports a confident pair of numbers with no vocal tract anywhere in the signal. The only defence is that you know what you said.
- At a high pitch it is measurably biased, and the bias is worse in the tail than the allowance says. The grid above is the evidence, including the shape it misses worst.
- The one-vowel spaces can put you outside the frame they were fitted in, and they do it before the pitch warning fires. …
- F3 is reported without an interval because the calibration grid was built on F1 and F2 and we will not hand you a bar we did not measure.
- The listener-agreement figure often quoted for this paper is not here. The accessible scans of the relevant table did not read cleanly enough to trust, and this page’s spine does not need it, so it is left out rather than half-checked.
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
- Peterson, G. E. & Barney, H. L. (1952). Control Methods Used in a Study of the Vowels. J. Acoust. Soc. Am. 24(2):175–184. doi:10.1121/1.1906875. Read at source from the open-access copy at pure.mpg.de on 2026-08-17; both quotations above and the whole of Table II were taken from it.
- Lobanov, B. M. (1971). Classification of Russian Vowels Spoken by Different Speakers. J. Acoust. Soc. Am. 49(2B):606–608. doi:10.1121/1.1912396. Paywalled here; the z-score transform is written out on this page instead of being cited into.
- Syrdal, A. K. & Gopal, H. S. (1986). A perceptual model of vowel recognition based on the auditory representation of American English vowels. J. Acoust. Soc. Am. 79(4):1086–1100. doi:10.1121/1.393381. Paywalled here. The idea of normalising by bark differences is theirs; which two differences this page uses is this page’s choice, and both are shown.
- Traunmüller, H. (1990). Analytical expressions for the tonotopic sensory scale. J. Acoust. Soc. Am. 88(1):97–100. doi:10.1121/1.399849. Paywalled here; the bark formula this page computes is printed above.
- Hillenbrand, J., Getty, L. A., Clark, M. J. & Wheeler, K. (1995). Acoustic characteristics of American English vowels. J. Acoust. Soc. Am. 97(5):3099–3111. doi:10.1121/1.411872. Cited for the record; its audio is not cleared and is not shipped.
- Alku, P., Pohjalainen, J., Vainio, M., Laukkanen, A.-M. & Story, B. H. (2013). Formant frequency estimation of high-pitched vowels using weighted linear prediction. J. Acoust. Soc. Am. 134(2):1295–1313. doi:10.1121/1.4812756. Paywalled here; the high-pitch bias this page measures for itself is a known problem, and this is where the literature on it starts for anyone who wants to read further.
- All bibliographic fields above (authors, volume, issue, pages, year) were checked field by field against Crossref on 2026-08-17 rather than recalled.
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.