Generate video subtitles for free with Whisper on a Mac
Subtitling is the part of making a video that nobody enjoys. You listen, you type, you line up the timings, and it takes longer than the edit did.
Whisper does it for you. It runs on your own machine, it costs nothing, and it does not need an internet connection once it is set up. You hand it a video file and you get a subtitle file back.
Install
There are several ways to run Whisper. On a Mac, whisper-ctranslate2 is the least trouble — one command, and it is fast.
uv tool install whisper-ctranslate2
If you are not using uv, pip install whisper-ctranslate2 works the same way. uv just keeps it out of your other Python environments.
First run
Point it at the video. You do not need to extract the audio first.
whisper-ctranslate2 --model large-v3-turbo --language ko \ --output_format srt video.mp4
The first run downloads the model — about 1.5GB. Ours took 52 seconds including that download. After that it runs offline.
Set --language explicitly. Left to guess, it reads the opening seconds, and a quiet intro can send it to the wrong language entirely.
What you get
An .srt file appears next to your video. Plain text, opens in any editor.
1 00:00:00,000 --> 00:00:04,500 Text of the first line here. 2 00:00:05,120 --> 00:00:07,440 And the second.
That format uploads straight to YouTube and imports into every editor.
How long it takes
Measured on a Mac mini:
| Input | Time |
|---|---|
| 16.6 s of audio | 12 s |
| 12 s video clip | 12 s |
| First run (incl. 1.5GB download) | 52 s |
Faster than real time. A ten minute video finishes in under ten minutes. Start it and go do something else.
Do not drop to a smaller model
The temptation is to pick tiny or base and go faster.
For English you can get away with it. For most other languages you cannot. We tested the small models on Korean and went straight back to the large one. Fixing the mistakes by hand costs far more time than the faster run saves.
large-v3-turbo is the sensible default: it is the large model with the speed problem solved.
It is good, not perfect
Here is a real line from our own output. The speaker said "봇들" (bots) and Whisper heard "못둘".
[00:03.080 --> 00:07.000] 그 안에서 디스코드 못둘 로컬 LLM 영상 복원이 같이 돕니다.
^^^^
The places it slips are predictable:
- Invented words. Product names, tool names, acronyms
- Similar-sounding endings. The example above
- Numbers and units. There is usually more than one way to read them aloud
- Spacing. Rarely matters in a subtitle
So read it once before you ship it. But reading and fixing four lines is a different job from transcribing ten minutes from scratch.
Another use for it
It is not only for subtitles.
Use it to check synthetic speech. If you generate narration with a text-to-speech model, transcribe the result and diff it against your script. Anything it read wrong shows up immediately. We caught a homophone problem this way and fixed it in the script rather than fighting the audio.
Related
- Making that narration in the first place: Clone your own voice with a 17-second recording
Every command and number here was run on the machine this blog is written on.
Comments