Turn speech in any audio or video into text, on this machine, free. Arabic (including Egyptian dialect), English, or detected automatically. Takes a local file, a direct media link, or a YouTube or other site link. Outputs plain text, SRT, VTT or JSON with timings. Runs Whisper locally: no API key, no account, nothing leaves the machine.
version
1.0.0
updated
2026-10-13
works in
every conformant agent
needs
ffmpeg · yt-dlp
cost
free · no account
license
MIT
Say this you do not type commands, you ask
“transcribe this”
“what does this voice note say”
“read this recording”
“transcript of this meeting”
“make subtitles for this video”
“what is said in this clip”
“transcribe this YouTube video”
Once it is installed, that is the whole interface. Your agent picks the skill
up on its own and runs whatever it needs to. The commands further down are there for anyone who
would rather drive it themselves.
Install pick your agent
Examples copy and go
Changelog what changed, newest first
1.0.0
Added
Transcribe a local audio or video file, a direct media link, or a YouTube or other site link, fully on this machine.
Arabic (including Egyptian dialect), English, or automatic language detection.
Plain text, SRT and VTT subtitles, or JSON with timings.
Uses the fastest local Whisper engine installed: mlx-whisper on Apple Silicon, whisper-ctranslate2 or openai-whisper elsewhere.
A model is never downloaded without first saying how big it is.
Warns when the audio is near-silent, because Whisper invents text over silence.
Retries once with the large model when the output falls into a repetition loop.
A dependency check that shows the install commands and asks before running them, on macOS, Linux and Windows.
An agent that has this installed reads CHANGELOG.md in the skill folder.
The same history is at changelog.json,
and every tool's releases are at /updates.json.
Just ask
Once the skill is installed, say what you want in your own words:
"transcribe this voice note""what does this recording say? it's in Arabic""make English subtitles for this video""transcribe this YouTube talk"
The agent runs it and gives you the text. Nothing is uploaded anywhere: Whisper runs on your computer, so it is safe for private recordings.
Requirements
ffmpeg, to read any audio or video.
A local Whisper engine: mlx-whisper on an Apple Silicon Mac, whisper-ctranslate2 or openai-whisper elsewhere. All free and open source.
yt-dlp, only for links to YouTube and other sites.
bash. On Windows, Git Bash or WSL.
The skill checks for these and offers to install what is missing:
sh scripts/setup-deps.sh --check # what is there?
sh scripts/setup-deps.sh # show the install commands, ask, then run them
.\scripts\setup-deps.ps1 -Check # Windows
The first time a model is used it is downloaded once: about 1.6 GB for the default turbo, 3.1 GB for large. The script says the size and stops until you allow it with --allow-download.
Command line
bash scripts/transcribe.sh <source> [options]
Option
Values
Default
--lang
ar, en, auto, or any Whisper language code
auto
--model
turbo, large, medium, small, base
turbo
--format
txt, srt, vtt, json
txt
--out DIR
also write <source name>.<format> into DIR
none
--prompt "..."
names and terms to spell right
none
--engine
mlx, ctranslate2, openai
the fastest one installed
--allow-download
allow the first download of a model
off
<source> can be a local file, a direct media link, or a site link:
bash scripts/transcribe.sh meeting.m4a --lang en
bash scripts/transcribe.sh clip.mp4 --format srt --out captions
bash scripts/transcribe.sh https://example.com/episode.mp3
bash scripts/transcribe.sh "https://www.youtube.com/watch?v=..." --lang ar
For scripts that call it
The transcript is printed to stdout. Notes and warnings go to stderr.
On failure, the last stdout line is __TRANSCRIBE_FAILED__, a reason is printed to stderr after TRANSCRIBE_UNAVAILABLE:, and the exit code is 1. Bad options exit 2.
With --out, the file is named after the source (meeting.srt), not out.<format>.
Accuracy
Whisper invents text over silence, can loop on one phrase, and misspells names. The script warns on near-silent audio and retries a loop once with the large model. Pass names with --prompt. Check any number, date or amount against the audio before acting on it.