ローカルWhisperだけでMTG音声をスマホ字幕化
macOSローカル処理クラウドAPI不使用
オンラインMTGのPC音声を、ローカルのWhisper(whisper.cpp)だけでリアルタイム日本語字幕化。 同じWi-Fi上のスマホをそのまま字幕ディスプレイにします。 画面キャプチャ不使用、音声・テキストとも外部送信なしで完結。
文字起こしは手元のMacで完結。会議の音声もテキストも外部には一切送信しません。
macOSのLive Captionsは画面キャプチャ経由のため、会議アプリ側のアンチキャプチャ(DRM系)制限に阻まれることがあります。mtg-captionsは音声出力を仮想オーディオで分岐させるアプローチのため、この制限を受けず、字幕用に別アカウントで二重参加する必要もありません。
同じWi-Fi上のブラウザからポーリングでアクセスするだけ。専用アプリのインストールは不要です。
マイク入力をBlackHole 2ch側にミックスして流し込めば、会議相手だけでなく自分の発言もまとめて字幕化できます。
画面OCR(オンデバイス処理)や手動辞書から候補語を集め、Whisperが誤認識しやすい社内用語・製品名・人名を後段で補正します。
発言から字幕がスマホに出るまでの遅延をチューニング済み。無音区間のハルシネーション字幕も構造フィルタで除去します。
[会議アプリの出力音声]
→ macOS Multi-Output Device(AirPods + BlackHole 2ch)
→ AirPods(自分が聞く用)
→ BlackHole 2ch(仮想オーディオ)
→ whisper-stream(ローカルWhisper, リアルタイム文字起こし)
→ transcript.txt に逐次追記
→ server.py(Pythonローカルサーバー, ポーリング配信)
→ スマホのブラウザ(同一Wi-Fi, LAN経由)音声ルーティングはmacOS標準の「複数出力装置」機能でAirPods(自分の耳用)とBlackHole 2ch(仮想オーディオ、キャプチャ用)に分岐。文字起こしはHomebrewのwhisper-cpp(whisper-streamコマンド、モデルはggml-small.bin)。配信はPython標準ライブラリのみの自作HTTPサーバーで、スマホ側は/captions?since=<offset>を1秒間隔でポーリングするだけです。
1. リポジトリをクローン
git clone https://github.com/ymatsuza/mtg-captions.git && cd mtg-captions2. セットアップ手順に従う
依存(whisper-cpp、BlackHole 2ch)のインストールと音声ルーティング設定は、リポジトリのREADME.mdを参照してください。
Turn your phone into a live MTG caption display, using only local Whisper
macOSLocal processingNo cloud API
Captures your PC's meeting audio and transcribes it in real time with a fully local Whisper (whisper.cpp) — no screen capture, no cloud API. Any phone on the same Wi-Fi becomes a live caption display.
Transcription happens entirely on your Mac. Neither audio nor text ever leaves your machine.
macOS Live Captions relies on screen capture, which some meeting apps block with anti-capture (DRM-style) restrictions. mtg-captions taps the audio output through a virtual device instead, so it isn't affected — and you don't need a second account just to join for captions.
Just open a browser on the same Wi-Fi and poll the server — no app install needed.
Route your microphone into the same virtual audio device to caption both sides of the conversation, not just the other participants.
Pulls candidate terms from on-device screen OCR or a manual dictionary to fix up names and jargon Whisper tends to mishear.
Streaming step/window parameters are tuned for low perceived delay, with a structural filter to drop Whisper's silence hallucinations.
[Meeting app's output audio]
→ macOS Multi-Output Device (AirPods + BlackHole 2ch)
→ AirPods (for you to listen)
→ BlackHole 2ch (virtual audio)
→ whisper-stream (local Whisper, real-time transcription)
→ appended to transcript.txt
→ server.py (Python local server, polling delivery)
→ phone's browser (same Wi-Fi, over LAN)Audio routing uses macOS's built-in Multi-Output Device to split sound between your AirPods and BlackHole 2ch (virtual audio, for capture). Transcription uses Homebrew's whisper-cpp (whisper-stream, with the ggml-small.bin model). Delivery is a small HTTP server written with the Python standard library only; the phone polls /captions?since=<offset> once a second.
1. Clone the repo
git clone https://github.com/ymatsuza/mtg-captions.git && cd mtg-captions2. Follow the setup steps
Installing dependencies (whisper-cpp, BlackHole 2ch) and setting up audio routing is covered in the repository's README.md.
mtg-captions is a free, open-source tool (MIT License) built in personal time. Sponsorships are greatly appreciated.