会議レポート自動生成:Whisper + LLM 100% ローカル
AIによる会議議事録は2つの要素から成ります:音声の文字起こし、およびテキストの要約。問題は、多くのSaaSツールが会議の完全な録音(氏名、数値、戦略など)をサードパーティのサーバーに送信することです。本ガイドでは、Whisperによる文字起こし、決定事項とアクションの抽出を行うOllama LLM、そしてマシン外にデータが一切出ない、完全にローカルで動作する同じパイプラインを構築します。
#センシティブな会議においては、ローカル環境がなぜ必要なのか
会議は、無害なファイルではありません。1時間の録音には、顧客名、金額、人事上の判断、未発表の製品方針、場合によってはGDPR上の個人データが含まれます。この音声をクラウド上の自動議事録サービスに預けることは、そのすべての内容が第三者に転送・処理され、場合によっては保存されることを受け入れることを意味します。
- 実際のプライバシー保護
- 音声と文字起こしのデータは、お使いのパソコン内にとどまります。業務データが、それをログに記録したり学習に利用したりする可能性のある外部サーバーを経由することはありません。
- GDPRへの対応が容易に
- 委託先へのデータ転送はありません。こうした委託先はEU域外にあることも多いですが、転送自体がないため、影響評価の「個人データの転送」に関する検討事項も根本からなくなります。
- 継続的な費用はゼロ
- ユーザーごとのサブスクリプションや、トランスクリプトされた分の課金はございません。機器をセットアップした後、ご希望の数だけ会議を処理できます。
- オフラインでも動作
- 移動中でも、安定した接続のない現場でも、外部から隔てられた部屋での会議でも、インターネットなしで処理を利用できます。
#2段階パイプラインの原理
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 30日間返金対応
AIによる会議議事録の作成は、混同してはならない2つの明確な段階に分けられます。第一段階は音声をテキストに変換することであり、これはOpenAIの音声認識モデルであるWhisperの役割です。Whisperには複数のオープンソース実装があり、すべてローカルで完全に動作します。第二段階は、この生テキストを構造化された文書に変換することであり、これはOllama によって提供されるローカルLLMの役割です。
- 文字起こし(Whisper)
- 入力:音声または動画ファイル。出力:会議全体の書き起こしテキスト。必要に応じてタイムスタンプも付けられます。計算負荷は高いものの、処理自体は機械的です。
- 要約(OllamaのLLM)
- 入力:文字起こし。出力:議事録 — 要約、決定事項、実施すべきアクションとその担当者。ここで、プロンプトが大きな違いを生みます。
2つの工程を分けると、実用的な利点があります。最も時間のかかる文字起こしをやり直さずに、異なるプロンプトで要約を何度でも作り直せます。
#前提条件
- Ollama インストール済み
- デーモンはデフォルトで http://localhost:11434 で待ち受けます。まだOllamaをインストールしていない場合は、ページ下部に掲載されているOllamaのインストールガイドを参照してください。
- 要約用のLLM
- フランス語が得意な9~12BのモデルをQ4_K_Mで使えば(VRAM約7GB)、十分です。Qwen 3.5 9B(コンテキスト長256kで、長い文字起こしに最適)やGemma 4 12Bは、構造化された要約に非常に適した選択肢です。
- Whisper
- ローカル実装には、openai-whisper(シンプル)、faster-whisper(高速)、または whisper.cpp(軽量、GPU不要)があります。本ガイドでは最初の2つを使用します。
- ffmpeg
- ビデオ形式(Teams/Zoom の mp4)の読み取りおよび音声の変換に不可欠です。Whisper はこの機能をバックグラウンドで利用しています。
- ハードウェア
- GPUはWhisperのパフォーマンスを大きく向上させますが、mediumサイズはCPUでも動作します(ただし遅い)。smallモデルには約2GBのVRAMが必要で、large-v3にはそれ以上の容量が必要です。
#ステップ1:会議の音声をWhisperでテキストに変換
最も直接的なインストール方法は openai-whisper パッケージです。これは、すぐに使えるコマンドラインツールを提供します。Python環境にインストールし、システム側にffmpegを用意してください。
その後、文字起こしは1つのコマンドで完了します。モデル、言語(短い会議では検出エラーを避けるため、言語を強制指定します)、およびテキスト出力形式を指定します。
会議全体の内容を含むreunion.txtファイルが生成されます。タイムスタンプ付きの字幕も必要な場合は(特定の箇所を見つけるのに便利です)、--output_format srtを追加してください。すべての形式を一度に生成するには、allを指定します。
1時間の会議の場合、CPUでの文字起こしには時間がかかることがあります。そこで役立つのがfaster-whisperです。CTranslate2を活用した再実装で、同じ品質を保ちながら大幅に高速化します。以下に、文字起こしを行い、そのテキストを保存するPythonスクリプトを示します。
#TeamsやZoomの録音を処理
TeamsやZoomの録画は.mp4形式の動画ファイルです(音声のみの場合は.m4a形式のこともあります)。Whisperはffmpegを利用するため、これらを直接読み込めますが、先に音声トラックを16 kHzのモノラルで抽出するほうが確実で高速です。特にwhisper.cppでは、この形式が必須です。
- -ar 16000
- Whisperが想定するサンプリング周波数である16 kHzにリサンプリングします。48 kHzのままにしておく必要はありません。話し声には不要です。
- -ac 1
- チャンネルをモノラルに統合します。会議の録音を文字起こしする場合、ステレオのままにしておく利点はありません。
- -c:a pcm_s16le
- 非圧縮 WAV を出力します。Whisper の入力として最も安全な形式です。
ファイルはどこにありますか?Teamsでは、録画はOneDrive/SharePointの「Recordings」フォルダに保存されます。処理する前に.mp4をローカルにダウンロードしてください。Zoomでは、ローカル録画はDocuments/Zoomフォルダに保存されます。オプションが有効なら、音声だけのaudio.m4aファイルも別に作成されます。動画を経由せず、このファイルを直接処理対象にしてください。
#ステップ2:ローカルLLMによる要約
文字起こしの生テキストは読みにくく、句読点が適切に付いておらず、構成もなく、繰り返しもあります。これを実用的な議事録に変換するのがローカルLLMです。期待する出力形式について具体的な指示を添えて、テキストをOllamaに送ります。
最も簡単に試すには、文字起こしをパイプでollama runに渡します。モデルにはプロンプトが渡され、その後に会議のテキストが続きます。
繰り返し使う場合は、ポート11434で提供されるOllamaのREST APIを使うのがおすすめです。システムメッセージ(役割と形式)と内容(文字起こし)を明確に分離でき、結果をスクリプトで再利用できます。
#決定事項と対応事項をわかりやすく出力するプロンプト
これは、AIで質の高い議事録を作成するうえでの核心です。曖昧なプロンプトでは長々とした要約になりますが、構造化されたプロンプトなら、そのまま使える文書が得られます。鍵は、セクションに分けた明確な出力形式を指定し、決定事項と今後行うべきことをはっきり区別するようモデルに求めることです。
- 形式を指定する
- セクション見出し(##)によって、モデルは情報を混ぜ合わせるのではなく、分類するよう促されます。会議が変わっても、統一された形式の出力が得られます。
- ハルシネーション防止ルール
- 「実際に述べられたことだけを取り上げてください」という指示と「明示されていない」という表記により、LLMが存在しない期限や担当者を作り出すリスクを大幅に減らせます。
- 担当者を角括弧で表記
- 各アクションの先頭に[担当者]を明記すると、議事録をすぐに実行に移せる形にできます。誰が何をするのかが一目でわかります。
#パイプライン全体を自動化
2つのステップが検証できたら、単一のスクリプトで連続実行します。会議のファイルを与えると、Markdown形式の議事録を生成します。これにより、単なる操作が日常のツールへと変わります。
synthese.py を修正して、引数として渡されたファイルを読み取り、結果を標準出力に書き出すようにしてください。これにより、./compte-rendu.sh reunion_teams.mp4 という単一のコマンドで、数分後に Markdown 形式の議事録が表示され、1 バイトもマシン外に送信されません。
#トラブルシューティング
- 文字起こしが英語になってしまう
- Whisperが静かな開始や双言語の入力で言語を誤検出することがあります。常に --language French(または language="fr")を指定してください。
- 固有名詞の表記ミス
- よくあることです。Whisperは発音から推測します。要約用のプロンプトに簡単な修正手順(「明らかに誤って文字起こしされた名前を修正してください」)を追加するか、名前の用語集をLLMに提供してください。
- 会議が長すぎてコンテキストに収まらない
- トランスクリプションを約3,000語のブロックに分割し、それぞれを要約してから、要約を総合的にまとめてください。また、VRAMが許容する範囲であれば、Ollamaの呼び出し時にnum_ctxを増やすようにしてください。
- Whisperが非常に遅い
- faster-whisperに切り替え、vad_filterを有効にし、モデルを小さくする(medium → small)か、GPUでの実行に切り替えてください。GPUのないマシンでは、whisper.cppもよい選択肢です。
- 声が重なる
- Whisperは話者の区別を行いません。誰が何を言ったかを記録するためには、事前にダイアリゼーション(例:pyannote)のステップを追加する必要があります。これは別途扱う必要があります。
#さらに詳しく
このガイドは、当サイトですでに詳しく解説した2つの構成要素を組み合わせています。各手順をさらに詳しく理解したり、全体の安全性を確保したりするには、以下を参照してください:
- Whisper + Ollama:100%ローカルで動く文字起こし・要約パイプライン
- 音声処理部分を詳しく解説するガイドです。Whisperの実装の種類と、1時間の会議を最初から最後まで処理する例を紹介しています。
- 量子化の選択(Q4、Q5、Q8、FP16)
- 議事録の品質を落とさずに、14Bまたは32Bの要約モデルをGPUのメモリに収めるため。
- ローカルLLMとGDPR:企業における個人データのコンプライアンス
- 規制面の補足です。会議データをローカルで処理するとコンプライアンス対応が容易になります。このガイドでは、それでも文書化が必要な事項を詳しく説明します。
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。