会議の録音を聞き直しながら議事録を作る作業は、時間も集中力も必要です。特に発言者が多い会議では、決定事項や担当者、期限を探すだけでかなりの時間がかかります。
この記事では、音声認識モデルの Whisper をローカル環境で動かし、会議録音から日本語の文字起こしを作成する手順を紹介します。私が実際に試した構成では、録音ファイルを Whisper に渡すだけで、タイムスタンプ付きのテキストや字幕ファイルを生成できました。
ただし、Whisper単体では発言者の識別までは行いません。そのため、まず自動文字起こしで下書きを作り、決定事項や担当者を人間が確認して議事録に整える、という使い方が現実的です。
使用した環境
今回はPython版のWhisperを使いました。音声ファイルは .m4a、.mp3、.wav などに対応していますが、内部処理ではFFmpegを利用するため、先にインストールしておきます。
Windowsの場合は、管理者権限のPowerShellで次のコマンドを実行します。
winget install Gyan.FFmpeg
macOSではHomebrewを使えます。
brew install ffmpeg
Ubuntu系では次のコマンドです。
sudo apt update
sudo apt install ffmpeg
FFmpegが認識されることを確認します。
ffmpeg -version
次に、Pythonの仮想環境を作成してWhisperをインストールします。
python -m venv .venv
Windowsの場合は次のように有効化します。
.venv\Scripts\Activate.ps1
macOSやLinuxの場合は次のコマンドです。
source .venv/bin/activate
Whisper本体をインストールします。
pip install -U openai-whisper
GPUを使わない場合、処理時間は録音時間やモデルサイズによって大きく変わります。私の環境では、まず small または medium から試し、精度を優先したい録音だけ大きなモデルに切り替える方法が扱いやすいと感じました。
音声ファイルを文字起こしする
会議録音を文字起こしから議事録へ整える流れを図にすると次の通りです。
録音ファイルを meeting.m4a として作業フォルダに置き、次のコマンドを実行します。
whisper meeting.m4a \
--language Japanese \
--task transcribe \
--model medium \
--output_dir output \
--output_format all
Windows PowerShellでは、行継続記号を使わず1行で実行しても問題ありません。
whisper meeting.m4a --language Japanese --task transcribe --model medium --output_dir output --output_format all
--output_format all を指定すると、出力フォルダに複数の形式が生成されます。
-
.txt:文字起こし本文 -
.srt:字幕形式 -
.vtt:Web字幕形式 -
.tsv:開始時刻・終了時刻・テキストの表形式 -
.json:セグメント情報を含むJSON
議事録作成では .txt だけでも使えますが、発言箇所を録音で確認したい場合は .srt や .tsv が便利です。たとえば、重要な発言の時刻をメモしておけば、後から該当箇所をすぐに聞き直せます。
日本語を明示的に指定することが重要です。自動判定に任せることもできますが、短い音声や冒頭に環境音が多い場合、別の言語として判定されることがあります。
Pythonから実行する
複数の録音を処理したり、出力形式を固定したりする場合は、Pythonスクリプトにしておくと便利です。
from pathlib import Path
import whisper
input_file = Path("meeting.m4a")
output_file = Path("meeting_transcript.txt")
model = whisper.load_model("medium")
result = model.transcribe(
str(input_file),
language="ja",
task="transcribe",
fp16=False,
temperature=0,
)
segments = result["segments"]
with output_file.open("w", encoding="utf-8") as file:
for segment in segments:
start = segment["start"]
end = segment["end"]
text = segment["text"].strip()
file.write(f"[{start:08.2f} - {end:08.2f}] {text}\n")
print(f"保存しました: {output_file}")
CPU環境では fp16=False を指定しておくと、半精度浮動小数点に関する警告を避けられます。GPU環境では設定を変えることで処理を高速化できる場合があります。
モデルサイズは、次のように変更できます。
model = whisper.load_model("small")
モデルが大きいほど一般的には認識精度が上がりますが、メモリ使用量と処理時間も増えます。私は、会議の下書きには small、固有名詞や専門用語をできるだけ正確に拾いたい場合には medium を使い分けています。
議事録として整えるポイント
Whisperの出力は、話した内容をそのまま並べた文字起こしです。議事録として使うには、次のような整理が必要です。
まず、誤認識されやすい固有名詞や製品名を修正します。社内用語、略称、カタカナ語は特に誤りが出やすいため、会議資料や参加者名簿と照合します。
次に、発言をテーマごとにまとめます。たとえば、次のような形式にすると読み返しやすくなります。
# 定例会議 議事録
- 日時: 2026-09-24 10:00〜11:00
- 参加者: 山田、佐藤、鈴木
## 決定事項
- リリース日は10月15日に確定
- テスト環境の更新は10月1日に実施
## 議論の概要
### リリース日について
テスト結果を確認したうえで、10月15日にリリースする方針となった。
### ドキュメントについて
ユーザー向けマニュアルはリリース前日までに更新する。
## アクションアイテム
| 担当者 | 内容 | 期限 |
|---|---|---|
| 山田 | テスト環境を更新 | 10月1日 |
| 佐藤 | マニュアルを更新 | 10月14日 |
Whisperは話者分離を行わないため、「誰が話したか」は録音を聞きながら補います。参加者が少ない会議であれば、発言の流れや声の違いから手動で整理するほうが、誤った話者名を自動で付けるより安全です。
また、機密情報を含む録音を扱う場合、ローカル実行は有効な選択肢です。録音ファイルや文字起こし結果の保存場所、バックアップ、アクセス権限は別途確認してください。文字起こし後に不要になった録音を削除する場合も、会社やチームのルールに従う必要があります。
認識精度を上げるために試したこと
録音品質は認識結果に大きく影響します。マイクから遠い発言、複数人の同時発話、空調音やキーボード音が多い場面では誤認識が増えました。
音声をWhisperに渡す前に、モノラル・16kHzへ変換しておく方法もあります。
ffmpeg -i meeting.m4a -ar 16000 -ac 1 meeting_normalized.wav
変換後のファイルを使って実行します。
whisper meeting_normalized.wav \
--language Japanese \
--model medium \
--output_dir output
ただし、変換しただけで必ず精度が上がるわけではありません。私の確認では、形式変換よりも、録音時にマイクを発言者の近くへ置くこと、同時発話を減らすことのほうが効果を感じやすい結果になりました。
専門用語が多い会議では、プロンプトを渡す方法もあります。
whisper meeting.m4a \
--language Japanese \
--model medium \
--initial_prompt "ソフトウェア開発、API、データベース、リリース、テスト環境に関する会議です。"
これは特定の単語を必ず正しく認識させる機能ではありませんが、会議の文脈を与えることで表記が安定する場合があります。
まとめ
Whisperをローカルで動かすと、会議録音から日本語の文字起こしを自分のPC上で作成できます。基本的な流れは、FFmpegとWhisperをインストールし、録音ファイルに対して言語とモデルを指定して実行するだけです。
実際に使ってみて重要だと感じたのは、文字起こし結果を完成した議事録と考えないことです。固有名詞、話者、決定事項、担当者、期限は必ず人間が確認します。
まずは small モデルで処理時間を確認し、精度が必要な会議だけ medium 以上へ切り替える運用がおすすめです。自動文字起こしを下書きとして活用すれば、録音を最初から最後まで聞き直す負担をかなり減らせます。