Turn any video into ready-to-share subtitles. Transub extracts audio with ffmpeg, runs Whisper to transcribe the speech track, and hands the text to an LLM so you get well-translated subtitles without leaving the terminal.
- Overview
- Key Features
- Installation
- Configuration Overview
- CLI Cheatsheet
- Development
- Project Layout
- License
Transub orchestrates a reproducible pipeline:
- Extract audio from a video with
ffmpeg. - Transcribe speech via Whisper (local, mlx, whisper.cpp, or API).
- Translate subtitle batches with JSON-constrained prompts.
- Emit
.srtor.vttfiles with tuned line breaks and timing.
Intermediate state is cached so interrupted runs can resume without repeating earlier steps.
- End-to-end pipeline —
transub run <video.mp4>handles extraction → transcription → translation → export. - Multiple transcription backends — choose local Whisper,
mlx-whisper,whisper.cpp, or OpenAI-compatible APIs. - Reliable translations — JSON-constrained prompts, retry logic, and configurable batch sizes.
- Subtitle polishing — punctuation-aware line splitting, timing offsets, and optional spacing tweaks when different scripts appear in the same line.
- Stateful execution — cached progress in the work directory (defaults to
~/.cache/transub) avoids rework across runs.
- Python 3.10+
- ffmpeg: Must be installed and available in your system's
PATH.- Windows:
winget install Gyan.FFmpegorchoco install ffmpeg - macOS:
brew install ffmpeg - Linux:
sudo apt update && sudo apt install ffmpeg(Debian/Ubuntu) orsudo pacman -S ffmpeg(Arch)
- Windows:
Using uv (Recommended)
uv is a fast Python package installer and resolver. It installs CLI tools in isolated environments.
uv tool install transubTo update later, run:
uv tool upgrade transubtransub supports multiple Whisper backends. Choose one based on your needs:
-
Cloud API (Recommended for quick start):
- Uses OpenAI's Whisper API or compatible endpoints
- No local installation required
- Set
OPENAI_API_KEYenvironment variable - Configure with
backend = "api"during setup
-
Local backends (for offline use or custom models):
-
For most users (local, CPU/GPU):
pip install openai-whisper
-
For Apple Silicon (macOS):
pip install mlx-whisper
-
For
whisper.cpp: Follow the whisper.cpp installation instructions to build themainexecutable and make it available on yourPATH.
-
Run the interactive setup wizard to create your configuration file.
transub initThe wizard will guide you through selecting the backend, model, and LLM provider for translation.
Note on API Keys: If you use OpenAI for both transcription (Whisper API) and translation (GPT models), they share the same OPENAI_API_KEY by default. If you need separate keys for different services, you can customize api_key_env in the config file for each service.
transub run /path/to/your/video.mp4Subtitles are written alongside the source video unless you set pipeline.output_dir in your config. Override the cache location with --work-dir when you need an alternate workspace.
Runtime settings live in transub.conf (TOML). Key sections:
[whisper]— backend selection, model name, device overrides, and extra arguments.[llm]— translation provider/model, temperature, batch size, retry policy.[pipeline]— output format, line-length targets, timing trim/offset, punctuation and spacing options.
Example:
[pipeline]
output_format = "srt"
translation_max_chars_per_line = 26
translation_min_chars_per_line = 16
normalize_cjk_spacing = true
timing_offset_seconds = 0.05Run transub configure for an interactive editor, or update the file manually. Configuration files are user-specific and should not be committed.
transub run demo.mp4 --config ~/transub.conf --work-dir /tmp/transub # override work dir (defaults to ~/.cache/transub)
transub show_config
transub init --config ./transub.conf # rerun the setup wizard
transub configure # edit config (0 saves, Q discards)
transub run demo.mp4 --transcribe-only # export raw transcription only
transub run demo.mp4 -T # short flag for transcribe-only
transub --version # print the installed versionThe work directory (defaults to ~/.cache/transub) stores audio, transcription segments, translation progress, and pipeline state. If a run is interrupted, re-running the same command resumes where it left off. Use --work-dir to point at a custom cache location when needed.
If you want to contribute to transub, you can set up a development environment.
- Clone the repository:
git clone https://github.com/PiktCai/transub.git cd transub - Create and activate a virtual environment:
python3 -m venv .venv source .venv/bin/activate - Install in editable mode with development dependencies:
pip install -e ".[dev]" - Install a Whisper backend for testing:
pip install openai-whisper
python -m unittest- Source lives in
transub/(cli.py,config.py,transcribe.py,translate.py,subtitles.py, etc.). - Add tests beside related modules (e.g.,
transub/test_subtitles.py). - Use Rich console utilities and
transub.logger.setup_loggingfor consistent output.
transub/
├── audio.py
├── cli.py
├── config.py
├── subtitles.py
├── transcribe.py
├── translate.py
└── test_subtitles.py
This project is distributed for personal use and study; there is no formal contribution process at this time.
Transub is released under the MIT License.