How to transcribe audio to text
The mechanics take about a minute to learn and every page on this subject covers them. What almost none of them cover is the part that decides whether the transcript is usable — and that is your recording, not your choice of tool.
The short version
- 1. Get it into a file. A video works as well as an audio file — only the audio track is read. Anything your browser can decode is fine: MP3, WAV, M4A, FLAC, OGG, MP4, MOV.
- 2. Decide where the model runs. On your machine or on someone else's. That is now a genuine choice rather than a compromise, and it is the section below.
- 3. Tell it the language. Do not leave this on automatic. It is the single most common way a browser transcript comes back wrong, and it costs one dropdown to avoid.
- 4. Run it, then read it against the audio. Skim with the recording playing. You are hunting for confident errors, not obvious ones.
- 5. Export the shape you need. Plain text to paste, SRT or VTT for subtitles, JSON if something downstream needs the timestamps.
Everything after this is why step 4 exists, and what to do when the answer is bad.
Your recording decides the transcript
Nobody can tell you how accurate transcription will be on your file, and a number on a landing page is a number from clean read speech in a quiet room. The people who built the model are the most candid about this: OpenAI's model card for Whisper states that the models "perform unevenly across languages", that there is "disparate performance on different accents and dialects", and that this "may include a higher word error rate across speakers of different genders, races, ages, or other demographic criteria".
In rough order of how much difference it makes to a real recording:
- Microphone distance. One phone in the middle of a table with six people around it is the most common cause of a bad transcript there is. Moving the recorder closer to whoever is talking beats every other intervention, including changing model, and it is the one thing you cannot fix afterwards.
- Two people talking at once. Speech models transcribe a single stream. Overlapping speech does not come back as two lines; it comes back as one of the voices, or as a blend of both that reads as a strange sentence.
- Names, jargon and acronyms. The model predicts likely word sequences, so an unfamiliar surname or product name is replaced by a common word that sounds similar. These are the errors worth hunting: they are fluent, they are confidently wrong, and they survive a casual read.
- Silence, music and room tone. Whisper generates text whether or not there is speech to generate it from. Its model card warns that "the predictions may include texts that are not actually spoken in the audio input". A clean, plausible paragraph sitting over a stretch of near-silence is the signature of this.
- Accent and language, per the model card above — and more sharply on the smaller models, which is the trade in the table further down.
Pin the language. Do not leave it on automatic.
This deserves its own heading because it is specific, it is invisible, and it wrecks a transcript completely rather than partially.
Transformers.js — the library that runs Whisper in a browser, ours included — has never implemented language detection. Give it audio without naming a language and it does not guess: it assumes English. German audio then comes back as English words that sound vaguely like the German, which is not a slightly worse transcript, it is a useless one. Our transcriber pins a real language for exactly this reason rather than offering an "Auto" option that would quietly lie.
Even where detection is implemented, the smaller Whisper models mis-detect on short or noisy openings, and will sometimes translate to English instead of transcribing. If your transcript is in the wrong language, or is suspiciously fluent English from a non-English speaker, this is why.
Where the audio goes is now a real choice
Transcription meant uploading for a decade, and that was a cost constraint rather than a design preference: running a speech model costs GPU-minutes, GPU-minutes cost money, so services meter you — and metering needs an account, and an account needs your file. The free tier with a cap exists because of arithmetic, not generosity.
A browser can now load the model instead. What each side actually costs you:
| In a cloud service | On your device | |
|---|---|---|
| Your recording | Leaves your machine | Never uploaded |
| Cost per hour of audio | Metered, or capped on a free tier | Nothing, and uncapped |
| Waiting | Upload time, then a queue | Your own hardware, alone |
| Model size | Whatever they can afford to run | Whatever your device can hold |
| Offline | No | Yes, once the model is cached |
The fourth row is the one to be honest about, and it cuts against us. A hosted service can run a model far larger than anything that will download into a browser tab, and on genuinely hard audio — heavy accents, crosstalk, a bad room — the biggest cloud models can still beat a local one. What you pay for that is the upload and the meter. On ordinary speech the gap is not the thing that decides your transcript; the microphone is.
Bigger model, better transcript, longer wait
Whisper comes in sizes, and picking one is a real trade rather than a preference. These are the three the transcriber here offers, with the download you pay once and the browser caches:
| Model | Download | Languages | Use it when |
|---|---|---|---|
| Standard (whisper-base) | ~80 MB | ~99 | Default, and the only sensible one on a phone |
| Fast (distil-small.en) | ~120 MB | English only | English audio, and you want it done |
| Quality (whisper-small) | ~250 MB | ~99 | A desktop with a working GPU |
The reason the biggest model is not simply the default is speed, and here is the one timing we have measured ourselves rather than repeated: on a flagship OnePlus 13, whisper-small runs at about 0.85× real time — meaning an hour of audio takes rather more than an hour. Phones mostly fall back to WebAssembly, and there this site runs on a single thread on purpose: the browser mode that unlocks multi-threaded WebAssembly, cross-origin isolation, also breaks the ad frames that pay for the tool being free. So phones get the smaller model regardless of how much memory they claim to have.
Speeds quoted as a multiple of real time are worth reading twice, including in our own documents: some sources mean "×4 means four times faster than the recording" and some mean the opposite. Above, and in the transcriber's own readout, above 1 is faster than real time.
"Who spoke" is a second, harder problem
Transcription asks what was said. Diarization asks how many voices are in the room and which one said each stretch — without being told the number of speakers in advance. They are different problems and the second one is not close to solved.
It is worth knowing roughly how it works, because that explains exactly when it fails. Our pipeline runs two models. A segmentation model finds where there is speech at all — and only that: we tried using its own per-window speaker slots for the separation and they proved unreliable, lumping two back-to-back speakers into one. The separation instead comes from a speaker-embedding model, which turns three seconds of voice into a vector; those vectors are clustered, and a cluster becomes a speaker. In our spike, two windows of the same voice landed around 0.40 cosine distance apart and two different voices around 0.80. That gap is the whole mechanism.
Which tells you where it breaks. Crosstalk puts two voices inside one window and lands the vector in between. A speaker who says three words never gets a stable window at all. Two similar voices through one bad microphone narrow the gap until the clustering cannot see it. On a chaired meeting with a decent recording it holds up; on a pub conversation it will not.
Why transcripts go wrong every thirty seconds
Whisper sees thirty seconds at a time. That is fixed by the model, so anything longer is cut into pieces, and the joins are where words get lost or repeated — a sentence severed mid-clause loses the context that would have disambiguated it.
The fix is overlap. Ours advances 25 seconds at a time so consecutive windows share five seconds, then cuts the duplicate at the midline of that overlap: each window keeps the segments whose midpoint falls on its side. Nothing is emitted twice and nothing is dropped. If a transcript you got somewhere else duplicates or swallows a few words at suspiciously regular intervals, this is the thing that was not done.
Transcribe it here
The transcriber on this site runs Whisper in your browser — timestamps, optional speaker labels, and TXT, SRT, VTT, DOCX or JSON out. Your files are never uploaded — everything runs on your device. It is free and uncapped because it costs us nothing per minute: your hardware does the work.
- A recording of a meeting. Meeting transcription, or meeting notes if you want decisions and actions rather than every word.
- A video. Video to text, or the subtitle generator if you need SRT with the timings intact.
- A podcast or an interview. Podcast to text — and the summarizer afterwards, if an hour of transcript is more than you wanted.
- A voice memo off your phone. Voice memo to text.
Questions
- How do I transcribe audio to text for free?
- Run the speech model on your own computer instead of someone else’s. A browser can now load Whisper — the open speech model most transcription services are built on — and transcribe locally, which costs nobody anything per minute and therefore has nothing to meter. The trade is a one-time model download of roughly 80 to 250 MB and your own hardware doing the work.
- How accurate is AI transcription?
- There is no honest single number, and a site quoting one is quoting a marketing figure measured on clean read speech. Accuracy on your file is decided mostly by your recording: how close the microphone was, whether people talked over each other, and how many names and technical terms it contains. OpenAI’s own model card for Whisper says the models “perform unevenly across languages” and show “disparate performance on different accents and dialects”. Treat every transcript as a draft to check.
- Can I transcribe audio without uploading it?
- Yes, and that is now the ordinary way rather than the exotic one. The model runs inside the browser tab, the audio is decoded and transcribed on your machine, and nothing is sent anywhere. After the first load caches the model it works with the network off — which is the easiest way to prove to yourself that no upload is happening.
- Why does the transcript contain sentences nobody said?
- Whisper predicts the most likely next word, so it produces text even when there is nothing to transcribe. Silence, music, room tone and applause are where it invents most; the model card calls this out directly, warning that “the predictions may include texts that are not actually spoken in the audio input”. Passages of clean, fluent, plausible text over a stretch of near-silence are the signature.
- Should I let it detect the language automatically?
- No — set it. Auto-detection is the largest avoidable failure in browser transcription: the library our engine uses has never implemented it, so audio submitted without a language is assumed to be English and non-English speech comes back as garbled English. Even where detection works, smaller Whisper models sometimes mis-detect, or quietly translate to English instead of transcribing. It is one dropdown.
- Can it tell me who spoke?
- Sometimes, and it is a separate and harder job than transcription. Working out how many voices are present and which one said each stretch — diarization — has to be done without being told the number of speakers. It holds up on a chaired conversation with a decent microphone and degrades on crosstalk, on someone who says three words, and on two similar voices recorded badly.
- How long does transcription take?
- It depends entirely on your hardware, which is the honest answer and not an evasive one. The same file can transcribe several times faster than real time on a desktop GPU and slower than real time on a phone falling back to WebAssembly. What is fixed is that nothing is queued behind other people’s jobs and nothing is capped.
Quoted limitations are from OpenAI's published model card for Whisper. Model downloads, the
thirty-second window and five-second overlap, the diarization pipeline and its measured cosine
distances, and the 0.85× real-time figure for whisper-small on a OnePlus 13 are all from our
own engine, which is open source: see models.ts, windows.ts,
diarize.ts and backends.ts. There is deliberately no word error rate
on this page, and no general speed claim beyond that one phone measurement: we have not run
those benchmarks, and the figures circulating elsewhere describe a Whisper far larger than
anything that downloads into a browser tab.