How is a phoneme recognizer different from ordinary speech-to-text?
sayit runs two different models for two different jobs: one guesses the words you probably meant, the other reports the raw sounds you actually made.
A phoneme recognizer and ordinary speech-to-text solve different problems, even though they both start from the same audio. Speech-to-text (ASR) is optimized to guess the most likely sentence a native listener would assume you meant. A phoneme recognizer has no language model at all — it reports which sound it heard in each stretch of audio, with no notion of what word that sound is supposed to belong to. That distinction is the entire reason pronunciation scoring is possible.
30-second version: sayit runs two separate models. faster-whisper, a normal ASR model, turns your speech into words with timestamps — the same job dictation software does. A wav2vec2 phoneme model, with no language model attached, separately reports the raw sounds frame by frame. Scoring compares that second, honest stream against the phonemes your target word should contain. In reference (read-aloud) mode sayit usually skips ASR entirely, since it already knows the words you're reading.
Why does a language model break pronunciation scoring?
An ASR system's whole job is disambiguation: given noisy audio, output the sentence a fluent listener would understand. That is exactly the right goal for dictation, subtitles, or a voice assistant. It is the wrong goal for scoring pronunciation, because the model is trained to silently repair the very errors you need it to catch. Say "I sink so" and a strong ASR model will often still transcribe "I think so," because that is overwhelmingly the intended sentence in English. The transcript looks perfect. Your /θ/-to-/s/ substitution — the actual mistake — never reaches the screen.
What does a phoneme recognizer report instead?
sayit's phoneme model — a wav2vec2 CTC network — is asked a narrower, more honest question for every slice of audio: "which of the 44-ish sounds of English was this?" It has no sentence-level context to lean on, so it can't smooth an unusual sound into the word a listener would have expected. If you produced /s/ where /θ/ belonged, that is what comes back. This is the raw material every downstream score is built from — see how the phoneme recognizer's output turns into a score.
So why does sayit use ASR at all?
Timing and, in freeform speech, word identity. In freeform mode — answering a question with your own words rather than reading a passage — sayit needs to know what words you actually said before it can look up which phonemes each one should contain, and faster-whisper supplies that transcript along with word-level timestamps. In reference (read-aloud) mode, sayit already knows the text you're reading, so by default it skips Whisper entirely and derives word timing straight from the phoneme timeline instead — the pronunciation scores come out identical, for a real drop in compute per take. The read-aloud versus freeform article covers when each mode applies.
Side by side
| Speech-to-text (ASR) | Phoneme recognizer | |
|---|---|---|
| Trained to | Guess the most likely sentence | Report the sound in each audio slice |
| Language model | Yes — pulls ambiguous audio toward real words | None |
| A mispronounced word | Often silently corrected in the output | Reported as the sound actually produced |
| What sayit uses it for | Transcribing freeform speech, timing | Every phoneme-level accuracy and verdict |
Does this mean transcripts are useless?
No — they're the right tool for what they do. sayit still uses the ASR transcript for freeform mode, for the words shown in your take, and for detecting fillers like "um" and "like." What it never does is use the transcript as the pronunciation judge. The judgment comes from the phoneme stream, which is why a word can show up correctly transcribed and still be marked check if the sounds inside it were wrong.
What this catches that a transcript-matching app misses
Picture two learners reading the same sentence. One says every word slightly oddly but stays inside each phoneme's territory — a phoneme recognizer scores them clear, correctly. The other nails eight words and merges a ninth into a different real word ("this" said as "dis") — a transcript-matching app might not even notice, because "dis" isn't a word ASR would print; it gets auto-corrected to "this" and scored as if nothing happened. The phoneme stream doesn't get to auto-correct anything. It just reports what it heard.
Try it
Read a sentence with one deliberate wrong sound in sayit — for example, saying "think" as "sink." A transcript-matching tool would congratulate you. sayit's phoneme recognizer will flag exactly that word and show you /θ/ next to the /s/ it actually heard. The full three-pass pipeline is on the features page.
Hear exactly which sounds to fix.
Say one sentence and get sound-by-sound feedback in seconds. No install, no card.