Videos on social media are often played with the sound off, so a clip without subtitles tends to be scrolled past before it says anything. Writing those subtitles by hand is another matter entirely: you listen, you type, and then you line up the start and end of every caption to the second.
Adding subtitles to a video breaks into two jobs. First you turn the speech into text and produce a subtitle file, then you put that file onto the video itself. The first is transcription and the second is the actual subtitling.
Both jobs are usually assumed to require either installing an editor or uploading the video to a cloud service, and since I wanted to avoid both, I built tools that do the whole thing inside the browser.
This article walks through both of them, from transcription to burned-in subtitles, together with the processing times I measured myself.
- What you need: the video file, and a browser with WebGPU support
- What you do not need: an install, an account, an upload, or a payment
The two jobs, and the tools for them
There are three common ways to get subtitles onto a video: a cloud transcription service paired with a video editor, a command-line tool such as ffmpeg, or something that runs entirely in the browser.
Cloud + editor | ffmpeg | In the browser (this article) | |
|---|---|---|---|
Install | Editor required | Required | None |
File upload | Sent to the cloud | Stays local | Stays local |
Cost | Per use or monthly | Free | Free |
Time or count limits | Depends on the plan | None | None |
What you must learn | The editor | Commands and flags | Almost nothing |
I used to run Whisper locally through Python, and the accuracy was never the problem. What wore me down was that every change of machine meant another round of GPU drivers and dependencies, so it was never something I could reach for on a whim. I looked at paid cloud services and the official OpenAI API too, but the per-use cost and the fact that the audio leaves my machine both stopped me. Wanting to avoid those two things is exactly why I still do this inside the browser.
The two tools below are both ones I build and run myself.
- Transcription: Transcriber (transcriber.tools.ryusei.io)
- Subtitling: "Burn subtitles into video" on Media Tools (media.tools.ryusei.io)
Everything happens inside the browser in both of them, so neither the video nor the audio is ever sent anywhere, including to my own server.
What you need
- The video file you want subtitles on (MP4, MOV, WebM, MKV and so on)
- A current version of Chrome or Edge
- 8 GB of memory or more is comfortable
The browser has to support WebGPU, and both Chrome and Edge handle it without trouble. On a Mac, open Chrome or Edge rather than the built-in Safari.
Step 1: Transcribe the video and export an SRT
First you turn the speech into text and get a subtitle file (SRT). There is no need to extract the audio beforehand; hand it the video file and only the audio track inside is used.
- Open Transcriber in your browser.
- Pick a "Model" (covered below).
- Set "Language" to the language spoken in the video. Auto-detection works, but naming it explicitly is more stable when you already know.
- Turn "Speaker diarization" off. Left on, every line of the exported SRT is prefixed with a speaker name such as "Speaker A: ", and that prefix gets burned into the video along with the rest.
- Drag and drop the video file. There is no start button: transcription begins the moment the file is loaded, so make your settings first. Only the first time you use a given model is there a download to wait through.
- Correct the result on screen (covered below).
- Export it as "SRT (subtitles)" from the export row.
Which model to pick
Whisper comes in several sizes and Transcriber offers six of them. The common assumption is that a bigger model buys accuracy at the cost of speed. Measured, it turns out not to work that way.
Here are the numbers for a 4 minute 8 second, 51.9 MB video, transcribed in Chrome on a Windows machine with a GeForce RTX 2060 SUPER (8 GB). Every run used WebGPU.
Model | Size | Time | vs. real time |
|---|---|---|---|
Small | about 600 MB | 0m 35s | about 7.1x |
Medium | about 900 MB | 1m 22s | about 3.0x |
Large v3 Turbo | about 1.2 GB | 0m 37s | about 6.7x |
Large v3 | about 1.6 GB | 0m 52s | about 4.8x |
The slowest was not the largest model but the middle one. Large v3 Turbo came in more than twice as fast as Medium and nearly matched the smallest model, Small. That is because Large v3 Turbo keeps the same encoder as Large v3, the part that analyses the audio, and shrinks only the decoder that assembles the text.
At least across what I measured, there was no reason left to pick Medium. I use Large v3 Turbo, and Small is the practical choice on anything without WebGPU.
Names and other proper nouns still come out wrong even on Large v3, and changing models does not meaningfully help, so correcting the text yourself is faster than chasing accuracy.
Fixing misheard words and hallucinations
Two kinds of errors are worth going after. The first is the misheard proper noun, which you catch by reading. The second is hallucination: a sentence that was never spoken. In my own run, stretches with only music produced "Please subscribe to the channel." and "Thank you for watching." in exactly the same places no matter which model I used. Whisper was trained on a great deal of video audio, which is why silence and music are where this shows up.
Both can be fixed on the result screen before you export anything. When the same word is wrong in several places, "Find & replace" is the quickest route: matches are highlighted, and you can work through them one at a time with "Replace this one" or clear them in a single pass with "Replace all". Names and product names, which tend to recur, are dealt with in one go.
To edit a single line, hover over it and use the pencil icon. You can rewrite the text in place, and you can also split an overly long line in two, which is useful when a caption would otherwise run past the width of the screen. Deleting the text of a hallucinated line here removes it from the exported SRT as well, and every edit can be undone.
If you do leave speaker diarization on, you can click a speaker label to name it, merge two speakers that were split by mistake, or reassign an individual line. For subtitles you can leave it off, but for meeting minutes and interviews this is the part you want.
Step 2: Put the SRT onto the video
With the subtitle file in hand, the next job is putting it onto the video, and for that I use "Burn subtitles into video" on Media Tools.
- Open the tool page.
- Load the video file.
- Choose the SRT you saved in step 1 under "Subtitle file (SRT / WebVTT)".
- Pick "Burn into the picture" or "Add as a subtitle track" under "How to embed" (covered below).
- Adjust position, text size, color and legibility as needed.
- Run it, and the subtitled video is written out.
WebVTT is accepted alongside SRT, and the character encoding is detected automatically, covering UTF-8 as well as Shift_JIS, which is still common in Japanese subtitle files.
Burned in, or a subtitle track?
There are two ways to attach the subtitles: drawing the text into the picture itself, known as burning in or a hardsub, or shipping the subtitles alongside the video as a separate track, known as a softsub.
Burned in | Subtitle track | |
|---|---|---|
Can be toggled off | No | Yes |
On social media | Shows | Does not show |
iPhone default player | Shows | Does not show |
Output format | Same as the input | MKV only |
Re-encoding | Required | Not needed |
Here is what the same 4 minute 8 second, 51.9 MB video produced with each of them.
Method | Time | Output size |
|---|---|---|
Burned in | 125.4 s | 115.2 MB |
Subtitle track | 0.35 s | 51.9 MB |
The subtitle track copies the video and audio through untouched and simply packs the subtitles alongside them, which is why it finishes instantly. It can only be written as MKV, though, and the subtitles appear neither when posted to social media nor when played on an iPhone.
For anything going onto social media, burning in is the only real option. A subtitle track suits video you watch on your own PC or in a player like VLC, where being able to switch the subtitles off has value.
Position, size, color and legibility
The defaults read well on most footage, but here is what to change when they do not.
Setting | Default | When to change it |
|---|---|---|
Position | Bottom | Move it to "Top" when the footage already has text along the bottom |
Text size | 4.5% of video height | Raise it to 5-6% when the video will be watched on a phone |
Text color | White (#ffffff) | Yellow reads better over consistently bright footage |
Legibility | Black outline | Use "Translucent bar" when the background swings between light and dark |
I leave "Black outline" as it is, because an outline around the glyphs keeps them readable whether the background behind them is bright or dark.
When something goes wrong
Four things trip people up along the way. I know about them either first-hand or from the errors that show up in my processing statistics.
The text is garbled
UTF-8 and Shift_JIS are detected automatically, but nothing else is, so a file in an encoding such as EUC-JP has to be re-saved as UTF-8 in a text editor before it will load correctly.
The subtitles are out of sync
The tool uses the timestamps in the SRT exactly as written, so trimming the head off the video after transcribing shifts every caption early by that amount. Trim before you add subtitles, or rewrite the timestamps in the SRT.
The file gets bigger
Burning in draws the text into the picture and then re-encodes, so the result can be larger than the original; in my measurement a 51.9 MB video came out at 115.2 MB. The output bitrate is derived from the "Quality" setting rather than from the source video, which is why a well-compressed original shows the biggest jump. Drop "Quality" one step, or run the result through a video compression tool afterwards.
Processing stalls
Large videos can run the browser out of memory, so close the other tabs and try again, or split the video before processing it.
Frequently asked questions
Is all of this really free?
It is. Neither tool has a usage cap, a time limit, or a paid tier.
Do I need an account?
No account is needed. Both tools work by opening the page and loading a file, so you never even enter an email address.
Is my video or audio uploaded anywhere?
It is not. Transcription, subtitle rendering and re-encoding all happen inside the browser, so the only network traffic is the one-time download of the AI model used for transcription.
Is there a limit on video length?
Nothing in the design imposes one. Longer videos take more time and memory, though, so the practical limit comes down to your PC.
Can I do this on a phone?
Transcription runs on a phone with one of the smaller models, but burning in subtitles is heavy enough that a PC is the better choice.
Can I use this on commercial video?
You can. I place no restrictions on what you do with the files you export.
Summary
Adding subtitles to a video splits into transcription and subtitling, and both can be done entirely inside the browser, which means no install, no upload and no payment.
- Load the video into Transcriber and transcribe it with Large v3 Turbo
- Fix the misheard words and hallucinations in the exported SRT
- Load the SRT into Media Tools and burn the subtitles into the video
- Burn in for social media, or use a subtitle track when you want them to be switchable

Transcribe audio and video files in your browser. No account, no upload, and your audio never leaves your device. Completely free with no time or usage limits.

Burn SRT or WebVTT subtitles into your video so they show even where subtitle files are not supported. Position, size, color and outline are configurable. Processed in the browser; your video is never sent anywhere.
How to turn a recorded X (formerly Twitter) Space into text for free. From downloading the recording to separating speakers and exporting subtitle files, everything runs in the browser with no account and no install.


