中級 12 分デスクトップ

会議レポート自動生成:Whisper + LLM 100% ローカル

AIによる会議議事録は2つの要素から成ります:音声の文字起こし、およびテキストの要約。問題は、多くのSaaSツールが会議の完全な録音(氏名、数値、戦略など)をサードパーティのサーバーに送信することです。本ガイドでは、Whisperによる文字起こし、決定事項とアクションの抽出を行うOllama LLM、そしてマシン外にデータが一切出ない、完全にローカルで動作する同じパイプラインを構築します。

著者 Marie L.·更新 2026-08-27·Windows・macOS・Linuxでテスト済み

#センシティブな会議においては、ローカル環境がなぜ必要なのか

会議は、無害なファイルではありません。1時間の録音には、顧客名、金額、人事上の判断、未発表の製品方針、場合によってはGDPR上の個人データが含まれます。この音声をクラウド上の自動議事録サービスに預けることは、そのすべての内容が第三者に転送・処理され、場合によっては保存されることを受け入れることを意味します。

実際のプライバシー保護
音声と文字起こしのデータは、お使いのパソコン内にとどまります。業務データが、それをログに記録したり学習に利用したりする可能性のある外部サーバーを経由することはありません。
GDPRへの対応が容易に
委託先へのデータ転送はありません。こうした委託先はEU域外にあることも多いですが、転送自体がないため、影響評価の「個人データの転送」に関する検討事項も根本からなくなります。
継続的な費用はゼロ
ユーザーごとのサブスクリプションや、トランスクリプトされた分の課金はございません。機器をセットアップした後、ご希望の数だけ会議を処理できます。
オフラインでも動作
移動中でも、安定した接続のない現場でも、外部から隔てられた部屋での会議でも、インターネットなしで処理を利用できます。
i
ローカルでも事前の告知は必要
会議を録音する際には、ローカルでもルールを守る必要があります。参加者に知らせ、同意を得てください。ローカルで処理すればデータ転送の問題は解決できますが、録音への同意の問題は解決できません。

#2段階パイプラインの原理

ローカルAIキット

お使いのマシンで、プライベートかつ無料の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にはそれ以上の容量が必要です。
→
どのWhisperモデルを選択すべきか
フランス語では、明瞭な音声ならsmallでもすでに良好な結果が得られます。複数人が話す会議や音質があまりよくない場合はmediumに、速度より文字起こしの品質を優先する場合(アクセント、専門用語、発話の重なり)はlarge-v3に切り替えてください。

#ステップ1:会議の音声をWhisperでテキストに変換

最も直接的なインストール方法は openai-whisper パッケージです。これは、すぐに使えるコマンドラインツールを提供します。Python環境にインストールし、システム側にffmpegを用意してください。

インストール
# ffmpeg (Debian/Ubuntu)
sudo apt install ffmpeg

# Whisper (dans un venv de préférence)
pip install -U openai-whisper

その後、文字起こしは1つのコマンドで完了します。モデル、言語(短い会議では検出エラーを避けるため、言語を強制指定します)、およびテキスト出力形式を指定します。

ターミナル
whisper reunion.mp3 \
  --model medium \
  --language French \
  --output_format txt \
  --output_dir ./transcriptions

会議全体の内容を含むreunion.txtファイルが生成されます。タイムスタンプ付きの字幕も必要な場合は(特定の箇所を見つけるのに便利です)、--output_format srtを追加してください。すべての形式を一度に生成するには、allを指定します。

1時間の会議の場合、CPUでの文字起こしには時間がかかることがあります。そこで役立つのがfaster-whisperです。CTranslate2を活用した再実装で、同じ品質を保ちながら大幅に高速化します。以下に、文字起こしを行い、そのテキストを保存するPythonスクリプトを示します。

transcrire.py
from faster_whisper import WhisperModel

# device="cuda" si GPU NVIDIA, sinon "cpu"
model = WhisperModel("medium", device="cuda", compute_type="float16")

segments, info = model.transcribe(
    "reunion.mp3",
    language="fr",
    vad_filter=True,   # coupe les silences, gagne du temps
)

with open("reunion.txt", "w", encoding="utf-8") as f:
    for seg in segments:
        f.write(seg.text.strip() + "\n")

print(f"Langue détectée : {info.language} — durée : {info.duration:.0f}s")
→
vad_filter オプション
VADフィルター(音声区間検出)は、文字起こしの前に無音区間を除去します。発言の合間や待ち時間が多い実際の会議では、必要な文字起こし内容の品質を損なわずに、処理を大幅に高速化できます。

#TeamsやZoomの録音を処理

TeamsやZoomの録画は.mp4形式の動画ファイルです(音声のみの場合は.m4a形式のこともあります)。Whisperはffmpegを利用するため、これらを直接読み込めますが、先に音声トラックを16 kHzのモノラルで抽出するほうが確実で高速です。特にwhisper.cppでは、この形式が必須です。

.mp4ファイルから音声を抽出
ffmpeg -i reunion_teams.mp4 \
  -ar 16000 -ac 1 \
  -c:a pcm_s16le \
  reunion.wav
-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ファイルも別に作成されます。動画を経由せず、このファイルを直接処理対象にしてください。

