Make subtitles with local AI, without uploading your footage
Buzz and AutoSubs are desktop apps that make subtitles on your computer [1][9]; whisper.cpp writes SRT and VTT files from the command line [10]. All three need model files downloaded first [8][9][11]. Check names by hand: Whisper-family models can invent text over music or silence [10][8].
Not yet tested by VloggingProTools in this workflow
| Tool | Role in this workflow | Cost | Runs |
|---|---|---|---|
| Buzz transcription | Desktop app: import a file, transcribe, export TXT, SRT or VTT [1]. | Free code | Desktop app, On your computer |
| Auto Subs (tmoroney) | Subtitles from inside DaVinci Resolve, Premiere Pro or After Effects, or as a standalone app [9]. | Free code | On your computer |
| whisper.cpp | Command-line transcriber with -osrt and -ovtt subtitle output [10]. | Free code | On your computer |
| FFmpeg / ffprobe | Converts audio to the 16 kHz, 16-bit WAV that the whisper.cpp README asks for [2]. | Free code | On your computer |
| faster-whisper | Python library that returns a start and end time for every word [17]. | Free code | On your computer |
| WhisperX | Word alignment plus speaker labels through pyannote-audio [18]. | Free code | On your computer |
| stable-ts | Word-timestamp library for Whisper; archived by its owner in May 2026 [20]. | Free code | On your computer |
The result
SRT and VTT subtitle files for each video, made on your own computer [10][1].
Optionally, word-by-word timings from faster-whisper [17] or a transcript with speaker labels from WhisperX [18].
Before you start
- Pick a route: an app (Buzz or AutoSubs), the terminal, a window where you type commands (whisper.cpp), or Python (faster-whisper or WhisperX).
- Buzz for macOS needs Apple silicon; the last Intel version is 1.4.5 [1].
- AutoSubs does not work with the Mac App Store version of DaVinci Resolve. Install Resolve from blackmagicdesign.com [9].
- Homebrew's whisper.cpp comes without models [11]. Models run from 75 MiB (tiny) to 2.9 GiB (large-v3);
.enmodels are English-only [14].
Steps
No-code route: transcribe in Buzz
Buzz transcribes and translates offline using OpenAI's Whisper [1]. It takes audio or video and exports TXT, SRT and VTT [12].
Install from SourceForge on macOS and Windows, or with Flatpak, Snap or AppImage on Linux [1]. The Windows installer is unsigned: at the warning, choose More info, then Run anyway [1].
Download models in Help > Preferences > Models; Buzz then works offline [8].
Its FAQ says Large-V3 can invent words not in the audio, and the only way to choose a model is to test them in your language [8].
Copied from the documentation · macOS · source [13]brew install --cask buzzCopied from the documentation · Linux · source [1]flatpak install flathub io.github.chidiwilliams.BuzzNo-code route inside your editor: AutoSubs
AutoSubs says it runs locally, with no subscription and no data leaving your machine [9]. It works standalone or inside DaVinci Resolve, Premiere Pro or After Effects [9].
In Resolve, open Workspace > Scripts > AutoSubs, pick the timeline or audio source, click Transcribe, edit speakers and subtitles, and send styled subtitles back [9]. Premiere Pro gets caption tracks; After Effects gets a text layer per SRT entry [9].
Models download on demand from the Model Manager and run on-device. Installers cover Apple silicon and Intel Macs, Windows and Linux [9].
Copied from the documentation · macOS · source [9]brew install --cask auto-subsCommand-line route: install whisper.cpp and a model
whisper.cpp is an MIT-licensed C/C++ port of OpenAI's Whisper [11][3]. Homebrew's
whisper.cppformula (formerlywhisper-cpp) installswhisper-cli[11].Get a model with the repository's script, or as a ready-made
.binfile from Hugging Face [14].On Apple silicon it runs on the GPU through Metal [2]. Homebrew has builds for Apple silicon Macs and Linux [11]; elsewhere, including Windows, build from source with CMake [2].
Copied from the documentation · macOS, Linux · source [11]brew install whisper.cppCopied from the documentation · macOS, Linux · source [2]git clone https://github.com/ggml-org/whisper.cpp.git cd whisper.cpp sh ./models/download-ggml-model.sh base.enCopied from the documentation · Windows · source [2].\models\download-ggml-model.cmd baseCopied from the documentation · Build from source · source [2]cmake -B build cmake --build build -j --config ReleaseConvert the audio and write SRT and VTT files
whisper-clionly reads 16-bit WAV, so convert with FFmpeg first [2]. Replaceinput.mp3with your file; FFmpeg reads a wide range of formats [15].-osrtwrites SRT,-ovttwrites VTT,-ofsets the output name without extension and-lsets the spoken language [10].The command is
whisper-clifrom Homebrew [16] or./build/bin/whisper-clifrom a source build [2].Copied from the documentation · source [2]ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wavAssembled from documented options, not printed in the docs · source [10]whisper-cli -m models/ggml-base.en.bin -f output.wav -l en -osrt -ovtt -of outputStop phantom text over music and silence
Over mostly music or silence, whisper.cpp can print repeated lines or fluent text in the wrong language [10].
Fixes:
-lto pin the language,-snsto suppress non-speech tokens,-nfto turn off temperature fallback, and--vadwith a voice activity detection (VAD) model so non-speech never reaches the decoder [10]. The Silero VAD model has its own download script [2].faster-whisper's
vad_filter=Trueremoves silence over 2 seconds by default [17]. WhisperX runs VAD first, which its README says reduces hallucination [18].Copied from the documentation · macOS, Linux · source [2]./models/download-vad-model.sh silero-v6.2.0Assembled from documented options, not printed in the docs · source [10]whisper-cli -m models/ggml-base.en.bin -f output.wav -l en -sns -nf --vad -vm models/ggml-silero-v6.2.0.bin -osrt -ovtt -of outputPython route: word-level timings with faster-whisper
faster-whisper needs Python 3.9 or later. It decodes audio with PyAV, so FFmpeg is not needed [17].
Its GPU instructions cover NVIDIA cards (CUDA 12, cuBLAS, cuDNN 9). Otherwise use
device="cpu", compute_type="int8"[17].word_timestamps=Trueadds start and end times for every word [17]. The README has no SRT writer [17]: format the output yourself or ask a coding agent.segmentsis a generator: nothing is transcribed until you loop over it [17].Copied from the documentation · source [17]pip install faster-whisperAssembled from documented options, not printed in the docs · source [17]from faster_whisper import WhisperModel model = WhisperModel("large-v3", device="cpu", compute_type="int8") segments, _ = model.transcribe("audio.mp3", word_timestamps=True, vad_filter=True) for segment in segments: for word in segment.words: print("[%.2fs -> %.2fs] %s" % (word.start, word.end, word.word))Speaker labels with WhisperX
WhisperX adds word timings through wav2vec2 alignment, and speaker labels (diarisation: splitting audio by who speaks) through pyannote-audio [18].
For speaker labels, create a Hugging Face read token, accept the conditions for
pyannote/speaker-diarization-community-1and pass the token with--hf_token[18][19]. The model is CC-BY-4.0 [19].On a Mac use
--compute_type int8 --device cpu. GPU use needs the CUDA 12.8 toolkit [18].Limits: diarisation 'is far from perfect', overlapping speech is handled poorly, and words such as '2014.' or '£13.60' get no timing [18].
Copied from the documentation · source [18]pip install whisperxCopied from the documentation · source [18]whisperx path/to/audio.wav --model large-v2 --diarize --highlight_words TrueAssembled from documented options, not printed in the docs · macOS · source [18]whisperx path/to/audio.wav --model large-v2 --diarize --hf_token YOUR_HF_TOKEN --compute_type int8 --device cpuCheck every name, then publish
Read the SRT against the video. Large Whisper models can invent words [8], and WhisperX leaves words such as '£13.60' untimed [18].
Fix drift after a re-edit with the SRT offset tool.
You approve:Check every name, place, brand and product against the audio before publishing.
If you don't want to code
Common failures
- Phantom lines over music or silence: in whisper.cpp use
-l,-sns,-nfand--vad[10]; in faster-whisper setvad_filter=True[17]. - Wrong language: on non-speech audio, auto-detection can pick one at random. Set
-l[10]. .enmodel on other languages:.enmodels are English-only [14] and will not work [8].- Buzz crashes after a model download: the file may be incomplete or corrupt. Delete it in Help > Preferences > Models and download it again [8].
- faster-whisper GPU errors: the latest
ctranslate2supports only CUDA 12 and cuDNN 9; the README lists older versions for other setups [17]. - Wrong WhisperX speaker labels: set
--min_speakersand--max_speakers[18]. - stable-ts: archived by its owner on 30 May 2026, read-only [20]. Last PyPI release 2.19.1, 16 August 2025 [21].
Privacy, rights and permissions
- Buzz says it transcribes offline [1], AutoSubs says its models run on-device [9], and the whisper.cpp README shows it running fully offline [2].
- Buzz sends audio to OpenAI only if you add an OpenAI API key in Preferences [8].
- Models download once: Buzz and AutoSubs in the app [8][9], whisper.cpp from its script or Hugging Face [14]. The WhisperX speaker model's gated Hugging Face repository asks for your contact details; pyannote documents running it offline after download [19].
- Get and record permission before transcribing other people's voices.
What we will measure
- Word error rate against a human reference on a fixed 5-minute noisy two-speaker English sample, recording model version, language and device.
- Alignment drift: median absolute timing error on 50 sampled words against frame-accurate timecodes, with the 10 worst listed.
- CPU and GPU time per tool on the same sample.
- Outbound connections from each tool with the internet blocked.
- Install success: a valid subtitle file from a clean machine within 30 minutes.
Sources
- raw.githubusercontent.com/chidiwilliams/buzz/main/README.md fetched 2 Nov 2026
- raw.githubusercontent.com/ggml-org/whisper.cpp/master/README.md fetched 2 Nov 2026
- raw.githubusercontent.com/ggml-org/whisper.cpp/master/LICENSE fetched 2 Nov 2026
- raw.githubusercontent.com/SYSTRAN/faster-whisper/master/LICENSE fetched 2 Nov 2026
- raw.githubusercontent.com/chidiwilliams/buzz/main/LICENSE fetched 2 Nov 2026
- raw.githubusercontent.com/tmoroney/auto-subs/main/LICENSE fetched 2 Nov 2026
- raw.githubusercontent.com/m-bain/whisperX/main/LICENSE fetched 2 Nov 2026
- FAQ | Buzz fetched 2 Nov 2026
- raw.githubusercontent.com/tmoroney/auto-subs/main/README.md fetched 2 Nov 2026
- raw.githubusercontent.com/ggml-org/whisper.cpp/master/examples/cli/README.md fetched 2 Nov 2026
- Homebrew Formulae: whisper.cpp fetched 2 Nov 2026
- Introduction | Buzz fetched 2 Nov 2026
- Homebrew Formulae: buzz fetched 2 Nov 2026
- raw.githubusercontent.com/ggml-org/whisper.cpp/master/models/README.md fetched 2 Nov 2026
- ffmpeg Documentation fetched 2 Nov 2026
- raw.githubusercontent.com/Homebrew/homebrew-core/HEAD/Formula/w/whisper.cpp.rb fetched 2 Nov 2026
- raw.githubusercontent.com/SYSTRAN/faster-whisper/master/README.md fetched 2 Nov 2026
- raw.githubusercontent.com/m-bain/whisperX/main/README.md fetched 2 Nov 2026
- pyannote/speaker-diarization-community-1 · Hugging Face fetched 2 Nov 2026
- GitHub - jianfch/stable-ts: Transcription, forced alignment, and audio indexing with OpenAI's Whisper · GitHub fetched 2 Nov 2026
- stable-ts · PyPI fetched 2 Nov 2026