Skip to main content

Auto-generate subtitles for VLC using fast, fully-local speech-to-text (Parakeet + Whisper)

Project description

VLCaption

Tests License: MIT Python 3.11+

Auto-generate subtitles for whatever is playing in VLC. Fully local — no cloud APIs. On Apple Silicon it uses NVIDIA Parakeet via parakeet-mlx: more accurate than whisper-large-v3 in English, ~10-60x realtime, and it doesn't hallucinate captions over music or silence. Whisper covers ~100 languages as fallback.

Use it

VLC extension (recommended): play a video, open VLC > Extensions > VLCaption - Auto Subtitles, click Generate Subtitles. Subtitles load automatically when ready. The server starts on demand and exits a couple of minutes after VLC quits.

Watch mode (macOS): zero clicks — subtitles whatever VLC plays:

vlcaption watch    # --model auto --interval 3 --overwrite --include-audio --embed

Long files are progressive: a quick pass around the playhead puts subtitles up within seconds, then the full pass replaces them (--no-progressive to disable, --quick-window to size the first pass).

Either way, captions are saved as movie.srt next to movie.mp4, so they auto-load on every future open.

Install

# From PyPI — with uv
uv tool install "vlcaption[mlx]"   # Apple Silicon ([mlx] = fast engines)
uv tool install vlcaption          # elsewhere

# ...or with pip / pipx
pip install "vlcaption[mlx]"
pipx install "vlcaption[mlx]"

vlcaption install                  # set up the VLC extension (optional)

# Or from source
git clone https://github.com/WT-MM/VLCaption.git && cd VLCaption && ./install.sh

Needs VLC, Python 3.11+, and on a Mac ffmpeg (brew install ffmpeg). Manual extension install: copy vlcaption/extension/vlcaption.lua into VLC's lua/extensions/ directory and restart VLC.

Platform support

Developed and tested end-to-end on macOS (Apple Silicon, VLC 3.0.21) only, so far.

Platform Extension Watch mode Auto-load into VLC Engine
macOS Apple Silicon ✅ tested ✅ tested ✅ tested Parakeet (ANE via silicon-asr) / mlx-whisper
macOS Intel should work should work should work faster-whisper (CPU)
Linux untested ❌ click Refresh faster-whisper (CPU/CUDA)
Windows faster-whisper (CPU/CUDA)

Reports and fixes from other platforms welcome.

Models

Choice Engine Languages Size
auto (default) best available
coreml Parakeet on the Neural Engine via silicon-asr EN + 24 European 1.2 GB
coreml-fast Parakeet CTC 110M, ~1000x realtime, draft quality English 0.2 GB
parakeet parakeet-mlx, Apple GPU EN + 24 European 1.2 GB
turbo mlx-whisper / faster-whisper ~100 1.6 GB
tinylarge-v3 mlx-whisper / faster-whisper ~100 75 MB – 3 GB

Models download on first use. auto = CoreML/ANE Parakeet on Apple Silicon (~1.7x faster than MLX at much lower power), Whisper turbo elsewhere (CUDA float16 on NVIDIA, int8 on CPU). The engine chosen is logged per job. No torch/MPS path on purpose: MLX and the ANE beat the MPS Whisper ports and CTranslate2 has no Metal backend.

Embed captions into the video

Lossless remux (mp4/m4v/mov/mkv/webm) — the .srt becomes a subtitle track inside the file:

vlcaption embed movie.mp4               # writes movie.subbed.mp4
vlcaption embed movie.mp4 --replace     # in place (atomic)

Server API

The extension auto-starts the server (port 9839). Run it yourself as vlcaption serve with --host/--port/--device/--exit-with-vlc. Hyphenated aliases (vlcaption-watch, vlcaption-server, ...) also exist. Endpoints: POST /transcribe (file_path, model, language, auto_load), GET /progress, GET /health, POST /shutdown.

Development

uv sync --extra dev --extra mlx
make format && make static-checks && make test

Architecture notes and the design review behind this layout: docs/redesign-2026-07.md.

Troubleshooting

  • Extension missing from menu — check the .lua is in the extensions dir; restart VLC. Menu is under the VLC application menu on macOS.
  • Menu item needs two clicks to reopen — VLC 3.x bug (#27688).
  • "FFmpeg is not installed or not in your PATH"brew install ffmpeg; if it's installed but the extension-started server can't see it, re-run vlcaption-install (GUI apps don't get Homebrew's PATH).
  • Subtitles generated but invisible — audio-only files have no video surface; check Subtitles > Subtitle Track on videos.
  • Debug logs — VLC > Tools > Messages at verbosity 2, prefix [VLCaption]; server logs: run the launcher in a terminal.

Uninstall

rm ~/Library/Application\ Support/org.videolan.vlc/lua/extensions/vlcaption.lua
rm -rf ~/.config/vlcaption
uv tool uninstall vlcaption   # or delete the cloned repo

Models live in ~/.cache/huggingface/.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vlcaption-0.3.0.tar.gz (31.4 kB view details)

Uploaded Source

File details

Details for the file vlcaption-0.3.0.tar.gz.

File metadata

  • Download URL: vlcaption-0.3.0.tar.gz
  • Upload date:
  • Size: 31.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.27 {"installer":{"name":"uv","version":"0.11.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for vlcaption-0.3.0.tar.gz
Algorithm Hash digest
SHA256 31bfb8757c4947e39175fd73fbea83a1e41557877dd8954d89a07a000ddfebc7
MD5 ae80c319c0aa26027e2c29a1c1287b73
BLAKE2b-256 f0294f6f160f0e3d34d9baf2471c6166f2d49e590bc9e6cc35db31d160ab76bc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page