ブログDevelopers

ボットなしの会議メモアプリを作る方法:開発者ガイド

録音するのは通話ではなくコンピューター。アーキテクチャ、各OSの音声API、そして想定より時間がかかる部分をまとめた実践ガイドです。

Reline Team読了目安 14 分
この記事の内容
  1. 2つのアーキテクチャ:通話に入るボットか、コンピューター上での取得か
  2. ローカル取得の仕組み:2つのストリームを分けたまま扱う
  3. 文字起こし:ストリーミング、チャンネル、話者分離の限界
  4. 要約:LLMには文字起こし全体を渡す
  5. 保存、セキュリティ、同意
  6. 処理の流れ:最初から最後まで
  7. 想定より時間がかかる部分
  8. 既存のツールを使うという選択肢
  9. 出典

結論から言うと、会議プラットフォームには入らず、コンピューターを録音します。マイクと、通話が再生するシステム音声の2つのローカルストリームを取得し(macOSはScreenCaptureKitまたはCore Audio taps、WindowsはWASAPIループバック、LinuxはPulseAudioかPipeWireのモニター)、音声認識APIに送り、LLMで文字起こしを要約します。通話に参加者は加わりません。

このガイドは、自分で作りたい開発者や、お金を払っているノートテイカーが実際に何をしているか理解したい人向けです。2つのアーキテクチャ、OSごとのローカル取得の仕組みと必要な権限、そして文字起こし、要約、保存、同意を扱います。ここに出てくるAPIはすべて各ベンダーの公式ドキュメントに基づいており、出典は末尾にまとめ、2026-10-21に確認しました。

2つのアーキテクチャ:通話に入るボットか、コンピューター上での取得か

会議の音声を得る方法は2つあります。ボットはサーバー側のクライアントで、参加者として通話に加わり、プラットフォームからメディアを受け取ります。ローカル取得は利用者のコンピューター上で動き、そのコンピューターがすでに聞いているもの、つまり本人の声はマイク、ほかの全員はシステム出力から録音します。比較的新しい中間の選択肢として、会議をサーバーへストリーミングするプラットフォームのメディアAPIもありますが、どれも1つのプラットフォーム専用です。

通話に参加するボットプラットフォームのメディアAPIローカル取得
参加者から見えるかはい、参加者としてプラットフォーム次第(Meetは同意ダイアログを表示)いいえ
Zoom、Meet、Teamsへの対応プラットフォームごとに個別の連携プラットフォームごとに個別の連携はい、プラットフォームではなくコンピューターを録音
どこで動くか自社サーバー自社サーバー利用者のコンピューターと自社バックエンド
話者の分離プラットフォームが提供することが多いプラットフォームが提供することが多い自分のマイクとそれ以外、その後に話者分離
主なコスト同時会議ごとのサーバー、プラットフォームの承認プラットフォームのクレジットや登録OSごとのネイティブデスクトップアプリ、権限ダイアログ
対面の会議やほかのアプリでの通話いいえいいえはい、コンピューターが聞くものすべて

現在のボット方式に必要なこと

  • Zoom:Meeting SDKは会議に参加でき、ネイティブ環境では生の音声と映像に直接アクセスできます。Zoomのドキュメントによると、2026年3月2日以降、自分のアカウント外の会議に参加するアプリはZAKまたはOBFトークンで認可されるか、RTMSを使う必要があります。
  • Zoom RTMS(Realtime Media Streams)は、参加者ボットなしでライブの音声、映像、文字起こしデータをアプリに送ります。Zoomから購入するクレジットで動き、対象はZoomのみです。
  • Microsoft Teams:リアルタイム音声にはC#または.NETで書いたapplication-hosted media botが必要で、本番ではAzure上のWindows Serverにデプロイし、VMインスタンスごとにパブリックIPアドレスを持たせます。Microsoftはリアルタイムメディアプラットフォームを今もdeveloper previewとしています。
  • Google Meet:Meet Media APIはリアルタイムの音声、映像、参加者データを提供しますが、Developer Previewであり、Googleのドキュメントによると新規登録の受け付けを終了しています。通話中の誰かの同意が必要で、暗号化された会議や透かし入りの会議には接続できません。

