How good is it?
This is a small model, and it makes mistakes. It is Whisper tiny.en, the smallest of OpenAI's speech models: 39 million parameters, stored here with 8-bit weights so it fits in a 54.7 MB download. Its model card reports a word error rate of 8.4% on clearly read audiobook speech (LibriSpeech test-clean) and 14.9% on harder audiobook speech (test-other). In practice that means:
- Clear speech from one person close to the microphone (a voice memo, a dictated note, a read-aloud text) comes out mostly right: roughly one word in ten to twenty wrong, often small words or punctuation.
- Names, places, brands and jargon come out wrong, often as a similar-sounding ordinary word: a surname becomes a noun, a drug name becomes nonsense. The model only writes words it saw often in training. Check every name and number.
- Several people talking over each other, a phone call, a noisy room, music, or a strong accent make it much worse. It does not say who is speaking.
- It sometimes invents text: in long silences or music it can repeat the last sentence or write a phrase nobody said. Skim the transcript against the recording.
- English only. This is the English-only version of Whisper, chosen because at this size it is more accurate on English than the multilingual one. Speech in another language comes out as garbled English or an attempted translation, not a transcript.
A worked example from this site's own test: a LibriVox volunteer reading of the Gettysburg Address (1 minute 57 seconds, public domain, a clear male voice), transcribed by this page in headless Chrome on a server on 2026-09-27, took 20 seconds and got 11 of Lincoln's 268 words wrong: a word error rate of 4.1%. That is a best case, one careful reader and a famous text. Almost every mistake was a sound-alike: “Four score” came out as “For score”, “hallow” as “halo”, “those who here gave” as “those who hear gave”, “living and dead” as “living in dead”, “nor long remember” as “no longer remember”. A bigger model would do better; the next size up (base.en) is about twice the download and twice as slow, which is why this page uses the tiny one.
How it works
- Decode at 16 kHz. The browser's own decoder (Web Audio, in an
OfflineAudioContextat 16,000 samples a second, the rate Whisper was trained on) turns the file into samples. Stereo and multichannel files are mixed to mono. - Load the model, only when asked. Pressing Transcribe the first time adds one script to the page, which loads transformers.js and ONNX Runtime Web and then the model's files, all from this site: 54.7 MB in total, of which the WebAssembly runtime is 11.1 MB and the two model files 40.9 MB. Nothing is fetched before you press it. The browser's ordinary cache may keep the files for a later visit; the page itself stores nothing.
- Listen in 30-second windows. Whisper reads exactly 30 seconds at a time. A longer recording is cut into windows that overlap by 5 seconds on each side (so a new window starts every 20 seconds), and the overlapping text is merged so words at the joins are not lost or doubled. The progress bar counts windows.
- Timestamps. Whisper writes a start and end time for each phrase itself, to the nearest 0.02 s. They are good to about half a second, enough to find a line in the recording or to time subtitles, but they are not word-by-word.
How long it takes. It runs on one processor core in WebAssembly. On a recent laptop a minute of speech usually takes somewhere between a few seconds and half a minute; a phone takes several times longer, and the first run also waits for the download. The page does not use the graphics card.
What you can save
- TXT: the words alone, a new paragraph wherever the speaker paused for more than 1.5 seconds. Good for notes, a document, or pasting into an email.
- SRT (SubRip): numbered subtitle cues like
00:01:04,200 --> 00:01:07,900. Almost every video editor and player (VLC, Premiere, DaVinci Resolve, YouTube upload) accepts it. - VTT (WebVTT): the web's subtitle format, the one an HTML
<track>element plays. It uses a dot before the milliseconds instead of a comma, and starts with the lineWEBVTT.
Subtitle lines are as long as Whisper's phrases, which can run to 20 words or so. If you need short two-line subtitles, split the longer cues in your editor.
What happens to your recording
Opening a file gives this tab a private blob: address for it. Decoding, recognition and the saved text files all happen in the tab's memory, and Save downloads them like any other download. This page has no upload code and no server to upload to, and it uses no browser storage, so closing the tab forgets the audio and the transcript. The only requests it makes are for its own files on this site (the page, then the model when you press Transcribe) and an anonymous, cookie-free page-view count (GoatCounter) that never sees your audio or your text. This site's automated test checks that a whole transcription run makes no request to any other address.
What it cannot do
- No other languages, and no translation.
- No speaker labels ("Speaker 1:"), no word-by-word timing, no editing of the transcript on the page (open the TXT or SRT in any text editor).
- No live captions while you speak: record first, then transcribe.
- Memory: the page holds the audio as 16 kHz samples (about 4 MB per minute) plus the model (a few hundred MB while it runs). An hour-long recording works on a laptop; on a phone, keep it to a few minutes.
- It opens only what this browser can decode: Apple Lossless only in Safari, old AMR phone memos in almost no browser. Record or convert to something else first; the trimmer can save any sound it opens as WAV.
The software and the model
All of it is stored on this site and served from here; nothing is loaded from Hugging Face, a CDN or anyone else. The versions are pinned and their licences sit next to them in the site's /vendor/ folder.
- Whisper tiny.en, by OpenAI (weights released under the MIT licence; the Hugging Face model card lists Apache-2.0), converted to ONNX with 8-bit weights by Xenova (
Xenova/whisper-tiny.en): an encoder of 10.1 MB and a decoder of 30.7 MB, plus its 2.1 MB tokenizer. - transformers.js 3.8.1 (
@huggingface/transformers, Apache-2.0): the audio features, the tokenizer and the 30-second window logic. Configured so it can only read models from this site. - ONNX Runtime Web 1.22.0-dev.20250409 (
onnxruntime-web, MIT), the WebAssembly (CPU) build only: the part that runs the model.
What works where
| Needed for | Chrome / Edge | Firefox | Safari (Mac) | iOS Safari | Android Chrome | This browser |
|---|---|---|---|---|---|---|
Decoding and 16 kHz resampling (OfflineAudioContext) | 35 | 25 | 14.1 | 14.5 | 35 | … |
Running the model (WebAssembly in a module script) | 61 | 60 | 11 | 11 | 61 | … |
| Finding the runtime (import maps) | 89 | 108 | 16.4 | 16.4 | 89 | … |
Recording on the page (MediaRecorder) | 47 | 25 | 14.1 | 14 | 47 | … |
Version numbers are the first release with the feature, from MDN browser-compat-data (the same source as the trimmer's table), checked 2026-09-27; they are not test results. The “This browser” column asks the browser you are using now.
What has actually been tested
One browser: headless Chrome on Linux, driven by test/transcribe.test.cjs in this site's repository. It drops the Gettysburg Address recording on the page, checks that no model file is requested before Transcribe is pressed, transcribes it, compares the words with the text, and parses the saved SRT and VTT files (every cue numbered, well formed, times in order). Every request to another address is blocked and counted: there are none during the run. Firefox, Safari, phones, noisy recordings and accents have not been tested by machine.