Transcribe audio/video files to SRT subtitles in one command. Optimized for large files, long movies, and video editing workflows.
# 1. Try it instantly (no install needed)
npx @illyism/transcribe video.mp4
# 2. Set your OpenAI API key (one-time setup)
export OPENAI_API_KEY=sk-...
# 3. Transcribe anything
npx @illyism/transcribe video.mp4
npx @illyism/transcribe https://www.youtube.com/watch?v=VIDEO_IDThat's it! Get your free API key here and start transcribing.
While OpenAI's Whisper has multiple ways to use it, this tool provides a simpler, more convenient experience:
| Feature | @illyism/transcribe | Official Whisper CLI | Local Whisper (whisper.cpp) |
|---|---|---|---|
| Setup | Zero setup with npx/bunx |
Install Python package | Download models (~1-5GB) |
| Video Support | β Automatic with FFmpeg | β Audio only | β Audio only |
| YouTube Support | β Built-in | β Manual download | β Manual download |
| SRT Output | β Built-in | β Manual formatting | β Available |
| Processing | βοΈ Cloud (fast) | βοΈ Cloud (fast) | π» Local (slower) |
| Cost | $0.006/min | $0.006/min | Free (after setup) |
| Internet Required | β Yes | β Yes | β No |
| Best For | Quick tasks, videos, YouTube | API integration | Privacy, offline use |
- π¬ Handles videos directly - No need to manually extract audio
- π₯ YouTube support - Transcribe YouTube videos with just the URL
- π SRT format ready - Generates subtitles automatically
- π Zero installation - Just run
npx @illyism/transcribe video.mp4 - π§ Simple config - One-time API key setup
- π Cross-platform - Works on macOS, Linux, Windows
Perfect for: Content creators, podcasters, and developers who need quick, accurate transcriptions with minimal setup.
Got a 30-60 minute video that's 2-4GB? Other tools like Descript upload the entire video file, which takes forever and costs more.
This tool:
- π¬ Extracts only the audio locally (takes seconds with FFmpeg)
- βοΈ Uploads only ~20-40MB of audio to Whisper
- π Generates SRT subtitles
Result: 10-100x faster than uploading multi-GB video files. Same quality, fraction of the time and bandwidth.
- π¬ Video & Audio Support: Works with MP4, MP3, WAV, M4A, WebM, OGG, MOV, AVI, and MKV
- π₯ YouTube & Social Video: Download and transcribe YouTube, Instagram Reels, and X/Twitter videos directly
- π― High Accuracy: Powered by OpenAI's Whisper API + optional 2-Pass AI Autofix (
--autofix) - π₯ Speaker Diarization: Automatically labels speaker turns (
[Speaker 1]: ...,[Speaker 2]: ...) - π SRT Format: Generates standard SRT subtitle files with frame-accurate timestamps
- ποΈ Long Movies: Automatic chunking for feature-length content (45+ minutes), transcribed in parallel
- π¬ Editor-Friendly: Timecode offset, custom output paths, chunk size control
- π OpenAI-Compatible Gateways: Connect to OpenRouter, LiteLLM, Groq, or self-hosted models
- π§ Simple Setup: Easy configuration via environment variable or config file
Make transcribing effortless on macOS with right-click Quick Actions, Apple Shortcuts, Raycast, or Drop Zone folders:
π±οΈ Right-Click Finder Quick Action (Easiest)
Install the native Finder Quick Action in one second:
npx @illyism/transcribe --install-mac-actionUsage: Right-click any video or audio file in Finder β Quick Actions β Transcribe Subtitles. Runs in the background and sends a Mac System Notification when the .srt is ready next to your media file.
β‘ Apple Shortcuts (Menu Bar / Hotkey)
- Open Shortcuts.app on Mac β Create a new Shortcut.
- Enable Use as Quick Action in shortcut settings.
- Add action: Run Shell Script (
/bin/zsh):export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" npx @illyism/transcribe "$1"
- Pin it to your Mac Menu Bar or assign a global keyboard shortcut (e.g.
Cmd + Opt + T) to transcribe selected files or copied URLs!
π Raycast / Alfred Script Command
Create a Raycast Script Command (transcribe.sh):
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Transcribe File or URL
# @raycast.mode compact
# @raycast.argument1 { "type": "text", "placeholder": "File path or YouTube/Reel URL" }
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"
npx @illyism/transcribe "$1"Trigger with Cmd + Space β Transcribe β paste any URL or file path!
π Drop Zone Folder (Automator Folder Action)
- Create a folder on your Desktop:
~/Desktop/Transcribe Drop Zone - Open Automator.app β New Document β Folder Action β choose
~/Desktop/Transcribe Drop Zone. - Add action: Run Shell Script:
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" for f in "$@"; do npx @illyism/transcribe "$f" done
Whenever you drop video or audio files into ~/Desktop/Transcribe Drop Zone, subtitles are generated automatically in the background.
Install AI agent skills directly via skills.sh:
npx skills add Illyism/transcribe-cliIncludes transcribe, summarize-transcript, video-to-social, youtube-chapters, and format-converter. See skills/ for details.
npx @illyism/transcribe video.mp4npm install -g @illyism/transcribe
# or: bun install -g @illyism/transcribeπ¦ Install FFmpeg (required)
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# Windows
choco install ffmpegπ₯ Install yt-dlp (optional, for YouTube / Instagram / remote URLs)
# macOS
brew install yt-dlp
# Ubuntu/Debian
sudo apt install yt-dlp
# Windows
winget install yt-dlp
# Or with pip
pip install yt-dlpπ Get OpenAI API Key (required)
- Go to platform.openai.com/api-keys
- Create a new API key
- Copy it and set it up below β¬οΈ
One-time setup - Choose your preferred method:
mkdir -p ~/.transcribe && echo '{"apiKey": "sk-YOUR_KEY"}' > ~/.transcribe/config.jsonDual-Key Supercharging (Auto-Mixing):
If you have both keys, you can add them to ~/.transcribe/config.json:
{
"openaiApiKey": "sk-...",
"openrouterApiKey": "sk-or-..."
}@illyism/transcribe will automatically route Pass 1 through Whisper-1 (for frame-accurate timestamps) and Pass 2 through Gemini 3.7 Flash (for deep context jargon fixing and multi-speaker diarization)!
# Standard OpenAI
export OPENAI_API_KEY=sk-YOUR_KEY
# Or use OpenRouter / OpenAI-compatible gateways (LiteLLM, vLLM, Deepgram)
export OPENROUTER_API_KEY=sk-or-YOUR_KEY
export OPENAI_BASE_URL=https://openrouter.ai/api/v1
export TRANSCRIBE_MODEL=google/gemini-2.5-flash
# Or export BOTH for the best hybrid pipeline:
export OPENAI_API_KEY=sk-YOUR_OPENAI_KEY
export OPENROUTER_API_KEY=sk-or-YOUR_OPENROUTER_KEYDon't have a key? Get an OpenAI key or OpenRouter key.
# Local video file
transcribe video.mp4
# 2-Pass Hybrid Pipeline: Frame-perfect Whisper timestamps + automatic AI cleanup & speaker diarization
# Works with your single OPENAI_API_KEY (uses gpt-5.6-luna) or OPENROUTER_API_KEY (uses gemini-3.7-flash)
transcribe podcast.mp3 --autofix
# Optionally specify a custom model for autofix
transcribe podcast.mp3 --autofix google/gemini-3.7-flash
transcribe podcast.mp3 --autofix gpt-5.6-luna
# Disable automatic speaker labels
transcribe podcast.mp3 --autofix --no-diarize
# Custom model and endpoint (e.g. OpenRouter, LiteLLM, Groq)
transcribe video.mp4 --model google/gemini-2.5-flash --base-url https://openrouter.ai/api/v1
transcribe video.mp4 --model whisper-large-v3 --base-url https://api.groq.com/openai/v1
# YouTube video
transcribe https://www.youtube.com/watch?v=VIDEO_ID
# Instagram Reel (uses your browser login cookies automatically)
transcribe https://www.instagram.com/reel/SHORTCODE/
transcribe https://www.instagram.com/reel/SHORTCODE/ --cookies-from-browser chrome
# Audio file
transcribe podcast.mp3
# Disable optimization (use original audio)
transcribe video.mp4 --rawOutputs: Creates video.srt in the same directory.
Perfect for video editing workflows:
# Custom output path (file or directory)
transcribe movie.mkv --output ./subtitles
transcribe movie.mkv --output ./subtitles/movie.srt
# Timecode offset (for editorial timelines)
transcribe movie.mkv --offset 01:00:00.000 # Start at 1 hour
transcribe movie.mkv --offset 3600 # Same, in seconds
# Force chunking for very long movies
transcribe long_movie.mkv --chunk-minutes 15Why chunking? Movies 45+ minutes are automatically split into ~20-minute chunks for reliability. Chunks are transcribed in parallel with up to 8 concurrent requests, then merged seamlessly with correct timestamps.
By default, the tool optimizes large video and audio files:
2.7GB video β Extract speech audio (mono, 16kHz) β Auto-chunk if >45min β Transcribe chunks in parallel β Merge & adjust timestamps
For long media (45+ minutes):
- Automatically splits into ~20-minute chunks
- Transcribes chunks in parallel with up to 8 concurrent requests
- Merges results with frame-accurate timestamps
- Handles 2+ hour movies reliably
2-Pass Hybrid Pipeline (--autofix):
- Pass 1: Whisper-1 generates frame-accurate subtitle timing anchors.
- Pass 2: Multimodal AI (Gemini Flash) fixes domain jargon, acronyms, and names, and adds speaker labels (
[Speaker 1],[Speaker 2]).
Result:
- β‘ 99.5% smaller uploads (2.7GB β ~20MB audio)
- π 10-100x faster than uploading full video
- π― Frame-accurate timecode synchronization
- π° Low cost ($0.006/min)
npm install @illyism/transcribeimport { transcribe } from '@illyism/transcribe'
const result = await transcribe({
inputPath: 'video.mp4',
apiKey: process.env.OPENAI_API_KEY,
optimize: true // default, set false to disable
})
console.log(result.srtPath) // Path to generated SRT file
console.log(result.text) // Full transcription textFull API reference
interface TranscribeOptions {
inputPath: string // Path to video/audio file
apiKey?: string // OpenAI / OpenRouter API key (or use env var)
baseURL?: string // Custom base URL for OpenAI-compatible endpoints
model?: string // Model name (default: "whisper-1")
outputPath?: string // Custom output path (optional)
optimize?: boolean // Enable optimization (default: true)
offsetSeconds?: number // Shift timestamps by N seconds
chunkMinutes?: number // Chunk size in minutes (default: 20)
}
interface TranscribeResult {
srtPath: string // Path to generated SRT file
text: string // Full transcription text
language: string // Detected language
duration: number // Duration in seconds
}π Supported Formats
- Video: MP4, WebM, MOV, AVI, MKV
- Audio: MP3, WAV, M4A, OGG, Opus
- YouTube: All videos, Shorts, youtu.be links
- Instagram: Reels, posts, and IGTV (requires a logged-in browser for cookies)
π° Cost
OpenAI Whisper API: $0.006 per minute
Examples:
- 5 min: $0.03
- 30 min: $0.18
- 2 hours: $0.72
βοΈ How It Works
- Extract audio from video (mono, 16kHz - speech optimized)
- Auto-chunk if >45 minutes (for parallel processing and reliability)
- Upload chunks to Whisper API (or OpenAI-compatible gateway)
- Generate SRT subtitles with frame-accurate timestamps
- Optional 2-pass AI Autofix (
--autofix): Corrects domain jargon & adds speaker diarization - Merge chunks and apply timecode offsets (if specified)
- Clean up temporary files
π SRT Output Example
1
00:00:00,000 --> 00:00:03,420
Hey and thank you for getting the SEO roast.
2
00:00:03,420 --> 00:00:06,840
I'll take a look at your website and see what things we can improve."OPENAI_API_KEY not found"
Set up your API key using one of the methods in API Key Setup.
"FFmpeg not found"
Install FFmpeg:
brew install ffmpeg # macOS
sudo apt install ffmpeg # Ubuntu
choco install ffmpeg # Windows"yt-dlp not found" (YouTube only)
Install yt-dlp:
brew install yt-dlp # macOS
sudo apt install yt-dlp # Ubuntu
pip install yt-dlp # Any platformFile not found error
Use absolute paths:
transcribe /full/path/to/video.mp4API errors (502, timeout, etc.)
OpenAI API may be temporarily down. Wait 30 seconds and try again.
"Could not parse multipart form" error
If you're using Bun runtime, switch to Node.js:
# Use Node.js instead of Bun
node dist/cli.js video.mp4
# Or install globally and use the transcribe command
npm install -g @illyism/transcribe
transcribe video.mp4The CLI works best with Node.js 18+ due to OpenAI SDK compatibility.
- π¦ NPM Package
- π GitHub Repo
- π Full Changelog
- π§ͺ A/B Test Results
- π Report Issues
Pull requests welcome! See GitHub repo.
MIT Β© Ilias Ismanalijev