whisper.cpp with Metal acceleration, Large v3 Turbo, Silero VAD and word timing measured at about 3 ms — wrapped in an editor, so the three words it mishears take ten seconds to fix instead of ten minutes.
If you have already run whisper.cpp from a shell, you know it produces a usable transcript and a fairly unusable subtitle file.
Whisper is very good at hearing words and fairly indifferent about when they were said. Run it from the command line and you get an SRT with sensible sentences and timings that drift at phrase boundaries — close enough for a transcript, visibly late for a caption that is meant to land on the beat.
suubbs runs the same engine and then does the work afterwards that the CLI leaves to you: it aligns word boundaries against the audio, segments lines against real reading-speed rules, and gives you somewhere to fix the three words it got wrong without hand-editing timestamps in a text file.
This is the design decision everything else rests on. A cue's text is always derived from its words and never stored beside them. That is what makes word-level highlighting, retiming, and re-segmenting with a better model while keeping your edits possible at all. Most subtitle tools store the line and throw the word timings away, which is why re-segmenting in them means starting over.
Nothing here is impossible with the CLI. It is a question of how many evenings you want to spend on it.
| whisper.cpp by hand | suubbs | |
|---|---|---|
| Setup | Homebrew, a compiler, ffmpeg, model files fetched by hand | Drag one app to Applications |
| Audio extraction | An ffmpeg incantation per file | Demuxed and decoded in-process |
| Word timing | Raw DTW output, late at phrase boundaries | DTW snapped onto real amplitude edges, about 3 ms |
| Fixing a wrong word | Reopen the SRT in a text editor and re-count timestamps | Click the word, type, timings hold |
| Re-segmenting lines | Rerun with different flags and hope | Words are the source of truth, so lines re-flow without losing edits |
| Styling | Hand-write ASS override tags | Live preview that matches what libass renders |
| Cost | Free | $3.99 once |
The engine, the models, and the honest limits.
Large v3 Turbo by default on the Mac app — 574 MB, downloaded once on first launch. The browser version starts with a 78 MB model, which is why its transcripts are rougher.
whisper.cpp, with Metal acceleration, wrapped by a Rust core. There is no Python runtime anywhere in the app.
About 3 ms against known speech onsets on the desktop build. Cross-attention alignment gives the initial boundaries and an acoustic pass snaps them onto genuine amplitude dips. Inside continuous speech, where no pause exists, it deliberately leaves the boundary alone rather than inventing one.
Yes, on the Mac app. Give it the proper nouns before you start and the transcript uses your spelling instead of guessing. The browser build cannot do this — Transformers.js declares the prompt parameter but never consumes it.
Silero VAD runs in front of the model on the desktop build, which is what stops long silences being transcribed as hallucinated speech.
Sixteen, detected automatically: English, Spanish, French, German, Italian, Portuguese, Dutch, Polish, Russian, Japanese, Korean, Chinese, Hindi, Arabic, Turkish and Ukrainian. Any of them can also be translated into English.
[no homebrew required]