How it works

Whisper in your browser: how the transcription runs

The page runs an open speech recognition model, Whisper, inside your browser tab, so your device does the work and your file is never uploaded. With your first file it downloads an engine and the model from this site, and your browser keeps the model for later files when it has room.

Three steps, all inside your browser

1. Your browser reads the file

Where the file can be read in slices, a worker in your tab takes the sound track 30 seconds at a time; otherwise the page decodes the whole file at once. Either way, the sound becomes the 16 kHz mono the model expects.

2. Whisper transcribes it in windows

The engine, whisper.cpp compiled to WebAssembly, transcribes about three minutes of sound at a time and hands each window's text to the page.

3. The page sets out the text

The words are grouped into paragraphs at pauses, with a timestamp for each if you want it, ready to search, copy, or save as TXT.

The model: Whisper, base or small

Whisper is a speech recognition model that OpenAI published in 2022 with its code and weights under the MIT license. It listens to 30 seconds of sound at a time and writes out the words, with a time for each segment. This site offers two sizes of it:

  • The smaller model (the default) is Whisper base in whisper.cpp's 5-bit quantization format (q5_1). It is the lighter download.
  • The larger model is Whisper small in the 8-bit format (q8_0): a bigger download that needs more memory.

Quantization rounds the model's weights to fewer bits, which makes the files smaller. How the two sizes compare on this engine, per language, is not published yet: we measure before we describe. The language menu lists the languages Whisper can be set to; with automatic detection, the engine picks the language in the first window that has speech and keeps it for the rest of the file.

The engine: whisper.cpp compiled to WebAssembly

The model runs in whisper.cpp, an open-source C/C++ version of Whisper, which we compile to WebAssembly (a program format every current browser can run) with a small interface of our own. There are three builds, and the page tries them in this order:

  • WebGPU, when your browser offers a graphics adapter with the features the engine needs. We have not measured this build on a real graphics card yet, so we make no claim about it.
  • WebAssembly on several threads, one per logical core your browser reports. Threads need the tab to be cross-origin isolated, which the site's headers provide.
  • WebAssembly on one thread, when threads are not available or your browser reports one logical core. It gives the same kind of result.

If a build fails to start, or the WebGPU build fails during a run, the page restarts the engine on the next build and carries on. The line above the transcript names the build that did the work.

What the page downloads, and when

Opening the page downloads only the page and its own files. The engine, the media reader, a model, and the voice detector come from this site when you add your first file. Only one engine build is kept: the WebGPU build takes the place of a CPU build when it starts with a GPU device. Sizes are in MB, where 1 MB is 1,000,000 bytes:

Files the transcription downloads from this site (sizes of the files as published)
FileSizeWhen
Engine, WebGPU buildabout 3.4 MBYour first file, tried first when your browser offers a usable WebGPU adapter
Engine, CPU build: multi-threaded or single-thread (one of the two)about 1.5 MBYour first file, unless the WebGPU build starts with a GPU device; and whenever the WebGPU build fails during a run
Smaller model (Whisper base, 5-bit format), the default59.7 MB in 3 partsYour first file with it
Larger model (Whisper small, 8-bit format)264.5 MB in 13 partsOnly if you choose it
Voice detector (Silero VAD)0.9 MBYour first file
Media reader (Mediabunny), part of the page's scriptsabout 0.3 MBYour first file

The models come in parts of at most 20 MiB (a MiB is 1,048,576 bytes, so 20 MiB is about 21 MB), because the host serves no single file over 25 MiB. Before the engine uses a part, your browser checks it against its SHA-256 fingerprint, so a damaged download is refused instead of producing a wrong transcript. The verified parts stay in your browser's Cache Storage when it has room for them, so your next file, and your next visit, skip the download.

Why your recording is never uploaded

Every step runs inside your tab, the site has no endpoint that could accept a file, and the page is allowed to connect only to this site. The check that your recording is not uploaded is on the privacy and security page, with the steps to watch the requests yourself.

Diagram of where your recording goes: your browser reads the file; where the file can be read in slices, a media reader in a worker decodes its sound 30 seconds at a time (otherwise the page decodes the whole file); the Whisper engine in WebAssembly transcribes it one window of about 3 minutes at a time; and your tab shows the paragraphs for you to copy or save as TXT. The recording is never sent to the site's server. The server sends the page, then with your first file the engine, the media reader, the model (about 60 MB for the smaller, default one, in parts), and a small voice detector; the browser keeps the model and the detector when it has room.
Your recording stays in your browser tab: the page, the engine, the media reader, the model, and the voice detector come in, and nothing from your file goes out.

How a long file is read and transcribed

