Offline meeting transcription for macOS with automatic meeting detection
Project description
Meeting Noter
Offline meeting transcription tool for macOS. Captures both your voice and meeting participants' audio, saves to MP3, and transcribes locally using Whisper.
Features
- No virtual audio devices needed - Uses ScreenCaptureKit (like Notion, Discord)
- Captures both sides - Your mic + system audio (meeting participants)
- Offline transcription - Uses Whisper locally, no API calls
- Auto-detection - Detects active meetings (Zoom, Teams, Meet, Slack)
- Multiple interfaces - Menu bar app, desktop GUI, or CLI
- Auto-segmentation - One file per meeting (detects silence)
Installation
Option 1: Using pipx (Recommended)
# Install pipx if you don't have it
brew install pipx
pipx ensurepath
# Install meeting-noter
cd /path/to/meeting-noter
pipx install -e .
Option 2: Using a virtual environment
cd /path/to/meeting-noter
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -e .
Then add an alias in your ~/.zshrc:
echo 'alias meeting-noter="/path/to/meeting-noter/.venv/bin/meeting-noter"' >> ~/.zshrc
source ~/.zshrc
Quick Start
1. One-time Setup
meeting-noter setup
This will request Screen Recording permission, which is needed to capture meeting participants' audio.
2. Launch the App
Menu Bar App (recommended):
meeting-noter menubar
Desktop GUI:
meeting-noter gui
CLI Recording:
meeting-noter start "Weekly Standup"
3. Record a Meeting
- The menu bar app auto-detects meetings and prompts to record
- Or manually start recording via the GUI/CLI
- Press Ctrl+C (CLI) or click Stop to end recording
4. Transcribe
Recordings are auto-transcribed by default. Or manually:
# Transcribe the most recent recording
meeting-noter transcribe
# Transcribe a specific file
meeting-noter transcribe recording.mp3
# List all recordings
meeting-noter list
Commands
| Command | Description |
|---|---|
meeting-noter setup |
One-time setup (Screen Recording permission) |
meeting-noter menubar |
Launch menu bar app |
meeting-noter gui |
Launch desktop GUI |
meeting-noter start [name] |
Interactive CLI recording |
meeting-noter daemon |
Start background audio capture |
meeting-noter status |
Check daemon status |
meeting-noter stop |
Stop the daemon |
meeting-noter list |
List recent recordings |
meeting-noter transcribe |
Transcribe a recording |
meeting-noter devices |
List audio devices |
Options
start
- First argument: Meeting name (optional, auto-generates timestamp if omitted)
daemon
-o, --output-dir: Where to save recordings (default:~/meetings)-f, --foreground: Run in foreground instead of background-n, --name: Meeting name for the recording
transcribe
-m, --model: Whisper model size (tiny.en, base.en, small.en, medium.en, large-v3)-l, --live: Real-time transcription (experimental)-o, --output-dir: Directory with recordings
list
-n, --limit: Number of recordings to show-o, --output-dir: Directory with recordings
How It Works
┌─────────────────────────────────────┐
│ Your Meeting App │
│ (Zoom/Teams/Meet/Slack) │
└──────────────────┬──────────────────┘
│
┌─────────────┴─────────────┐
▼ ▼
┌─────────┐ ┌─────────────┐
│ Mic │ │ System Audio│
│(default)│ │(ScreenCaptureKit)
└────┬────┘ └──────┬──────┘
│ │
└───────────┬───────────────┘
▼
┌─────────────┐
│Meeting Noter│
│ (capture) │
└──────┬──────┘
│
▼
~/meetings/2024-01-15_Weekly_Standup.mp3
│
▼ (auto or on-demand)
┌─────────────┐
│ Whisper │ (local)
└──────┬──────┘
│
▼
~/meetings/2024-01-15_Weekly_Standup.txt
Permissions Required
- Microphone - For capturing your voice
- Screen Recording - For capturing system audio (meeting participants)
- Grant in: System Settings > Privacy & Security > Screen Recording
- This uses ScreenCaptureKit, the same API used by Notion, Discord, etc.
Troubleshooting
No system audio captured (only my voice)
Screen Recording permission not granted. Go to: System Settings > Privacy & Security > Screen Recording
Enable the toggle for Terminal (or your IDE/app).
Meeting not auto-detected
Meeting detection works for: Zoom, Microsoft Teams, Google Meet, Slack. The meeting window must be open (not minimized).
Transcription is slow
Use a smaller model:
meeting-noter transcribe --model tiny.en
Model sizes:
tiny.en(~75MB) - Fastest, good for most casesbase.en(~150MB) - Better accuracysmall.en(~500MB) - High accuracymedium.en(~1.5GB) - Very high accuracylarge-v3(~3GB) - Best accuracy
Configuration
Config file: ~/.config/meeting-noter/config.json
{
"recordings_dir": "~/meetings",
"transcripts_dir": "~/meetings",
"whisper_model": "tiny.en",
"auto_transcribe": true,
"silence_timeout": 5,
"capture_system_audio": true
}
Requirements
- macOS 12.3+ (for ScreenCaptureKit)
- Python 3.9+
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file meeting_noter-0.3.0.tar.gz.
File metadata
- Download URL: meeting_noter-0.3.0.tar.gz
- Upload date:
- Size: 68.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4045f973f62bc5d8a1f1d3afab8d3686eb139a5271b95a4533b30e79b72448ea
|
|
| MD5 |
123d7c8d3caf342efa218a89a597e871
|
|
| BLAKE2b-256 |
fbbec9a0ceec0026f10366124c26d9277f8b0cafdd661bc89dce1ba479ae5768
|
File details
Details for the file meeting_noter-0.3.0-py3-none-any.whl.
File metadata
- Download URL: meeting_noter-0.3.0-py3-none-any.whl
- Upload date:
- Size: 75.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a86a312c4f060e97feeda3f85a48ab624a2c669da900159f8587dde7764bad8
|
|
| MD5 |
3a8b5c20302ef6959d46a721d52ac67e
|
|
| BLAKE2b-256 |
83d8dc279aa82e6b41093531b89947a8a5f28f20f18a10a0141bd81c342d7670
|