subsprint — offline subtitle generator for any video
CLI that creates .srt subtitles from a video file, fully offline after the
first model download. Tuned for Apple Silicon (M2 Pro tested).
Install
cd ~/Developers/projects/subsprint
pip install -e .
# optional, faster on M-series via Metal:
pip install -e ".[mlx]"
# optional, for `translate` command:
pip install -e ".[translate]"
Requires system ffmpeg (brew install ffmpeg).
Use
# transcribe English audio to English subs
# (pass -l en for English audio, omit -l for auto-detect)
subsprint transcribe movie.mp4 -l en
# higher quality, still <10 min with Metal backend:
subsprint transcribe movie.mp4 -l en --backend mlx --model small
# best quality offline (slower on CPU, faster on Metal):
subsprint transcribe movie.mp4 -l en --model large-v3-turbo --beam-size 1
# custom output dir / suffix / format
subsprint transcribe movie.mp4 -l en -o ./subs --suffix .en.auto --format srt
# translate an existing .srt (e.g. Italian -> English), keeps timings
subsprint translate subs.srt --from it --to en -o subs.eng.srt
Outputs by default sit next to the video:
<video-stem>.<lang>.auto.srt (e.g. movie.en.auto.srt).
Example timings (English subs, measured on M2 Pro 10-core / 16 GB)
Fast defaults: model small, beam_size=1, VAD on, faster-whisper CPU backend.
| Video length | Audio language | Model / backend | Subs generation time |
|---|---|---|---|
| 1 min | English | small / faster-whisper (CPU) |
~5 s transcribe (+ one-time model load) |
| 10 min | English | small / faster-whisper (CPU) |
~50 s (scales linearly) |
| 98 min | English | small / faster-whisper (CPU) |
~5 min transcribe + ~20 s audio extract, 1,474 segments |
Notes:
- First run downloads the model once (
small≈ 500 MB); afterwards 100 % offline. - Model load is extra on first run only (~45 s with download, ~1 s cached).
tinyis faster but noticeably less accurate;medium/large-v3-turboare more accurate and slower (turbo is much faster on the Metalmlxbackend).mlx-whisper(--backend mlx) uses the Metal GPU: ~3 s inference per 60 s of audio withsmallafter the one-time model download.translateusesHelsinki-NLP/opus-mt-<src>-<tgt>; first run downloads it too.
Metadata
Release files for subsprint 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| subsprint-0.1.0.tar.gz | 7.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| subsprint-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.9 kB
Release files / subsprint-0.1.0.tar.gz
| Download URL | subsprint-0.1.0.tar.gz |
|---|---|
| Size | 7.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c70eb807622bd73f2f3fb08d50c835960c4518e2699f06a23c9b613009c9ab29
|
|
BLAKE2b-256 checksum How to use checksums |
bd69c5e526e72a7dfc19821c1d54a524c663892056b2dd57b4c51401bbe16639
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / subsprint-0.1.0-py3-none-any.whl
| Download URL | subsprint-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0582db373af0da6607324f36fb1d83feb2780fc0fd75a5ac7f22b19e15e3ef8b
|
|
BLAKE2b-256 checksum How to use checksums |
f2d0ae1ee332e2559274d14d538fcca14955afc2a2735593252a23c8d1ffd1c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|