どれも間違いではありません。ただ、3つの連携と3つの承認プロセスが必要で、参加者にはボットか同意ダイアログが見えます。どのプラットフォームでも同じように動き、対面の会議やノートPCでの電話にも使える1つの取得経路が欲しいなら、ローカルで取得します。

ローカル取得の仕組み:2つのストリームを分けたまま扱う

ローカルのノートテイカーは2つの入力を同時に録音します。マイク(本人)と、システム出力のループバック(会議アプリが再生するほかの参加者)です。できるだけ長く2つのチャンネルとして分けておきましょう。マイクチャンネルの音はすべて本人なので、分けておくだけで話者の区別が手に入ります。エコー対策にも効きます。Microsoftのドキュメントによると、WASAPIのループバックは主に音響エコーキャンセルのために用意されたものです。ノートPCのスピーカーで聞いていると、マイクにも相手の声が入るため、マイク側にエコーキャンセルをかけてください(ブラウザならgetUserMediaのechoCancellation制約)。そうしないと、相手の発言が文字起こしに2回ずつ出てきます。

macOS:ScreenCaptureKitまたはCore Audio taps

  • ScreenCaptureKitは画面の内容と音声をストリーミングします。SCStreamConfigurationのcapturesAudioをtrueにします(macOS 13以降)。macOS 15以降ではcaptureMicrophoneで同じストリームにマイクも加えられます。画面収録の権限と、Info.plistのNSScreenCaptureUsageDescriptionキーが必要です。
  • Core Audio taps(macOS 14.2以降)は、1つのプロセス、プロセスのグループ、またはシステム全体の出力音声を取得します。CATapDescriptionでタップを定義し、AudioHardwareCreateProcessTapで作成し、AudioHardwareCreateAggregateDeviceで作った機器セットに追加して、その機器をマイクのように読み取ります。
  • タップにはNSAudioCaptureUsageDescriptionキーが必要です。タップを含む機器セットから初めて録音するとき、macOSがシステム音声の録音許可を求めます。管理場所はシステム設定のプライバシーとセキュリティ、画面収録とシステムオーディオ録音で、アプリに音声だけを許可することもできます。
  • マイクは別の権限で、説明文も別に必要です。2つのダイアログ、そして一度「許可しない」を押して何も聞こえなくなった人のためのオンボーディングを設計してください。

Windows:WASAPIループバック

  • レンダーエンドポイントを開き(GetDefaultAudioEndpointでeCaptureの代わりにeRenderを指定)、共有モードのキャプチャストリームをAUDCLNT_STREAMFLAGS_LOOPBACKで初期化します。排他モードのストリームはループバックできません。
  • ループバックにはそのエンドポイントで再生されるミックス全体が入ります。会議アプリだけではないため、通知音や音楽も録音に入ります。
  • イベント駆動のループバックはWindows 10バージョン1703以降で動きます。それより古いビルドでは、Microsoftが説明しているレンダーストリームを使った回避策が必要です。
  • プロセスループバック(ActivateAudioInterfaceAsyncでAUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACKを指定)は、1つのプロセスとその子プロセスの音声を含めたり除外したりできます。たとえば自分のアプリの音を外したいときに使えます。最低要件はWindows 10ビルド20348なので、機能を検出し、使えない場合はエンドポイントのループバックに切り替えてください。
  • 信頼されたオーディオドライバーは、DRMで保護されたストリームのループバック取得を許可しません。Microsoftのループバックのドキュメントには、macOSのような利用者への確認ダイアログの記述がありません。だからこそ、録音中の表示と同意の流れを自分で用意することが重要です。

