100% local speech-to-text transcription for confidential meeting recordings.
Drop in a meeting recording → get a transcript. No cloud APIs, no subscriptions, and without exposing your data. Your audio never leaves your device; the model runs entirely offline after the initial download. Perfect for stand-ups, workshops, interviews, internal reviews, and strict NDAs.
graph TD
A["🎥 Recording Video (.mp4)"] -->|extract audio via ffmpeg| B["🔊 Audio (.mp3)"]
B --> C
subgraph C["⚡ faster-whisper"]
H["🤗 Hugging Face"] -->|auto-download & cache| M["🧠 Whisper Model"]
end
C --> D["📝 Transcript (.vtt / .txt)"]
D -.->|AI-ready| E["🤖 LLM / AI Agent"]
style A fill:#cce5ff,stroke:#007bff,stroke-width:3px,color:#000
style D fill:#cce5ff,stroke:#007bff,stroke-width:3px,color:#000
style B fill:#f9f9f9,stroke:#bbb,color:#555
style C fill:#f9f9f9,stroke:#bbb,color:#555
style H fill:#f9f9f9,stroke:#bbb,color:#555
style M fill:#f9f9f9,stroke:#bbb,color:#555
style E fill:#f9f9f9,stroke:#bbb,color:#555,stroke-dasharray: 5 5
- Extract audio — FFmpeg strips the audio track from your meeting recording and saves it as a high-quality MP3.
- Load model — On first run, the Whisper model is automatically downloaded from Hugging Face and cached locally for future use.
- Transcribe —
faster-whisperprocesses the audio through the Whisper model, producing timestamped segments with voice activity detection. - Output — The transcript is saved as a
.vtt(WebVTT subtitle) or.txtfile, ready to use — or feed directly into an LLM for meeting summaries, action items, and more.
- Python 3.11+
- FFmpeg — Install via your package manager:
- macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt install ffmpeg - Windows:
winget install ffmpeg
- macOS:
git clone git@github.com:noppanut15/local-meeting-whisper.git
cd local-meeting-whisper
python3 -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install -r requirements.txtConvert a video recording straight to a transcript in one command:
python transcribe_video.py meeting.mp4The transcript will be saved to transcripts/meeting.vtt by default.
[0.32s -> 7.24s] It was the key moment in our evolution, when apes became human.
[7.24s -> 14.08s] Our ancestors came down from the trees to become the species that dominated the planet.
[14.08s -> 21.04s] And we now know it began here, in Ethiopia, 2.8 million years ago.
Because the output is cleanly formatted and timestamped, it's perfect for piping into local AI models for completely private meeting minutes and summaries.
Example using Ollama:
cat transcripts/meeting.txt | ollama run llama3 "Summarize this meeting transcript into concise meeting minutes. Include the main topics discussed, key decisions made, and any important points mentioned:"# Single video file
python transcribe_video.py meeting.mp4
# All videos in a directory
python transcribe_video.py video/
# Specify model, language, and output directory
python transcribe_video.py meeting.mp4 -m large-v3 -l en -o transcripts
# Output as plain text instead of VTT
python transcribe_video.py meeting.mp4 -f txt| Flag | Default | Description |
|---|---|---|
-m, --model |
large-v3 |
Whisper model size (tiny, base, small, medium, large-v2, large-v3) |
-o, --output-dir |
transcripts |
Directory for transcript output files |
-l, --language |
auto-detect | Language code (e.g. en, th, ja) |
-f, --format |
vtt |
Output format (vtt, txt) |
--audio-dir |
audio |
Directory for intermediate .mp3 files |
--device |
cpu |
Compute device (cpu, cuda, auto) |
--compute-type |
float32 |
Quantization (int8, float16, float32) |
Use this if you already have extracted audio files (e.g., voice memos):
python transcribe_audio.py audio/recording.mp3
python transcribe_audio.py audio/ -m tiny -l enModels are automatically downloaded from Hugging Face on first use and cached in ~/.cache/huggingface/hub/.
# List cached models and their sizes
hf cache ls
# Remove cached models to free up space
hf cache rm <model-name>| Model | Parameters | Disk Size | Relative Speed | VRAM/RAM required |
|---|---|---|---|---|
tiny |
39M | ~75 MB | Fastest | ~1 GB |
base |
74M | ~150 MB | ~1 GB | |
small |
244M | ~500 MB | ~2 GB | |
medium |
769M | ~1.5 GB | ~3 GB | |
large-v3 |
1550M | ~3 GB | Best accuracy | ~5 GB |
1. I'm getting CERTIFICATE_VERIFY_FAILED when downloading models.
Solution: This project uses truststore to automatically hook into your native OS certificate store. If you are behind a strict corporate firewall/VPN, ensure your OS trusts your company's SSL certificates.
2. FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg'
Solution: FFmpeg is not installed or not in your system's PATH. Please refer to the prerequisites section to install it.
3. The process is killed randomly / I'm getting Out of Memory (OOM) errors.
Solution: The default large-v3 model requires a fair amount of RAM. If you are running on an older machine, try using a smaller model by appending -m base or -m small to your command.
| Component | Purpose |
|---|---|
| faster-whisper | CTranslate2-based Whisper inference (4x faster than standard implementation) |
| Systran/faster-whisper-* | Pre-trained Whisper models in CTranslate2 format |
| FFmpeg | Video → MP3 extraction |
| tqdm | Real-time CLI progress bars |
| truststore | Uses native OS trust store for HTTPS certificate verification |
Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.
- Thanks to OpenAI for the open-source Whisper models.
- Thanks to the SYSTRAN team for the highly optimized
faster-whisperimplementation.