Skip to main content

omni-transcriber

Transcribe anything from the command line: a YouTube link, an Instagram reel, any yt-dlp-supported URL, a local video or audio file, or a whole folder of media. Transcription runs locally via faster-whisper — no API key, no audio leaves your machine.

$ transcriber https://youtu.be/jNQXAC9IVRw
Alright, so here we are, one of the elephants...

$ transcriber lecture.mp4 -f srt -o lecture.srt
$ transcriber ~/podcasts -r -m turbo -o transcripts/

Install

Needs Python 3.10 or newer. uv is the smoothest route, but pipx and pip work too.

$ uv tool install omni-transcriber      # or: pipx install omni-transcriber
$ uvx omni-transcriber --help           # or run it without installing

With NVIDIA GPU acceleration:

$ uv tool install "omni-transcriber[gpu]"
Install Download size Notes
default (CPU) ~450 MB Works everywhere. Fine for short clips.
[gpu] extra ~2.7 GB Adds the CUDA cuBLAS/cuDNN wheels. NVIDIA only.

The [gpu] extra is never required. On a machine with an NVIDIA card but no [gpu] install, --device cuda prints a warning and falls back to the CPU rather than failing.

Optional companions

  • A JavaScript runtime — YouTube increasingly needs one. Deno is yt-dlp's preferred runtime; Node.js also works. transcriber enables whichever it finds on your PATH automatically. Without one, some videos lose formats or fail outright.
  • ffmpeg — not used for transcription (the bundled PyAV decoder reads audio straight out of any container). yt-dlp needs it only for a few stream types; if it is missing when that happens, a static build is fetched automatically.

Usage

transcriber INPUTS...            files, folders, and/or URLs — mix freely

ots is installed as a shorter alias for the same command — ots lecture.mp4 does exactly what transcriber lecture.mp4 does. (If you also use OpenTimestamps, which ships its own ots, one will shadow the other on your PATH; transcriber always works.)

Flag Meaning
-f, --format txt (default), srt, vtt, json, md
-t, --timestamps Timestamps in txt/md (srt/vtt always have them)
-m, --model Whisper model — see the table below (default small)
-o, --output A file for one input, or a directory (-o out/) for many
-l, --language Force a language (en, fr, ...); default is auto-detect
-r, --recursive Recurse into subfolders
--device auto (default), cpu, cuda
--compute-type auto (default), int8, float16, int8_float16
--batch-size N Decoding batch size; default 8 on CUDA, sequential on CPU
--no-vad Disable voice-activity filtering (keeps silence)
--playlist / --limit N Expand a playlist link; cap how many entries
--cookies-from-browser / --cookies Authenticate for private/login-walled media
--keep-audio Keep the downloaded audio next to the transcript
--overwrite Re-transcribe items that already have a transcript
-v, --verbose yt-dlp and engine detail on stderr

Where output goes

  • One input, no -o → the transcript goes to stdout, so it pipes: transcriber talk.mp4 | wc -w. Progress bars and warnings all go to stderr.
  • -o FILE → that exact file.
  • Several inputs, a folder, a playlist, or -o DIR/ → one <title>.<format> file per item.

Existing transcripts are skipped with a notice rather than overwritten, so re-running an interrupted batch resumes it for free. Pass --overwrite to redo them. A batch keeps going when one item fails and prints a summary at the end; the exit code is 1 if anything failed.

Models

Whisper models are downloaded once, on first use, to the HuggingFace cache (~/.cache/huggingface).

Model Download Good for
tiny 75 MB Quick drafts, testing
base 145 MB Clear speech, low resources
small 484 MB Default — the accuracy/speed sweet spot on CPU
medium 1.5 GB Better accuracy, noticeably slower on CPU
large-v3 3.1 GB Best accuracy. GPU strongly recommended
turbo 1.6 GB Near-large-v3 accuracy, much faster. Best GPU pick
distil-large-v3 1.5 GB Distilled, English-only, very fast

Add .en to tiny/base/small/medium for slightly better English-only accuracy. Any HuggingFace CTranslate2 repo id or local model directory also works.

Speed: on an RTX 5070 Ti, small transcribes 468 s of audio in 3.7 s; the same job on CPU takes 122 s.

Authentication for private media

Instagram reels, members-only videos, and anything else behind a login need your browser's cookies:

$ transcriber <reel-url> --cookies-from-browser firefox -f md -t
$ transcriber <reel-url> --cookies cookies.txt

Windows note: Chrome's app-bound cookie encryption usually defeats --cookies-from-browser chrome. Use Firefox, or export a cookies.txt with a browser extension and pass --cookies.

Exit codes

Code Meaning
0 Everything transcribed (or was already done)
1 At least one item failed — the message says why
2 Bad command-line usage
130 Interrupted with Ctrl-C

Development

From a checkout:

$ uv sync                       # dev environment
$ uv run pytest                 # fast tests: no network, no models
$ uv run pytest -m slow         # real tiny-model smoke test (~75 MB, once)
$ uv run ruff check . && uv run ruff format .

CI runs the suite on Linux, macOS, and Windows across Python 3.10 and 3.12. Python 3.10 through 3.14 are verified locally on Linux.

License

MIT — see LICENSE.

Metadata

Release files for omni-transcriber 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for omni-transcriber 0.1.0
File Size Uploaded
omni_transcriber-0.1.0.tar.gz 24.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for omni-transcriber 0.1.0
File Interpreter ABI Platform
omni_transcriber-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 54.9 kB

Release files / omni_transcriber-0.1.0.tar.gz

Download URL omni_transcriber-0.1.0.tar.gz
Size 24.3 kB
Tags Source
SHA-256 checksum
How to use checksums
1723bcfa07f8a253eeccff03147e84558787cf5fdda7eb6d3dee89a39e0e894b
BLAKE2b-256 checksum
How to use checksums
e101baa14dd12bc5e9461842d9c0e1ecb6223a6dc63fdae02dddb44ef0bc263d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / omni_transcriber-0.1.0-py3-none-any.whl

Download URL omni_transcriber-0.1.0-py3-none-any.whl
Size 30.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a44dea1a1ddba74641418ebd3694ef05873db12f387ee6c133f8cf1ef567b5c4
BLAKE2b-256 checksum
How to use checksums
b9140f923706874f3fa82bd579fda3399f993cf7e098b22f8a183a115237a463
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.1.10

2 release files

0.1.9

2 release files

0.1.7

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page