Drag-and-drop video/audio → SRT subtitles, transcribed locally.
Just run
get-srt. Drop a video or audio file in, pick a model, get an .srt file out. Nothing leaves your machine.
I wanted subtitles for lecture/screen recordings without uploading anything anywhere. Two options exist for that: run Whisper locally, or upload the video to YouTube (as unlisted) and download the auto-generated captions once they're ready.
The YouTube route was ruled out without writing any code for it: it needs OAuth/API credentials, an upload of the full file, and then an unpredictable wait (minutes to hours) for auto-captions to appear before you can pull an .srt back down with something like yt-dlp. That's slow, depends on a network round-trip and a third party, and won't work on private/sensitive footage. Running Whisper locally has none of those problems and, on Apple Silicon, is fast enough that the round-trip through YouTube isn't a reasonable trade at all.
So get-srt runs Whisper locally through one of two backends, auto-picking the best one for your machine:
- mlx-whisper — runs on the Apple Silicon GPU via Metal. This is the default whenever it's available, because it's dramatically faster on Mac than the alternative below.
- whisperx — cross-platform (CPU or CUDA). Its forced word-alignment step produces tighter segment boundaries than plain Whisper decoding, at the cost of extra models to load and CPU-only speed on Mac.
Both were benchmarked directly on this machine (Apple M3 Max) before picking a default — see the numbers below.
Requires ffmpeg and a Python environment with one of the backends installed:
brew install ffmpeg
pip install mlx-whisper # Apple Silicon — fastest
# or
pip install whisperx # cross-platform (CPU/CUDA)Not published to npm/Homebrew yet — for now, build it from source:
git clone https://github.com/Nunatic02/get-srt.git
cd get-srt
npm install && npm run build && npm linkget-srtThe interactive prompts walk you through the rest: drop a file, pick a model size, optionally force a language, done.
- Interactive by default — guided prompts, no flags to remember
- Drag & drop — drop video or audio files right into your terminal
- Fully local — no upload, no account, no API key, no waiting on a third party
- Auto-detects the fastest backend — mlx-whisper on Apple Silicon, whisperx elsewhere
- 5 model sizes — tiny through large, trading speed for accuracy
- Batch processing — drop a folder or multiple files; the model loads once and is reused for the whole batch (see Batch speed below)
- Auto language detection, with an override flag for known-language content
get-srt lecture.mp4 # Transcribe with default (small) model
get-srt -m large lecture.mp4 # Best accuracy
get-srt -l ja anime_clip.mkv # Force Japanese instead of auto-detect
get-srt -b whisperx interview.mov # Use whisperx instead of mlx
get-srt -s *.mp4 # Batch, save to subtitles/ subfolder| Flag | Description | Default |
|---|---|---|
-m, --model <name> |
Model size: tiny, base, small, medium, large | small |
-l, --language <code> |
Force source language, e.g. en, es, ja |
auto-detect |
-b, --backend <name> |
Backend: mlx, whisperx |
auto-detect |
-o, --output <name> |
Custom output filename (without extension) | same name as source |
-s, --subfolder |
Save to subtitles/ subfolder |
alongside source |
| Model | Hint |
|---|---|
| tiny | Fastest, rough drafts only |
| base | Fast, usable accuracy |
| small | Recommended — good balance (Whisper's own default) |
| medium | Slower, more accurate |
| large | Best accuracy, slowest |
Measured on this machine (Apple M3 Max, 96 GB RAM) on the same 20-second narrated clip, tiny model:
| Backend | Time | Notes |
|---|---|---|
| mlx-whisper | ~1.4s | Runs on the GPU via Metal |
| whisperx | ~6.9s | CPU-only on Mac; extra VAD + alignment models |
mlx-whisper was about 5x faster in this test, which is why it's the default whenever it's available. whisperx is kept as an explicit -b whisperx opt-in for its tighter word-aligned timestamps, or for machines without Apple Silicon.
The obvious way to run either backend — shell out to its CLI once per file — reloads the whole model (for whisperx: the VAD model, the ASR model, and the alignment model) from scratch every single time. That cost is fixed per file regardless of how short the file is, so it dominates batch runs.
get-srt instead spawns one long-lived Python worker for the whole batch, loads the model(s) into memory exactly once, and reuses them across every file. Measured on a batch of 3 files on this machine:
| Backend / model | Reload-per-file (old way) | Loaded-once (get-srt) | Speedup |
|---|---|---|---|
| whisperx / tiny | 30.4s | 14.7s | ~2.1x |
| mlx / large-v3-turbo | 8.7s | 6.5s | ~1.3x |
The gain scales with batch size — it's roughly one saved model-load per extra file — and is largest for whisperx, which has three models to reuse instead of one.
Input: .mp4, .mov, .mkv, .avi, .webm, .m4v, .ts, .flv, .mp3, .wav, .m4a, .aac, .flac, .ogg, .opus, .aiff, .wma
Output: .srt
MIT