Linux:PulseAudioとPipeWireのモニターソース

  • PulseAudioでは、各出力デバイス(シンク)に、そのシンクが再生する音を運ぶモニターソースがあります。通話の音声はデフォルトシンクのモニターから、マイクはデフォルトソースから録音します。
  • 現在の主要ディストリビューションの多くはPipeWireとpipewire-pulseを使っています。PipeWireのドキュメントはpipewire-pulseをPulseAudioデーモンの置き換えと説明しているので、PulseAudio APIで書いたコードはそのまま動きます。
  • PipeWireネイティブでは、stream.capture.sink = trueを設定し、target.objectにシンク名を指定すると、キャプチャストリームがシンクのモニターポートを読み取ります。ループバックモジュールの設定例に記載があります。
  • 現場でよく出会う問題が2つあります。サウンドサーバーのないALSAだけの環境にはモニターがありません。また、出力がミュートされているとモニターが無音を返すことがあります。音量レベルを計測し、無音を文字起こしする前に利用者に知らせてください。

ブラウザ:getDisplayMedia、音声はChromiumのみ

  • navigator.mediaDevices.getDisplayMedia({ video: true, audio: true })は、共有する画面、ウィンドウ、タブを利用者に選ばせます。安全なコンテキストとユーザー操作が必要で、呼び出すたびに確認が表示され、権限を保存することはできません。
  • 問題は音声です。MDNの互換性データでは、音声の取得に対応しているのはChromeとEdgeだけで、FirefoxとSafariはこの方法で音声を取得できません。Chromeでは、WindowsとChromeOSで画面全体を共有するとシステム音声全体を取得できますが、macOSとLinuxではタブの音声しか取得できません。
  • つまりMacでは、ブラウザ版のノートテイカーが会議を聞けるのは、会議がChromeかEdgeのタブで開かれ、利用者がそのタブを音声付きで共有したときだけです。ZoomやTeamsのデスクトップアプリの音声には届きません。
  • マイクはgetUserMediaで2本目のトラックとして録音します。共有のリクエストでは映像も要求する必要があるので、文字起こしには音声トラックだけを使います。

文字起こし:ストリーミング、チャンネル、話者分離の限界

会議の最中にWebSocketでストリーミング型の音声認識APIへ音声を送れば、終了時には文字起こしができあがっています。リアルタイムの文字が不要なら、バッチ型APIのほうが簡単です。ベンダー選びよりも、次の判断のほうが結果を左右します。

  • 2チャンネル入力、2つの文字起こし出力。マイクとシステム音声を別々に文字起こしし(APIがマルチチャンネルに対応していれば1本のストリームでも可)、タイムスタンプで統合します。これ以上安上がりな話者分離はありません。
  • 話者分離が返すのは番号で、名前ではありません。たとえばDeepgramのドキュメントでは、単語ごとに番号付きの話者(話者0、話者1)を返し、実際の人物への対応付けはアプリ側に任されています。ストリーミングでは単語ごとの信頼度もありません。名前には別のシグナルが必要です。マイクチャンネルは本人、カレンダーの招待には参加者一覧があり、会議アプリの画面は誰が話しているかを知っています。
  • 話者分離はシステムチャンネルで行います。これは会議のコーデックを通った、相手全員の声が混ざった1つの信号です。声が似ている人や同時に話す人は、同じ話者にまとめられることがあります。
  • 言語:対応言語の一覧と、会議の途中でも自動判定が働くかを確認してください。言語の指定を間違えると、モデルが少し劣る場合よりも文字起こしが崩れます。
  • 再接続:ネットワークは切れます。音声をローカルにバッファし、再接続時に送り直してください。そうしないと、決定が下されたまさにその1分が失われます。

