A fully local Google Meet transcription bot for macOS (Apple Silicon).
- Joins Google Meet as a guest bot — no Google account required
- Captures audio from both remote participants (via BlackHole) and your own mic
- Transcribes in real-time with mlx-whisper — fully on-device, no cloud API
- Speaker diarization — knows who said what (SPEAKER_00, SPEAKER_01, ...)
- Live transcript visible in a web UI at
http://localhost:5050 - Saves full session transcript as
.txt,.json, and.pdf
| Requirement | Notes |
|---|---|
| macOS (Apple Silicon) | M1/M2/M3/M4 — mlx-whisper is Apple Silicon only |
| Python 3.11+ | brew install [email protected] |
| Homebrew | https://brew.sh |
| Google Chrome | Must be installed |
| BlackHole 2ch | Virtual audio loopback — brew install blackhole-2ch |
| HuggingFace account | Free — required for speaker diarization model |
cd meet-transcriber
bash setup.shSpeaker diarization uses pyannote.audio, which requires accepting model terms:
- Create a free account at https://huggingface.co
- Accept terms at https://huggingface.co/pyannote/speaker-diarization-3.1
- Accept terms at https://huggingface.co/pyannote/segmentation-3.0
- Generate a token at https://huggingface.co/settings/tokens (read access)
- Add your token to
transcriber.py:_HF_TOKEN = "your_token_here"
brew install blackhole-2chReboot after installing so macOS registers the new audio device.
open "/Applications/Python 3.14/Install Certificates.command"The bot needs a ChromeDriver binary that matches your Chrome version.
- Check your Chrome version at
chrome://settings/help - Download the matching arm64 ChromeDriver from https://googlechromelabs.github.io/chrome-for-testing/
- Place it at:
~/Library/Application Support/meet_transcriber/chromedriver - Make it executable and sign it:
chmod +x ~/Library/Application\ Support/meet_transcriber/chromedriver xattr -cr ~/Library/Application\ Support/meet_transcriber/chromedriver codesign --sign - --force ~/Library/Application\ Support/meet_transcriber/chromedriver
- Open it once so macOS prompts you to allow it:
Then go to System Settings → Privacy & Security and click Allow Anyway.
open ~/Library/Application\ Support/meet_transcriber/chromedriver
This routes meeting audio through BlackHole so the bot can capture it.
- Open Spotlight → Audio MIDI Setup
- Click + → Create Multi-Output Device
- Check both:
- BlackHole 2ch ← set this as the master clock device
- Your speakers or headphones
- Set the sample rate to 48000 Hz
- Open System Settings → Sound → Output and select the Multi-Output Device
Important: The master clock device in the Multi-Output Device must be BlackHole 2ch (not your headphones), otherwise the sample rate will be forced to your headphone's rate and audio capture will fail.
python server.pyOpens a browser at http://localhost:5050. Paste your Meet URL, choose language, and click Start.
python bot.py --meet https://meet.google.com/xxx-xxxx-xxx --lang auto- Chrome opens as a guest and navigates to the Meet URL
- The bot enters the name "Transcription Bot" and asks to join
- The meeting host admits the bot
- Audio capture starts — two streams are mixed:
- BlackHole: captures audio from other participants (played by the bot's Chrome)
- Mic: captures your own voice (never echoed back by Meet)
- VAD (Silero) detects when someone finishes speaking and triggers transcription
- Pyannote diarizes the chunk (who spoke), Whisper transcribes it (what was said):
[00:00:08] (fr) [SPEAKER_00] Bonjour tout le monde, bienvenue à cette réunion. [00:00:15] (en) [SPEAKER_01] Let's start with the agenda for today. - Stop the session — transcript is saved automatically
--meet URL Google Meet URL (required)
--lang CODE Language code ('fr', 'en', etc.) or 'auto' (default: auto)
--bot-name NAME Display name in the meeting (default: Transcription Bot)
--chunk-seconds N Audio chunk size in seconds (default: 10)
--silence-threshold F RMS cutoff below which chunks are skipped (default: 0.005)
--admission-timeout N Seconds to wait to be admitted (default: 300)
Saved to ~/Documents/transcriptions/:
Text (YYYY-MM-DD_HH-MM_meet.txt):
Google Meet Transcript — 2026-04-07 17:53
============================================================
[00:00:10] (fr) Bonjour tout le monde, bienvenue à cette réunion.
[00:00:20] (en) Let's start with the agenda for today.
JSON (YYYY-MM-DD_HH-MM_meet.json):
[
{"time": "00:00:10", "lang": "fr", "text": "Bonjour tout le monde..."},
{"time": "00:00:20", "lang": "en", "text": "Let's start with the agenda..."}
]PDF export is also available from the web UI.
- Make sure the Multi-Output Device is set as system output in Sound settings
- Make sure BlackHole 2ch is the master clock in the Multi-Output Device (sets sample rate to 48kHz)
- Play audio and verify you hear it through your speakers/headphones
- ChromeDriver version must match Chrome version exactly
- Re-run the
xattr+codesignsteps from Installation - Open chromedriver once manually and allow it in Privacy & Security
- The host needs to admit the bot from the meeting participants panel
- Increase timeout:
--admission-timeout 600
mlx-community/whisper-large-v3-turbo (~800 MB) downloads once to ~/.cache/huggingface/. Pre-download it before your first meeting:
python3 -c "import mlx_whisper, numpy as np; mlx_whisper.transcribe(np.zeros(16000, dtype='float32'), path_or_hf_repo='mlx-community/whisper-large-v3-turbo')"This project is actively evolving. We're looking to add new features and improve the overall experience — contributions, ideas, and feedback are very welcome.
Some directions we're exploring:
- Speaker diarization (who said what)
- Automatic meeting summary generation
- Support for other meeting platforms (Zoom, Teams)
- Zoom and calendar integrations
- Improved noise filtering and audio quality
Feel free to open an issue, submit a pull request, or reach out directly if you want to collaborate.