!
クラウドSaaSで処理しないでください
提供元のAI(Teams Premium、Zoom AI Companion)にサーバー側で議事録を生成させてしまうと、ローカルで処理する意義が失われます。未加工のファイルを取得し、自分のパソコンで処理してください。情報が一切漏れないことを保証するには、これが唯一の方法です。

#ステップ2:ローカルLLMによる要約

文字起こしの生テキストは読みにくく、句読点が適切に付いておらず、構成もなく、繰り返しもあります。これを実用的な議事録に変換するのがローカルLLMです。期待する出力形式について具体的な指示を添えて、テキストをOllamaに送ります。

最も簡単に試すには、文字起こしをパイプでollama runに渡します。モデルにはプロンプトが渡され、その後に会議のテキストが続きます。

短時間で要約
ollama run qwen3.5:9b "Résume ce compte rendu de réunion en français, \
en listant les points clés, les décisions et les actions à mener. \
Voici la transcription :

$(cat reunion.txt)"

繰り返し使う場合は、ポート11434で提供されるOllamaのREST APIを使うのがおすすめです。システムメッセージ(役割と形式)と内容(文字起こし)を明確に分離でき、結果をスクリプトで再利用できます。

synthese.py
import requests

transcript = open("reunion.txt", encoding="utf-8").read()

SYSTEM = """Tu es un assistant qui rédige des comptes rendus de réunion clairs et concis en français.
Tu ne inventes rien : tu ne t'appuies que sur la transcription fournie."""

resp = requests.post("http://localhost:11434/api/chat", json={
    "model": "qwen3.5:9b",
    "stream": False,
    "messages": [
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": PROMPT + "\n\n---\n" + transcript},
    ],
})

print(resp.json()["message"]["content"])
i
コンテキストウィンドウに注意
1時間の会議では、8,000〜12,000語に達することも珍しくありません。モデルのコンテキスト長(num_ctx)が十分か確認してください。収まりきらない場合は、文字起こしをセクションに分け、各部分を要約してから最後に全体をまとめてください。小規模なmap-reduceパイプラインです。

#決定事項と対応事項をわかりやすく出力するプロンプト

これは、AIで質の高い議事録を作成するうえでの核心です。曖昧なプロンプトでは長々とした要約になりますが、構造化されたプロンプトなら、そのまま使える文書が得られます。鍵は、セクションに分けた明確な出力形式を指定し、決定事項と今後行うべきことをはっきり区別するようモデルに求めることです。

要約用プロンプト
À partir de la transcription de réunion ci-dessous, produis un compte rendu structuré en français, en respectant EXACTEMENT ce format :

## Résumé
Trois à cinq phrases sur l'objet et les conclusions de la réunion.

## Décisions prises
- Une puce par décision actée, formulée clairement.

## Actions à mener
- [Responsable] Action précise — échéance si mentionnée.

## Points en suspens
- Sujets évoqués sans conclusion, à traiter plus tard.

Règles :
- Ne reprends que ce qui est réellement dit dans la transcription.
- Si le responsable ou l'échéance d'une action n'est pas mentionné, écris « non précisé ».
- Reste factuel, pas de reformulation marketing.
形式を指定する
セクション見出し(##)によって、モデルは情報を混ぜ合わせるのではなく、分類するよう促されます。会議が変わっても、統一された形式の出力が得られます。
ハルシネーション防止ルール
「実際に述べられたことだけを取り上げてください」という指示と「明示されていない」という表記により、LLMが存在しない期限や担当者を作り出すリスクを大幅に減らせます。
担当者を角括弧で表記
各アクションの先頭に[担当者]を明記すると、議事録をすぐに実行に移せる形にできます。誰が何をするのかが一目でわかります。
→
同じ文字起こしで複数のモデルを試してください
文字起こしはすでに済んでいるので、モデルの比較に費用はかかりません。同じreunion.txtを使い、まずQwen 3.5 9Bで、次にGemma 4 12Bで要約処理を再実行してください。どちらがフランス語で対応事項をよりうまく整理できるか、すぐに分かります。

#パイプライン全体を自動化

2つのステップが検証できたら、単一のスクリプトで連続実行します。会議のファイルを与えると、Markdown形式の議事録を生成します。これにより、単なる操作が日常のツールへと変わります。

compte-rendu.sh
#!/usr/bin/env bash
set -euo pipefail

INPUT="$1"                 # reunion.mp4 ou reunion.mp3
BASE="$(basename "${INPUT%.*}")"

# 1. Extraire l'audio en 16 kHz mono
ffmpeg -y -i "$INPUT" -ar 16000 -ac 1 -c:a pcm_s16le "$BASE.wav"

# 2. Transcrire
whisper "$BASE.wav" --model medium --language French \
  --output_format txt --output_dir .

# 3. Synthétiser avec le LLM local
python synthese.py "$BASE.txt" > "$BASE-compte-rendu.md"

echo "Compte rendu prêt : $BASE-compte-rendu.md"

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:企業における個人データのコンプライアンス
規制面の補足です。会議データをローカルで処理するとコンプライアンス対応が容易になります。このガイドでは、それでも文書化が必要な事項を詳しく説明します。
このガイドは役に立ちましたか?

ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。