A one-hour recording is about 115 MB of sound once it is decoded to 16 kHz mono (3,600 seconds x 16,000 samples x 2 bytes, or twice that as the 32-bit numbers the engine works with). So, where the file can be read in slices, the page does not decode the whole file at once. A second worker opens the file with Mediabunny and reads its sound track 30 seconds at a time: Mediabunny decodes compressed sound with your browser's own decoder, and uncompressed sound, as in a WAV file, itself. It hands over the next slice only when the engine is ready for it.

The slices are joined into windows of about three minutes. Each window ends in the middle of the quietest half second in the 15 seconds before the three-minute mark, to put the cut in a pause rather than inside a word, and the windows follow each other with no gap and no overlap. A small voice detector marks the stretches with speech in each window, so the model skips silence instead of writing words over it. Each window is transcribed with the last words before it, at most 200 characters, as a prompt, meant to give the model the sentence the cut may have split, and its times are placed back on the file's own clock.

When a window is done, its paragraphs appear on the page, so you can start reading and searching while the rest runs. When the file cannot be read in slices, because Mediabunny does not open its container or your browser has no decoder that reads its sound in slices, the page decodes the whole file at once with your browser's own decoder instead, without Mediabunny, and then refuses a file over 500 MB or longer than 1 hour.

Four steps from a long file to paragraphs: the sound track is read 30 seconds at a time as 16 kHz mono; the slices are joined into windows of about 3 minutes, each cut at the quietest half second; the voice detector skips silence and Whisper writes each window's words with their times; a pause of 2 seconds or more between two words starts a new paragraph, which can carry its time as [hh:mm:ss].
Wherever the browser can stream it, a long recording is not decoded all at once: it moves through the page one slice and one window at a time. The numbers are the engine's settings.

How the paragraphs and timestamps are made

Whisper returns segments of text with a start and an end time, and a time for each word. The page joins them into paragraphs: a new one starts at a pause of 2 seconds or more, measured from the times of the words on each side, and a paragraph that grows past about 600 characters ends at the next sentence end. There are no speaker labels, so a paragraph break marks a pause or a long stretch of speech, never a change of voice.

The timestamp of a paragraph is the time its first word starts, written as [hh:mm:ss] and rounded down to the second. It is approximate: good for finding a passage in the recording, not for subtitles. Copy text and Download TXT write the same paragraphs, with a blank line between them and the timestamps when they are shown.

Why the time varies

Your device does the work, on whichever build the page could start, so the same file takes a different time on a new laptop and on an old one, and the model and the length of the recording change it too. That is why the page promises no speed. Once the engine reports its first progress, the page measures how many seconds of work each second of sound takes on your device, smooths that over the windows so one slow moment does not swing it, and shows the time left.

What your device needs

  • A current browser with WebAssembly. Chrome, Edge, Firefox, and Safari all have it; our automated test runs in Chromium.
  • Free memory: the engine holds the model in memory while it runs, and the larger model needs more. We give no figure until we have measured it.
  • A connection on every visit: the page needs one to open, and your first file also downloads the engine and the model. There is no offline mode. When your browser has room, it keeps the model, so later files and visits skip that download.

The open-source components of the engine, the models, and the media reader are listed with their licenses on the credits page.

Questions about the engine

Is this the same Whisper that OpenAI published?

It is the same model: OpenAI released Whisper's code and weights under the MIT license. This page runs those weights in the file format of the open-source whisper.cpp project, quantized (stored with fewer bits per weight) so the download is smaller. The engine is whisper.cpp compiled to WebAssembly, not OpenAI's own Python code, and no request goes to OpenAI.

Does it use my graphics card?

It tries. When your browser offers WebGPU with the features the engine needs, the page downloads and starts the WebGPU build first. If that build registers no GPU device, fails to start, or fails during a run, the page downloads a CPU build and carries on with it. Our test machines have no usable GPU, so the real WebGPU build has never run on a GPU in our tests: the move to a CPU build is tested with simulated WebGPU failures, and on those machines the page goes straight to a CPU build. The line above the transcript names the build that ran.

Why did the model download again?

Your browser keeps the model in its Cache Storage for this site until you clear the site's data, or until the browser clears it to free space. After that, the next file downloads it again. What your browser keeps and how to remove it has the details.

What happens when I press Cancel?

The page stops the engine at once by closing the worker it runs in, and drops the paragraphs made so far. Your next file starts a fresh engine and takes the model from your browser's storage, where the browser kept it when it had room, so the model does not download again.

Sources

Try it on a recording

The transcription runs in your browser. Your file never leaves your device.

Open the transcription tool