Ollamaで音声認識・議事録を
完全ローカルで実現する方法
Whisper × Ollama の最強コンビで、会議音声を自動で議事録に変換。
クラウド不要・無料・プライバシー完全保護のAIパイプラインを構築しよう
📋 目次
🏗️ 全体アーキテクチャを理解する
OllamaとWhisperを組み合わせた「完全ローカルAI議事録」の仕組みを把握しよう
なぜOllama単体では音声認識ができないのか?
Ollamaはテキスト生成(LLM)に特化したツールです。音声認識(音声→テキスト変換)は OpenAI Whisper が担当します。この2つを連携させることで、「音声入力 → 文字起こし → AI要約 → 議事録」という完全自動パイプラインが完成します。データはすべて自分のマシン上で処理されるため、機密会議の内容もクラウドに送る必要がありません。
🔄 音声→議事録 完全パイプライン図
完全ローカル処理
音声データが外部サーバーに送られない。機密会議も安心
完全無料
APIコスト一切なし。回数制限なく使い放題
日本語に強い
Whisper large-v3は日本語認識精度が非常に高い
GPU加速対応
NVIDIA GPU があれば数分の音声を数十秒で処理
🎙️ 音声認識エンジン Whisper とは
OpenAIが公開したオープンソースの高精度音声認識モデル。ローカル実装を選ぼう
Whisperはなぜ「最強」なのか?
Whisperは2022年にOpenAIが公開した音声認識モデルで、99言語以上に対応し、日本語の認識精度も非常に高いのが特徴です。クラウド版(OpenAI API)と同じモデルをローカルで動かせるため、月額費用ゼロで業務利用できます。さらに最新の large-v3 モデルは、雑音環境でも高い精度を誇ります。
faster-whisper
開発元:SYSTRAN / Python製
オリジナルWhisperをCTranslate2で高速化したPython実装。同じ精度でメモリ使用量を最大4倍削減。日本語の精度が高く、タイムスタンプも取得できる。初心者に最もおすすめ。
whisper.cpp
開発元:ggerganov / C++製
WhisperをC++で再実装した超軽量版。GPUなしでもCPUだけで高速に動作する。Mac(Apple Silicon)では特に高速。GGUFモデル形式を使用し、Ollamaとも同系統の技術。
Whisper Docker版
開発元:onerahmet / Docker Hub
WhisperをDockerコンテナとして動かすイメージ。REST APIとして音声ファイルをHTTPでポストするだけで文字起こし結果が返ってくる。Open WebUIとの連携が最もスムーズ。
Whisperのoriginal実装(pip install openai-whisper)は動作しますが、速度・メモリ効率の面でfaster-whisperに劣ります。新規構築では特別な理由がない限り faster-whisper を選択してください。
⚙️ faster-whisper のセットアップ
Python環境でのインストールと、Docker版Whisperの起動手順を解説
2つのインストール方法
ローカルPython環境にインストールする方法と、Dockerコンテナとして起動する方法があります。Open WebUIとマイク入力を連携させたい場合はDocker版(REST API方式)が便利です。バッチ処理やスクリプトから呼び出したい場合はPythonライブラリ方式を選びましょう。
🐍 方法① Python ライブラリとしてインストール
🐍 Python 仮想環境を作成する(推奨)
システムのPythonを汚染しないよう、venvで隔離した環境を作成します。Python 3.9以上が必要です。
📦 faster-whisperをインストール
GPU(CUDA)を使う場合は ctranslate2[cuda] もインストールします。CPUのみの場合は不要。
✅ 動作確認
初回実行時はモデルが自動ダウンロードされます(large-v3は約3GB)。ダウンロードは最初の1回のみです。
python3 -m venv ~/whisper-env
source ~/whisper-env/bin/activate
# faster-whisper のインストール
pip install faster-whisper
# GPU使用時(CUDA環境がある場合のみ)
pip install faster-whisper torch torchvision torchaudio –index-url https://download.pytorch.org/whl/cu121
🐋 方法② Docker で Whisper API サーバーを起動
Open WebUIのSTT(音声入力)機能と連携するには、WhisperをOpenAI互換のREST APIサーバーとして動かす方法が最も手軽です。
docker run -d \
–name whisper-api \
-p 9000:9000 \
-e ASR_MODEL=large-v3 \
-e ASR_ENGINE=faster_whisper \
-e ASR_MODEL_PATH=/root/.cache/whisper \
-v whisper-models:/root/.cache/whisper \
onerahmet/openai-whisper-asr-webservice:latest
docker run -d \
–name whisper-api \
–gpus all \
-p 9000:9000 \
-e ASR_MODEL=large-v3 \
-e ASR_ENGINE=faster_whisper \
-v whisper-models:/root/.cache/whisper \
onerahmet/openai-whisper-asr-webservice:latest-gpu
利用可能なモデルを env で切り替える
ASR_MODEL に設定できる値は tiny / base / small / medium / large-v3 です。CPUで使う場合はメモリ節約のため small や medium も選択肢になります(後述の比較表を参照)。
docker logs whisper-api
# テスト:curlでAPIを叩いて文字起こし
curl -X POST http://localhost:9000/asr \
-F “audio_file=@meeting.mp3” \
-F “language=ja” \
-F “output=json”
APIレスポンスに "text": "..." フィールドが含まれていれば起動成功です。ポート9000でWhisper APIが待ち受け状態になっています。Open WebUIとの連携設定は第6章で行います。
📄 音声ファイルから文字起こし実践
Pythonスクリプトとコマンドラインで、実際に会議音声を文字起こしする手順
対応フォーマットは幅広い
faster-whisperはMP3、WAV、M4A、FLAC、MP4(動画から音声抽出)など主要な音声・動画形式に対応しています。Zoom録画のMP4ファイルを直接指定することも可能です。ffmpegがインストールされていれば、より多くのフォーマットをサポートできます。
🐍 Pythonスクリプトで文字起こし(タイムスタンプ付き)
# モデルのロード
# device: “cuda” (GPU) または “cpu”
# compute_type: GPU→”float16″, CPU→”int8″
model = WhisperModel(“large-v3”, device=“cpu”, compute_type=“int8”)
# 文字起こし実行
segments, info = model.transcribe(
“meeting.mp3”,
language=“ja”, # 日本語を指定
beam_size=5, # 精度向上
vad_filter=True, # 無音部分をスキップ
vad_parameters=dict(min_silence_duration_ms=500)
)
# 結果をファイルに保存
with open(“transcript.txt”, “w”, encoding=“utf-8”) as f:
for segment in segments:
timestamp = f”[{segment.start:.1f}s → {segment.end:.1f}s]”
f.write(f”{timestamp} {segment.text}\n”)
print(f”{timestamp} {segment.text}”)
print(f”\n✅ 文字起こし完了!言語: {info.language}, 確信度: {info.language_probability:.2f}”)
vad_filter=True がポイント
VAD(Voice Activity Detection)フィルターを有効にすると、無音区間や雑音部分を自動でスキップし、処理速度と精度が大幅に向上します。会議録音には必ず有効にしましょう。
🗣️ 話者分離(誰が話しているか識別)
複数人の会議では、誰の発言かを識別する話者ダイアライゼーションが便利です。pyannote.audioライブラリを組み合わせることで実現できます。
pip install pyannote.audio
# 注意: Hugging Faceにて
# pyannote/speaker-diarization-3.1 の利用規約に同意し
# トークンを取得してください(無料)
from faster_whisper import WhisperModel
# 話者分離パイプライン
diarization = Pipeline.from_pretrained(
“pyannote/speaker-diarization-3.1”,
use_auth_token=“YOUR_HF_TOKEN”
)
# 話者ラベルを取得
dia_result = diarization(“meeting.wav”)
# Whisperで文字起こし
wmodel = WhisperModel(“large-v3”, device=“cpu”, compute_type=“int8”)
segments, _ = wmodel.transcribe(“meeting.wav”, language=“ja”)
# 話者と発言を対応付けて出力
for segment in segments:
# 発言時刻に対応する話者を検索
speaker = “不明”
for turn, _, spk in dia_result.itertracks(yield_label=True):
if turn.start <= segment.start <= turn.end:
speaker = spk; break
print(f”[{speaker}] {segment.text}”)
話者分離はWhisperとは別のモデル(pyannote)を使うため、Hugging Faceのアカウントとアクセストークンが必要です。トークン取得は huggingface.co での無料登録で行えます。また話者分離の精度は録音品質に大きく依存するため、マイクの質と録音環境を整えることが重要です。
🤖 Ollamaで AI議事録を自動生成
Whisperで起こしたテキストをOllamaに投入して、構造化された議事録を作成する
文字起こし → 議事録への変換
生の文字起こしテキストはそのままでは読みにくいことがほとんどです。Ollamaの日本語対応LLMに要点整理・議題ごとの整理・アクションアイテム抽出を依頼することで、すぐに使える議事録フォーマットに変換できます。
🤖 Ollama API で議事録を生成
import json
# 文字起こし結果を読み込む
with open(“transcript.txt”, “r”, encoding=“utf-8”) as f:
transcript = f.read()
# 議事録生成プロンプト
prompt = f”””以下は会議の音声から文字起こしされたテキストです。
このテキストを読んで、以下の形式で議事録を作成してください。
## 議事録フォーマット
### 会議概要
(会議の目的・背景を1〜2文で)
### 主な議題と内容
(議題ごとに箇条書き)
### 決定事項
(会議で決まったこと)
### アクションアイテム
(誰が何をいつまでに行うか)
### 次回の予定
(次回会議の情報があれば)
— 文字起こし —
{transcript}
“””
# Ollama API を呼び出す(ストリーミングなし)
response = requests.post(
“http://localhost:11434/api/generate”,
json={
“model”: “qwen2.5:14b”, # 日本語に強いモデル
“prompt”: prompt,
“stream”: False,
“options”: {“temperature”: 0.3} # 低めの温度で安定した出力
}
)
minutes = response.json()[“response”]
# 議事録をファイルに保存
with open(“minutes.md”, “w”, encoding=“utf-8”) as f:
f.write(minutes)
print(“✅ 議事録を minutes.md に保存しました”)
print(minutes)
🧩 議事録生成に向いているOllamaモデル比較
📊 日本語議事録生成モデル比較
| モデル名 | 日本語品質 | 処理速度 | VRAM目安 | おすすめ度 |
|---|---|---|---|---|
| qwen2.5:14b | 10GB以上 | 🏆 最推奨(日本語) | ||
| qwen2.5:7b | 6GB以上 | ⭐ バランス型 | ||
| llama3.1:8b | 6GB以上 | 🔵 汎用に可 | ||
| gemma3:12b | 8GB以上 | 🟢 安定性高い | ||
| mistral-nemo:12b | 8GB以上 | 🟡 英語寄り |
※ スコアは日本語議事録生成用途での主観評価です。202年時点の情報に基づきます。
日本語議事録には qwen2.5 シリーズが最適
Alibaba Cloud の Qwen2.5 は日本語テキストの処理・要約において非常に高い品質を発揮します。VRAM が 6GB 程度であれば qwen2.5:7b、10GB 以上であれば qwen2.5:14b を選ぶと良いでしょう。モデルのダウンロードは ollama pull qwen2.5:14b で実行できます。
🌐 Open WebUI で音声入力を設定
Open WebUIのマイクボタンでリアルタイム音声入力を使えるように設定する手順
Open WebUIのマイクボタンを活用
Open WebUIにはチャット入力欄にマイクボタンが付いており、ローカルWhisper APIを接続することで音声でOllamaと会話できます。先にDocker版Whisperサーバー(9000番ポート)を起動しておく必要があります。
🔐 Open WebUI に管理者としてログイン
ブラウザで http://localhost:3000 を開き、管理者アカウントでログインします。
⚙️ 管理者パネルを開く
右上のユーザーアイコンをクリック → 「管理者パネル(Admin Panel)」 を選択します。
🔊 音声(Audio)設定を開く
左メニューの 「設定 → 音声(Audio)」 をクリックします。
🎙️ STT エンジンを設定
「Speech-to-Text Engine」 を OpenAI に設定し、APIベースURLに http://whisper-api:9000/v1(Dockerネットワーク)または http://localhost:9000/v1 を入力します。API Keyは任意の文字列(例:whisper)を入力してください。
✅ 保存してマイクボタンをテスト
設定を保存後、チャット画面に戻りマイクボタン(🎤)をクリック。話しかけてテキストが入力欄に表示されれば設定完了です。
Open WebUIとWhisper Dockerコンテナが同一のDockerネットワーク(例:ollama-net)に属している場合、URLは http://whisper-api:9000/v1(コンテナ名)で指定します。別々に docker run している場合や接続できない場合は http://host.docker.internal:9000/v1 または http://localhost:9000/v1 を試してください。
🐋 docker-compose で一括管理する(推奨)
Open WebUI・Ollama・Whisperをdocker-compose.ymlでまとめて管理すると、ネットワーク設定が自動で整い便利です。
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
volumes:
– ollama:/root/.ollama
networks: [ai-net]
restart: unless-stopped
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports: [“3000:8080”]
environment:
– OLLAMA_BASE_URL=http://ollama:11434
volumes:
– open-webui:/app/backend/data
networks: [ai-net]
restart: unless-stopped
whisper-api:
image: onerahmet/openai-whisper-asr-webservice:latest
container_name: whisper-api
environment:
– ASR_MODEL=large-v3
– ASR_ENGINE=faster_whisper
volumes:
– whisper-models:/root/.cache/whisper
networks: [ai-net]
restart: unless-stopped
networks:
ai-net: {}
volumes:
ollama: {}
open-webui: {}
whisper-models: {}
docker compose up -d
# ログ確認
docker compose logs -f whisper-api
# 停止
docker compose down
このdocker-compose構成では、Open WebUIのSTT設定で http://whisper-api:9000/v1 を指定すれば自動的に接続できます。サービス名がそのままホスト名になるため、IPアドレスの心配が不要です。
⚡ シェルスクリプトで全自動化
音声ファイルを放り込むだけで議事録Markdownが生成されるパイプラインを作る
ワンコマンドで議事録まで自動生成
WhisperとOllama APIを組み合わせたPythonスクリプトを用意しておくと、「python minutes.py meeting.mp3」の1コマンドだけで文字起こし → 要約 → Markdown議事録保存まで全自動で完了します。
“””音声ファイル → 議事録Markdown 全自動生成スクリプト”””
import sys, requests, json
from pathlib import Path
from datetime import datetime
from faster_whisper import WhisperModel
OLLAMA_URL = “http://localhost:11434/api/generate”
OLLAMA_MODEL = “qwen2.5:14b”
WHISPER_MODEL = “large-v3”
def transcribe(audio_path: str) -> str:
print(“🎙️ 文字起こし中…”)
model = WhisperModel(WHISPER_MODEL, device=“cpu”, compute_type=“int8”)
segments, _ = model.transcribe(
audio_path, language=“ja”, vad_filter=True, beam_size=5
)
return “\n”.join(f”[{s.start:.0f}s] {s.text}” for s in segments)
def generate_minutes(transcript: str) -> str:
print(“📝 Ollamaで議事録生成中…”)
prompt = f”””以下の会議文字起こしから議事録を作成してください。
Markdown形式で出力してください。
## 会議概要 ## 主な議題 ## 決定事項 ## アクションアイテム
文字起こし:\n{transcript}\n”””
res = requests.post(OLLAMA_URL, json={
“model”: OLLAMA_MODEL, “prompt”: prompt,
“stream”: False, “options”: {“temperature”: 0.3}
})
return res.json()[“response”]
def main():
if len(sys.argv) < 2:
print(“使用法: python minutes.py <音声ファイル>”); sys.exit(1)
audio = sys.argv[1]
transcript = transcribe(audio)
minutes = generate_minutes(transcript)
# ファイル保存
ts = datetime.now().strftime(“%Y%m%d_%H%M”)
out = Path(f”minutes_{ts}.md”)
out.write_text(minutes, encoding=“utf-8”)
print(f”\n✅ 議事録を {out} に保存しました!”)
if __name__ == “__main__”:
main()
python minutes.py 202-05-30_meeting.mp3
# 出力例
🎙️ 文字起こし中…
📝 Ollamaで議事録生成中…
✅ 議事録を minutes_20260530_1430.md に保存しました!
📊 Whisperモデル比較 & 選び方
用途・マシンスペックに合わせた最適なWhisperモデルを選ぼう
⚙️ Whisperモデル スペック比較表
| モデル | 日本語精度 | 処理速度 | メモリ | 推奨環境 | 用途 |
|---|---|---|---|---|---|
| tiny | ~1GB RAM | 超低スペックPC | テスト・英語のみ | ||
| base | ~1.5GB RAM | 低スペックPC | 簡易テスト | ||
| small | ~2GB RAM | 4〜8GB RAM PC | カジュアル用途 | ||
| medium | ~5GB RAM | 8〜16GB RAM | 業務利用・日本語 | ||
| large-v3 ⭐ | ~10GB RAM | 16GB RAM以上 | 議事録・精度重視 | ||
| large-v3-turbo | ~6GB RAM | 8〜12GB RAM | 精度・速度バランス |
※ RAMはシステム全体の目安。GPUを使う場合はVRAMが主な制限になります。
💻 16GB RAM以上のPC
- → large-v3(最高精度)
- → 議事録・重要会議に最適
🖥️ 8〜16GB RAM PC
- → large-v3-turbo
- → 精度と速度のバランス
📱 4〜8GB RAM の低スペック
- → medium(日本語OK)
- → カジュアルな録音に
🍎 Mac(Apple Silicon)
- → large-v3 + Metal加速
- → whisper.cppも高速動作
🔧 トラブルシューティング
よくあるエラーと解決方法を一覧で確認しよう
CUDA out of memory
GPUメモリ不足エラー
GPUのVRAMが不足している場合に発生します。
文字化け・認識不良
日本語が正しく認識されない
自動言語検出が英語になってしまう場合に起きます。
Open WebUI がSTTに接続できない
マイクボタンが機能しない
WhisperコンテナとOpen WebUIのネットワーク設定のミス。
処理が非常に遅い
文字起こしに数十分かかる
CPUのみで large-v3 を動かしていると非常に時間がかかります。
CPUでもそこそこ速く動かすコツ
CPUモードで使う場合、compute_type="int8" の指定が最も重要です。また num_workers=4 オプションを追加するとマルチコア活用で高速化できます。1時間の会議録音でも、mediumモデルなら10〜15分程度で処理可能です。
Whisperのfaster-whisper は Python 3.9以上が必要です。また、Ubuntuなどの環境では ffmpeg のインストール(sudo apt install ffmpeg)が必要な場合があります。MP3ファイルが読み込めないエラーの場合はffmpegの有無を確認してください。
🎉 まとめ・活用シーン一覧
Whisper × Ollama パイプラインが活躍するシーンを整理して総まとめ
🗺️ 構成パターン一覧
🎯 シーン別 おすすめ設定一覧
🏢 社内会議の議事録
- Whisper: large-v3
- LLM: qwen2.5:14b
- 方式: バッチPythonスクリプト
- 精度最優先の設定
🎙️ リアルタイム音声チャット
- Whisper: Docker版
- LLM: gemma3:12b
- 方式: Open WebUI STT
- 低レイテンシ重視
📱 低スペックPC・ノートPC
- Whisper: medium / small
- LLM: qwen2.5:7b
- compute_type: int8
- 省メモリ設定
🍎 Mac(Apple Silicon)
- Whisper: large-v3
- device: mps(Metal)
- LLM: llama3.1 / qwen2.5
- Metal加速で高速動作
この記事で構築したパイプラインにより、以下がすべて実現できます:
① 音声ファイル(MP3/WAV/MP4)→ 日本語テキスト文字起こし(faster-whisper large-v3)
② 文字起こし → AI整形議事録(Ollama qwen2.5:14b)
③ Open WebUI でマイクによるリアルタイム音声入力(Whisper Docker API連携)
④ 全処理がローカルで完結(インターネット不要・機密情報安全)


コメント