Whisper+Ollamaで議事録を完全ローカル化

ゼミや会議の録音、内容的に外部の文字起こしサービスに上げづらいことがある。未発表のデータの話とか、個人名がバンバン出る議論とか。
「アップロードした音声はAIの学習に使いません」と書いてあっても、そもそも外に出すこと自体が気持ち悪い。かといって手でメモを取りながら議論に参加するのは無理がある。
結論から言うと、WhisperとOllamaを使えば、音声を外に出さずに自分のPCだけで議事録が作れる。
目次 / INDEX
なぜ完全ローカルなのか
理由は2つ。プライバシーと、お金。
クラウドの文字起こしサービスは楽だけど、音声ファイルそのものをサーバーに送ることになる。ゼミや会議の録音には未発表の内容や、参加者の名前がそのまま入っている。規約上は安全でも、外に出した時点で自分のコントロールから離れる。
ローカルなら、そもそも外に出ない。ネットを切った状態でも動く。
あと、お金の話。クラウドサービスは月額制か従量課金のことが多い。毎週90分の集まりを1年間回すと、地味に効いてくる。
ローカルは初期セットアップさえ済めば、あとは自分のPCのCPUとメモリを使うだけ。回数無制限でタダ。
つまり、内容が外に出せない録音を扱うなら、ローカル一択だと思う。
必要なのはある程度のスペックのPCだけ。メモリがどれくらい要るかは大学生のローカルLLM|メモリは16GBで足りる?に書いた。
ひとつだけ先に。ローカルで完結するとはいえ他人の発言を録る以上、録音する前に参加者へ録音と文字起こしをすることを伝えて、同意を取っておくこと。
全体像は「文字起こし→整形→要約」の三段
先に全体像。1発で「録音→議事録」にはならない。三段で考える。
- ① Whisperで音声をテキストに起こす
- ② 起こしたテキストを整形する(誤字・改行・不要部分)
- ③ ローカルLLMに渡して議事録の形に要約させる
なんで一発じゃダメか。Whisperの出力は句読点こそある程度入るけど、改行も見出しもない一塊のテキストになりがちだから。
90分の会議を起こすと、巨大な文章の壁がどんと出てくる。これをそのまま「議事録です」と言い張るのは無理がある。
だから、起こす工程と読める形にする工程を分ける。②の整形は軽く目視で削る程度でもいいし、③のLLMにまとめて任せてもいい。ただ頭の中ではこの三段で考えておくと、どこで品質が落ちてるか切り分けやすい。
手順① Whisperで文字起こし
Whisperは OpenAI が公開している音声認識モデルで、ローカルで動かせる。インストール後、コマンドは1行。
whisper meeting.m4a --model medium --language Japanese --output_format txt
入力はmp3、wav、m4aあたりが使える。iPhoneのボイスメモ(m4a)がそのまま食わせられるのは楽。
モデルサイズは迷ったらまずmediumが目安。日本語の精度と処理時間のバランスがいいとされることが多い。小さいモデルは速いけど日本語の誤認識が増えがちで、largeは精度が上がる分だけ重い。
ここで大事なのが速度。GPUの有無で全然違う。CPUだけで回すとかなり待つ。
環境によるけど、CPUのみなら「録音時間より長く待つ」くらいの覚悟はしておいた方がいい。GPUがあると大幅に速くなる。
速くしたいなら faster-whisper という選択肢がある。同じWhisperモデルをより速く回す実装で、よく使われている。あと日本語特化なら Kotoba Whisper のような日本語向けモデルも存在する。
まず素のWhisperで1本通してから、不満が出たら乗り換えを検討する順番でいいと思う。
手順② Ollamaで要約して議事録にする
文字起こしができたら、その .txt をローカルLLMに渡す。Ollamaを使うとLlamaやQwen系のモデルがローカルで動かせて、音声の内容をクラウドに出さないまま要約まで完結する。Ollamaの導入自体はMac版Ollama最短入門にまとめた。
プロンプトは「何を抽出させるか」を先に指定するのがコツ。型はこんな感じ。
以下はゼミの文字起こしです。次の形式のMarkdown議事録にしてください。
## 議題
## 議論の要点(箇条書き)
## 決定事項
## 宿題・次回までのタスク(担当者があれば併記)
ポイントは「決定事項」と「宿題」を別枠で抜かせること。要約だけ頼むと、ふわっとした要旨が返ってきて、肝心の「で、次までに何やるんだっけ」が埋もれる。欲しい見出しを先に与えておけば、出力がそのまま議事録になる。
長い文字起こしは、モデルが一度に読める量(コンテキスト)を超えることがある。その場合は前半・後半に分けて要約して、最後に統合させる。
つまずきポイントと対処
実際やると詰まる所が3つある。
同じフレーズが延々と繰り返される
Whisperには、同じ文が延々と繰り返されるハルシネーション(幻覚)が出ることがある。無音区間や環境音のあたりで起きやすいとされる。出力を軽く目視して、明らかな繰り返しは削ってからLLMに渡すのが無難。
誰が話したかは分からない
Whisper単体は「誰が話したか」を区別してくれない。全部が一続きのテキストになる。
発言者を残したい場合は、録音中に自分で「ここは先生のコメント」とタイムスタンプをメモしておくか、話者分離用の別ツールを組み合わせる必要がある。ここはローカル構成の弱点だと思う。
処理時間が長い
前述の通り、CPUのみだと録音より長く待つことがある。対処はシンプルで、リアルタイム性を諦めて「寝る前に投げて朝回収」の運用にすること。どうせ議事録は当日中に読めれば困らない。
まとめ
構成は「Whisperで起こす→整形→Ollamaで議事録化」の三段。これだけで、音声を一度も外に出さずに議事録が手に入る。精度や速度はクラウドの専用サービスに劣る場面もあるけど、「そもそも外に出せない録音」を扱えるのはローカルだけだ。
まずは5分くらいの短い音声1本で、三段を最後まで通してみてほしい。全体の感覚が掴めれば、あとは実際の90分の会議やゼミに置き換えるだけ。
よくある質問
録音を外部サービスに上げずに議事録にするには?
Whisperでローカルに文字起こしし、軽く整形してから、Ollamaで動かすローカルLLMに議事録の形式で要約させる。音声もテキストもPCの外に出ない。
Whisperのモデルサイズはどれを選べばいい?
迷ったらまずmedium。日本語の精度と処理時間のバランスがいいとされる。小さいモデルは速いが誤認識が増え、largeは精度が上がる分だけ重い。
Whisperで文字起こしすると発言者は分かる?
Whisper単体は話者を区別せず、全部が一続きのテキストになる。発言者を残したいなら録音中にメモを取るか、話者分離用の別ツールを組み合わせる。