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:
InputTime16.6 s of audio12 s12 s video clip12 sFirst 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.
Related posts
- Run a Discord bot 24/7 for free on a computer you already own
- Why your Python script is slow: two lines took it 3.71 s to 1.20 s
Originally published at Homelab Notes — notes from one Mac mini running local LLMs and 24/7 automation.
Top comments (0)