要約:LLMには文字起こし全体を渡す

  • タイムスタンプと話者の区別を含む文字起こしを、切り詰めずにすべて送ります。現在のモデルはコンテキストウィンドウが大きいので、会議がウィンドウを超えるときだけ分割します。
  • 確認できる構造を求めます。決定事項、担当者と期日付きのアクションアイテム、未解決の質問などです。各項目はタイムスタンプまでたどれるようにします。
  • 文字起こしと音声を要約の隣に残します。LLMの要約は誰も言っていないことを書くことがあります。対策はモデルを信じることではなく、すばやく確認できるようにすることです。
  • 要約は会議の終了後に生成し、誰かが文字起こしを編集したら古い要約として印を付けます。

保存、セキュリティ、同意

  • 音声と文字起こしは個人データです。保存時に暗号化し、メモは初期設定で非公開にし、録音の削除方法も含めて保存期間をリリース前に決めておきます。
  • EUの利用者がいる場合は、音声と文字起こしの保存場所と、それを扱う委託先(音声認識、LLM)を把握し、プライバシーポリシーに明記します。
  • ボットがいないということは、誰も録音を告知しないということです。録音中であることを明確に表示し、参加者に伝えるよう利用者に促し、会議のチャットに貼れる1行の告知文を用意します。米国のいくつかの州では全員の同意が必要で、多くの国に独自のルールがあります。これは法的助言ではありません。
  • ローカル取得をローカル処理と言い換えないでください。音声をクラウドの音声認識APIに送るなら、そう明記します。

処理の流れ:最初から最後まで

  1. 会議を検出する(カレンダーの予定が始まる、または会議アプリがマイクを使い始める)か、利用者が録音ボタンを押す。
  2. 初回はマイクとシステム音声の権限を求め、理由を1文で説明する。
  3. マイクとシステムループバックの2つの取得を開始する。両方のレベルを計測し、どちらかが数秒以上無音なら警告する。
  4. 音声認識サービスが求める形式に変換し(サンプルレートとエンコードは各社のドキュメントを確認)、再接続に備えてローカルにバッファしながらストリーミングする。
  5. リアルタイムの文字起こしを表示する。2つのチャンネルをタイムスタンプで統合し、マイクチャンネルを本人としてラベル付けする。
  6. 停止したらバッファを書き出し、ストリームを閉じ、音声と最終的な文字起こしを保存する。
  7. 文字起こし全体をLLMに送って要約とアクションアイテムを作り、タイムスタンプへの参照と一緒に保存する。
  8. 結果を公開する。UI、API、Webhook、またはAIアシスタントが読めるMCPサーバーなど。

想定より時間がかかる部分

  • macOSでの権限まわりの体験と、一度拒否した利用者への対応。
  • 通話中のデバイス変更。ヘッドホンの接続、Bluetoothのヘッドセットプロファイルへの切り替え、デフォルト出力の変更など。
  • macOSとWindowsのインストーラーのコード署名と公証、そして自動アップデート。
  • スリープ、ノートPCを閉じたとき、2時間の会議、長い通話でのディスクとメモリの使用量。
  • ノートPCのスピーカーによるエコーと、出力がミュートされているときの無音。

既存のツールを使うという選択肢

必要なのがノートテイカーの開発ではなく会議メモそのものなら、Reline(reline.so)はすでにこのアーキテクチャで動いています。macOS、Windows、Linux(ベータ)向けのデスクトップアプリがマイクとシステム音声をローカルで録音し、通話にボットは入りません。Webアプリでは、デスクトップのChromeまたはEdgeで画面共有の音声を通じて通話音声を取得します。文字起こし(60以上の言語)、AI要約、保存はクラウドで行われるため、ボットなしではあっても端末内処理ではありません。

