Record, transcribe, and summarize meetings with complete privacy. Everything runs locally on your machine.
A macOS CLI tool that captures system audio, transcribes it using AI (Whisper), and generates intelligent summaries. Perfect for Zoom calls, podcasts, or any audio content.
- 🎧 Real-time Audio Recording - Captures system audio via BlackHole virtual audio device
- 🤖 AI Transcription - Whisper speech-to-text (100% local, offline)
- 📝 AI Summaries - BART transformer-based abstractive summarization
- 💬 Q&A with Meetings - Ask questions using semantic search (sentence-transformers)
- 🔍 Search & Browse - Find meetings by keywords or view complete history
- 🔒 100% Private - No data ever leaves your computer
- 💾 Local Storage - Full control over your data
macOS only. You need these installed before proceeding:
-
Python 3.8+
brew install python
-
BlackHole (virtual audio driver)
brew install blackhole-2ch
Or download from: https://existential.audio/blackhole/
-
System libraries (for audio processing)
brew install portaudio ffmpeg
# Clone this repository
git clone <repository-url>
cd zoom-out-agent
# Create virtual environment (recommended)
python3 -m venv venv
source venv/bin/activateFor Apple Silicon (M1/M2/M3 Macs):
CFLAGS="-I/opt/homebrew/include" LDFLAGS="-L/opt/homebrew/lib" pip install -e .For Intel Macs:
pip install -e .zoom-out setupThis will:
- ✅ Verify BlackHole installation
- ✅ Download Whisper model (~150MB)
- ✅ Download BART summarization model (~1.6GB, first run only)
- ✅ Download sentence-transformers model (~90MB)
- ✅ Create data directories
First-time setup takes 2-5 minutes to download models. Subsequent runs are instant.
To hear audio while recording, you need to create a Multi-Output Device:
- Open Audio MIDI Setup (Applications → Utilities → Audio MIDI Setup)
- Click the + button → Create Multi-Output Device
- Check both:
- ✅ BlackHole 2ch
- ✅ Your speakers (e.g., "MacBook Pro Speakers")
- Right-click the Multi-Output Device → Use This Device For Sound Output
Now system audio plays through your speakers AND gets captured for transcription.
Basic usage:
zoom-out recordThe tool will:
- Start recording system audio
- Show real-time transcription
- Wait for you to press
Ctrl+Cto stop - Generate and save a summary
With options:
# Add a custom title
zoom-out record --title "Sprint Planning Meeting"
# Use a better model (slower but more accurate)
zoom-out record --model small
# Limit recording duration (in seconds)
zoom-out record --duration 600Available Whisper models: tiny, base (default), small, medium, large
Here's what you'll see when recording a meeting:
zoom-out record --title 'My test zoom meeting 7'Initializing meeting transcriber...
2025-12-21 14:27:10,864 - meeting_transcriber.transcriber - INFO - Loading Whisper model: base
2025-12-21 14:27:11,214 - meeting_transcriber.transcriber - INFO - Whisper model loaded successfully
2025-12-21 14:27:13,568 - meeting_transcriber.summarizer - INFO - Loading transformer summarization model (first time may take a few minutes)...
Device set to use cpu
2025-12-21 14:27:14,563 - meeting_transcriber.summarizer - INFO - Transformer summarization ready
🎙️ Recording from BlackHole 2ch...
Press Ctrl+C to stop recording
2025-12-21 14:27:14,564 - meeting_transcriber.audio_capture - INFO - Found device: BlackHole 2ch at index 1
2025-12-21 14:27:14,622 - meeting_transcriber.audio_capture - INFO - Started recording audio
2025-12-21 14:27:14,623 - meeting_transcriber.transcriber - INFO - Starting real-time transcription
2025-12-21 14:27:44,596 - meeting_transcriber.transcriber - INFO - Transcribing audio file: /var/folders/.../tmp.wav
📝 Let's kick off. I wanted to start out with some reminders. First, we have a book club
coming up on inspired in four weeks on August 7th. I just reread it myself...
📝 Yeah, also believe to be important. So it's nice to have another voice explaining all
of that. So please do read that...
^C
Stopping recording...
📊 Generating summary...
============================================================
Meeting ID: 20251221_142934
============================================================
📋 Summary:
The CEO of Salesforce.com has a book club coming up on inspired in four weeks on August
7th. The book is highly aligned with how I think about product management and does a good
job of explaining why some of these things are important. I want to ensure good will with
that team and follow up promptly with meetings with these customers. Third reminder, we've
got a little engagement survey. I'm going to run this once a month in Q3.
🔑 Key Points:
1. The CEO of a tech company held a meeting with his employees on Tuesday
2. "I wanted to start out with some reminders. First we have a book club coming up..."
3. "I want to ensure good will with that team and follow up promptly with meetings..."
4. Book club meeting scheduled for August 7th on "Inspired"
5. Engagement survey to be run monthly in Q3
✅ Meeting saved successfully!
Transcript: 1493 characters
Summary: 433 characters
What happens:
- Models load (Whisper + BART transformer)
- Real-time transcription shows as audio is captured
- Press Ctrl+C to stop
- AI generates intelligent summary and key points
- Everything saved locally
View a specific meeting:
zoom-out show 20251221_142934
================================================================================
Meeting: My test zoom meeting 7
Date: 2025-12-21T14:29:34.129675
================================================================================
📋 Summary:
The CEO of Salesforce.com has a book club coming up on inspired in four weeks on August 7th. The book is highly aligned with how. I think about product management and does a good job of explaining why some of these things are important. I want to ensure good will with that team and follow up promptly with meetings with these customers. Third reminder, we've got a little engagement survey. I'm going to run this once a month in Q3.
🔑 Key Points:
1. The CEO of a tech company held a meeting with his employees on Tuesday. He asked them to take a moment to remind them of some of the things they need to do to succeed.
2. "I wanted to start out with some reminders. First
3. we have a book club coming up on inspired in four weeks on August 7th" "I want to ensure good will with that team and follow up promptly with meetings with these customers" "Please do follow up on that"
4. we have a book club coming up on inspired in four weeks on August 7th. I just reread it myself. It's a it's a good read
5. " she said. "It's highly aligned with how. I think about product management"List all recordings:
zoom-out list
📚 Stored Meetings:
================================================================================
ID: 20251220_203455
Title: My test youtube video 4
Date: 2025-12-20 20:34:55
--------------------------------------------------------------------------------
ID: 20251220_204352
Title: My test youtube video 5
Date: 2025-12-20 20:43:52
--------------------------------------------------------------------------------View summary:
zoom-out show 20251220_143022View full transcript:
zoom-out show 20251220_143022 --fullUse natural language to query meeting content:
# Check if you were mentioned
zoom-out ask 20251220_143022 "Was my name mentioned?"
# Find decisions
zoom-out ask 20251220_143022 "What did we decide about the budget?"
# Extract action items
zoom-out ask 20251220_143022 "What are my action items?"
# Find who said something
zoom-out ask 20251220_143022 "Who volunteered to lead the project?"How it works:
- Uses local AI (sentence-transformers) for semantic search
- Finds relevant segments even without exact keyword matches
- Shows similarity scores (0.0 to 1.0)
- Fallback to keyword search if semantic search finds nothing
Search by keyword:
zoom-out search "budget"
zoom-out search "deadline"Delete a meeting:
zoom-out delete 20251220_143022List audio devices:
zoom-out devicesUse this to verify BlackHole is installed and available.
# 1. Start Zoom and join meeting
# 2. Start recording
zoom-out record --title "Client Kickoff Call"
# 3. During the call, you'll see real-time transcription
# 4. When call ends, press Ctrl+C
# 5. View the summary
zoom-out list
zoom-out show <meeting-id>
# 6. Ask specific questions
zoom-out ask <meeting-id> "What are the deliverables?"
zoom-out ask <meeting-id> "When is the next meeting?"# 1. Play podcast in browser/app
# 2. Record with a descriptive title
zoom-out record --title "Tim Ferriss Podcast Ep 500"
# 3. Let it run, press Ctrl+C when done
# 4. Search for specific topics later
zoom-out search "productivity tips"# Find all meetings about "performance"
zoom-out search "performance"
# Ask questions across meetings
zoom-out ask 20251215_100000 "What metrics did we discuss?"
zoom-out ask 20251218_140000 "What was the performance improvement?"No internet required (except for initial model downloads):
- ✅ Whisper transcription runs on your CPU/GPU
- ✅ Summarization uses local AI (BART transformers)
- ✅ Q&A uses local AI model (sentence-transformers)
- ✅ No cloud APIs, no data transmission
- ✅ Perfect for confidential meetings
zoom-out-agent/
└── data/
├── transcripts/ # .txt files with full transcripts
│ └── 20251220_143022.txt
├── summaries/ # .json files with summaries
│ └── 20251220_143022.json
└── index.json # Meeting index
You have complete control:
- All files are plain text (JSON and TXT)
- Easy to back up, search, or delete
- No proprietary formats
- No telemetry or tracking
- 🔐 Keep
./data/directory permissions restrictive - 🗑️ Delete old recordings you no longer need
- 📝 Document which meetings you've recorded
- ⚖️ Follow your organization's data retention policies
YOU MUST OBTAIN CONSENT BEFORE RECORDING.
- 📋 Always get permission from all participants before recording
- ⚖️ Know your local laws:
- One-party consent: You can record if you're part of the conversation (most US states)
- Two-party/all-party consent: Everyone must agree (California, Florida, etc.)
- International: Laws vary by country
- 🏢 Corporate policies: Follow your company's recording rules
- 🎓 Educational settings: Get instructor/student permission
BY USING THIS SOFTWARE, YOU AGREE:
- ✅ You are solely responsible for legal compliance
- ✅ You will obtain all necessary consents
- ✅ The authors are not liable for any misuse or legal issues
- ✅ You will not use this for illegal or unethical purposes
When in doubt, ask for permission!
Fix:
- Verify BlackHole is installed:
zoom-out devices - Check that Multi-Output Device is selected as system output
- Make sure audio is actually playing
- Try:
zoom-out record --device "BlackHole 2ch"
Fix:
brew install portaudio
CFLAGS="-I/opt/homebrew/include" LDFLAGS="-L/opt/homebrew/lib" pip install pyaudioFix:
brew install ffmpegSolutions:
- Use a smaller model:
zoom-out record --model tiny - For M1/M2/M3 Macs, Whisper can use Apple's Neural Engine
- Consider upgrading RAM (Whisper uses 1-10GB depending on model)
Fix:
- Open System Settings → Privacy & Security → Microphone
- Enable for Terminal (or your terminal app)
| Model | Size | RAM | Speed | Accuracy | Use Case |
|---|---|---|---|---|---|
tiny |
75 MB | ~1 GB | Very Fast | Low | Quick drafts |
base |
150 MB | ~1 GB | Fast | Good | Default - Best balance |
small |
500 MB | ~2 GB | Medium | Better | Important meetings |
medium |
1.5 GB | ~5 GB | Slow | High | High accuracy needed |
large |
3 GB | ~10 GB | Very Slow | Best | Professional transcription |
Change model:
zoom-out record --model small# Use a different location
zoom-out record --data-dir ~/Documents/MeetingRecordings
# All commands support --data-dir
zoom-out list --data-dir ~/Documents/MeetingRecordingsCreate a shell script for long recordings:
#!/bin/bash
cd ~/zoom-out-agent
source venv/bin/activate
zoom-out record --title "$1" --duration 3600Save as record-meeting.sh, make executable:
chmod +x record-meeting.sh
./record-meeting.sh "Daily Standup"zoom-out-agent/
├── meeting_transcriber/ # Main package
│ ├── cli.py # Command-line interface
│ ├── audio_capture.py # BlackHole audio recording
│ ├── transcriber.py # Whisper integration
│ ├── summarizer.py # BART transformer summarization
│ └── storage.py # Local file management
├── data/ # Your recordings (created on first run)
│ ├── transcripts/
│ ├── summaries/
│ └── index.json
├── requirements.txt # Python dependencies
├── setup.py # Package installer
└── README.md # This file
Dependencies:
- openai-whisper - Speech recognition (local AI model)
- transformers + torch - BART abstractive summarization (local AI model)
- sentence-transformers - Semantic search (local AI model)
- pyaudio - Audio recording
- click - CLI framework
Models downloaded on first run:
- Whisper
basemodel: ~150 MB - BART
facebook/bart-large-cnn: ~1.6 GB - sentence-transformers
all-MiniLM-L6-v2: ~90 MB
Total storage: ~1.85 GB + your recordings
Contributions welcome! Areas for improvement:
- Windows/Linux support
- Web UI for browsing meetings
- Export to PDF/Word
- Speaker diarization (identify who said what)
- Live meeting notes during recording
- Integration with calendar apps
To contribute:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License - See LICENSE file for details.
- OpenAI Whisper - Local speech-to-text model
- BlackHole - Virtual audio driver for macOS
- sentence-transformers - Semantic search models
Issues? Open an issue on GitHub with:
- Your macOS version
- Python version (
python --version) - Error messages
- Steps to reproduce
Questions? Check existing issues or start a discussion.
Made with ❤️ for privacy-conscious note-takers