mtg-captions

ローカルWhisperだけでMTG音声をスマホ字幕化

macOSローカル処理クラウドAPI不使用

オンラインMTGのPC音声を、ローカルのWhisper(whisper.cpp)だけでリアルタイム日本語字幕化。 同じWi-Fi上のスマホをそのまま字幕ディスプレイにします。 画面キャプチャ不使用、音声・テキストとも外部送信なしで完結。

GitHub で見る インストール

mtg-captions を選ぶ理由

完全ローカル、クラウドAPI不使用

文字起こしは手元のMacで完結。会議の音声もテキストも外部には一切送信しません。

画面キャプチャ不使用

macOSのLive Captionsは画面キャプチャ経由のため、会議アプリ側のアンチキャプチャ(DRM系)制限に阻まれることがあります。mtg-captionsは音声出力を仮想オーディオで分岐させるアプローチのため、この制限を受けず、字幕用に別アカウントで二重参加する必要もありません。

余っているスマホがそのまま字幕ディスプレイに

同じWi-Fi上のブラウザからポーリングでアクセスするだけ。専用アプリのインストールは不要です。

自分の発言もミックス可能(任意)

マイク入力をBlackHole 2ch側にミックスして流し込めば、会議相手だけでなく自分の発言もまとめて字幕化できます。

固有名詞・専門用語の語彙補正(任意)

画面OCR(オンデバイス処理)や手動辞書から候補語を集め、Whisperが誤認識しやすい社内用語・製品名・人名を後段で補正します。

体感レイテンシ1秒程度まで調整済み

発言から字幕がスマホに出るまでの遅延をチューニング済み。無音区間のハルシネーション字幕も構造フィルタで除去します。

全体構成

[会議アプリの出力音声]
    → 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-cppwhisper-streamコマンド、モデルはggml-small.bin)。配信はPython標準ライブラリのみの自作HTTPサーバーで、スマホ側は/captions?since=<offset>を1秒間隔でポーリングするだけです。

インストール

1. リポジトリをクローン

git clone https://github.com/ymatsuza/mtg-captions.git && cd mtg-captions

2. セットアップ手順に従う

依存(whisper-cpp、BlackHole 2ch)のインストールと音声ルーティング設定は、リポジトリのREADME.mdを参照してください。

できること

  • PC音声のリアルタイム日本語字幕化 — 会議相手の発言を、余っているスマホの画面に数秒遅れで表示
  • 完全ローカル — 音声もテキストも外部送信なし、文字起こしは手元のMacで完結
  • 画面キャプチャ不使用 — アンチキャプチャ制限に引っかからず、二重参加も不要
  • 自分の発言もミックス可能(任意) — マイク音声を合わせて双方向を字幕化
  • 固有名詞・専門用語の語彙補正(任意) — 画面OCRや手動辞書で誤認識を後段補正

mtg-captions

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.

View on GitHub Install

Why mtg-captions

Fully local, no cloud API

Transcription happens entirely on your Mac. Neither audio nor text ever leaves your machine.

No screen capture

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.

Any spare phone becomes a caption display

Just open a browser on the same Wi-Fi and poll the server — no app install needed.

Mix in your own voice (optional)

Route your microphone into the same virtual audio device to caption both sides of the conversation, not just the other participants.

Vocabulary correction for jargon (optional)

Pulls candidate terms from on-device screen OCR or a manual dictionary to fix up names and jargon Whisper tends to mishear.

Tuned for roughly 1-second latency

Streaming step/window parameters are tuned for low perceived delay, with a structural filter to drop Whisper's silence hallucinations.

Architecture

[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.

Install

1. Clone the repo

git clone https://github.com/ymatsuza/mtg-captions.git && cd mtg-captions

2. Follow the setup steps

Installing dependencies (whisper-cpp, BlackHole 2ch) and setting up audio routing is covered in the repository's README.md.

What it does

  • Real-time Japanese captions from PC audio — shown on a spare phone a few seconds behind
  • Fully local — no audio or text ever leaves your Mac
  • No screen capture — unaffected by anti-capture restrictions, no dual-join needed
  • Mix in your own voice (optional) — caption both sides of the conversation
  • Vocabulary correction for jargon (optional) — via screen OCR or a manual dictionary