アプリではなくデータが欲しい開発者向けに、RelineはMCPサーバー(https://mcp.reline.so/mcp)を提供しています。Claude、ChatGPT、Cursorなどのクライアントが、OAuthまたはワークスペースのAPIキーで認証してメモを検索し、文字起こしやアクションアイテムを読み、メモを作成できます。署名付きWebhookはnote.created、note.summarized、action_items.extractedなど6つのイベントで送信され、タイムスタンプと未加工の本文に対するHMAC-SHA256署名が付きます。

出典

  • Apple, Capturing system audio with Core Audio taps: https://developer.apple.com/documentation/coreaudio/capturing-system-audio-with-core-audio-taps
  • Apple, ScreenCaptureKit: https://developer.apple.com/documentation/screencapturekit
  • Apple Support, Control access to screen and system audio recording on Mac: https://support.apple.com/guide/mac-help/mchld6aa7d23/mac
  • Microsoft, Loopback Recording (WASAPI): https://learn.microsoft.com/windows/win32/coreaudio/loopback-recording
  • Microsoft, AUDIOCLIENT_ACTIVATION_TYPE: https://learn.microsoft.com/windows/win32/api/audioclientactivationparams/ne-audioclientactivationparams-audioclient_activation_type
  • Microsoft, Build application-hosted media bots (Teams): https://learn.microsoft.com/microsoftteams/platform/bots/calls-and-meetings/requirements-considerations-application-hosted-media-bots
  • MDN, MediaDevices.getDisplayMedia(): https://developer.mozilla.org/docs/Web/API/MediaDevices/getDisplayMedia
  • PulseAudio, pa_sink_info (monitor_source): https://freedesktop.org/software/pulseaudio/doxygen/structpa__sink__info.html
  • PipeWire, pipewire-pulse: https://docs.pipewire.org/page_man_pipewire-pulse_1.html
  • PipeWire, Loopback module: https://docs.pipewire.org/page_module_loopback.html
  • Zoom, Meeting SDK: https://developers.zoom.us/docs/meeting-sdk/
  • Zoom, Realtime Media Streams (RTMS): https://developers.zoom.us/docs/rtms/
  • Google, Meet Media API overview: https://developers.google.com/workspace/meet/media-api/guides/overview
  • Deepgram documentation (speaker labels per word): https://developers.deepgram.com/docs
よくある質問

よくあるご質問

ボットを参加させずに会議を録音できますか?
できます。ローカルで取得します。利用者のコンピューターでマイクとシステム音声を録音し、文字起こしします。どのプラットフォームでも通話に参加者は加わりません。ただし、会議の参加者には録音していることを伝える必要があります。
Macでノートテイカー用にシステム音声を取得するには?
macOS 14.2以降ならCore Audio taps(CATapDescription、AudioHardwareCreateProcessTap、機器セット、NSAudioCaptureUsageDescriptionキー)、macOS 13以降ならScreenCaptureKitのcapturesAudioを使います。どちらもプライバシーとセキュリティの画面収録とシステムオーディオ録音で許可します。
Webアプリやブラウザ拡張機能で会議の音声を録音できますか?
Chromium系ブラウザに限られます。getDisplayMediaはChromeとEdgeで音声を返します。macOSとLinuxではタブの音声のみ、WindowsとChromeOSでは画面全体を共有したときにシステム音声全体です。FirefoxとSafariはこの方法で音声を取得できません。
ボットなしで話者の名前を得るには?
話者分離が返すのは番号で、名前ではありません。マイクチャンネルは本人、カレンダーの招待は参加者一覧、会議画面は発言者というように、複数のシグナルを組み合わせます。それがなければ話者1、話者2のままです。
ボットなしで会議を録音するのは合法ですか?
法的に問題になるのはボットの有無ではなく同意です。参加者に録音を伝え、適用される法律に従ってください。米国のいくつかの州では全員の同意が必要で、ほかの国にも独自のルールがあります。これは法的助言ではありません。
自分で作るべきか、既存のツールを使うべきか?
取得そのものが自社の製品なら自作する価値があります。自社ツールでメモを使いたいだけなら、APIを持つボットなしの既存ツールを使いましょう。たとえばRelineは、MCPサーバーと署名付きWebhookでメモと文字起こしを提供しています。
準備ができたらいつでも

ノートを取るのをやめよう。成果を出し始めよう。

個人はずっと無料。インストールは5分。次の会議が自分でノートを書きます。