本記事では、無料のオープンソースツール whisper.cpp を使い、ローカル環境で音声文字起こしを行う方法をまとめています。API課金やクラウド送信は不要です。
ビルド手順からモデルの選び方、実行コマンド、実測結果まで整理し、精度と速度の違いや量子化モデルのポイントも解説します。
自分のPCだけで完結する文字起こし環境を構築するための備忘録です。
今回のPCスペック
今回検証に使用したPCの構成は以下の通りです。
- CPU:11th Gen Intel Core i5-1135G7(4コア8スレッド)
- メモリ:16GB
- GPU:Intel Iris Xe(内蔵)
- ストレージ:SSD
特別にハイスペックなマシンではなく、一般的なビジネス向けノートPC構成です。専用GPUも使用していません。
この環境でそこそこの精度の medium モデルを使用し、約10分の音声を処理したところ、処理時間は約19分 でした。実時間の約1.9倍程度です。
決して爆速ではありませんが、GPUがない手元の一般的なWindowsノートPCで、ローカル・無料・CPUのみという条件を考えると、議事録用途や動画の下書き用途であれば現実的に運用できます。
- ローカル
- 無料
- GPU不要
これがwhisper.cpp の大きな魅力です。
whisperとは?
Whisper は、音声をテキストに変換するための音声認識モデルです。
会議やインタビュー、動画音声などを自動で文字起こしできるAIとして公開され、日本語にも対応しています。漢字変換や専門用語の認識精度の高い点が特徴です。
このWhisperには、主にwhisperとwhisper.cppという2つの実装があります。
whisper
ひとつは、OpenAIが公開している公式の whisper(Python版) です。
- PyTorchを利用しており、GPU(CUDA)環境で高い性能を発揮
- 研究用途や機械学習環境が整っている方には扱いやすい構成
- Python環境の構築や依存ライブラリの管理が必要
が特徴です。
whisper.cpp
もうひとつが whisper.cpp です。
- WhisperモデルをC/C++で再実装した軽量版
- 依存関係がほとんどなく、ビルドすればそのまま実行できる
- CPUのみでも動作する
- 量子化モデルを利用することで、メモリ消費を抑えながら運用できる
という特徴あります。
GPU環境で最大性能を引き出したいなら公式の whisper、一般的なノートPCで手軽に動かしたいなら whisper.cpp が適しています。
本記事では、クラウドを使わず、無料で、CPUのみの一般的なWindowsノートPC上で動かすことを前提としているため、whisper.cpp を採用しています。
whisper.cppのインストール
whisper.cppのインストールは、下記通りです。
1. リポジトリの取得とビルド
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp
make
インストールが成功すると、./build/bin/フォルダにwhisper-cliというファイルが作成されます。
この実行ファイルを使用しますので、必要があれば、移動やシンボリックリンクなどを設定ください。
2.モデルのダウンロード
文章化に必要なモデルをダウンロードします。モデルの詳細は割愛しますが、ここではmediumをダウンロードします。
bash ./models/download-ggml-model.sh medium
3.文字起こしの実行
./build/bin/whisper-cli -m models/ggml-medium.bin -f test.mp3 -l ja -otxt -t 8
実行結果とパフォーマンス検証
10分間の音声ファイルを処理した際のログは以下の通りです。
whisper_print_timings: total time = 1159558.88 ms
トータル処理時間は約19分。実時間の約1.9倍という結果になりました。
会議の事後文字起こし用途なら十分現実的ですが、リアルタイム用途には向かないということが分かります。
ログを見ると、特に encode time(音声解析)に全体の半分以上の時間を費やしていることがわかります。
ここからさらに速度を求めるなら、-t オプションで使用するスレッド数を最適化したり、モデルのサイズを一段階下げて(例:small → base)精度と速度のトレードオフを検証する価値がありそうです。
whisper.cpp モデル比較一覧表
モデル選びは「精度」「処理時間」「メモリ容量」の3軸で考えます。
モデル名が大きくなるほど、文字起こしの精度(特に漢字変換や専門用語の正解率)が上がりますが、処理速度は遅くなり、多くのメモリを消費します。
| モデル名 | ディスクサイズ | 動作メモリ(RAM) | 処理速度 | 日本語精度の目安 |
|---|---|---|---|---|
| tiny | 約 75 MB | 約 273 MB | 爆速 | 厳しい(誤字脱字が多い) |
| base | 約 142 MB | 約 388 MB | かなり速い | 補助的(ニュアンスは掴める) |
| small | 約 466 MB | 約 852 MB | 実用的 | そこそこ(日常会話なら OK) |
| medium | 約 1.5 GB | 約 2.1 GB | 普通 | 優秀(実用レベル) |
| large-v3 | 約 2.9 GB | 約 3.9 GB | 低速 | 最高峰(会議録・動画向け) |
| turbo | 約 1.6 GB | 約 2.4 GB | 速い | 非常に優秀(速度・精度のバランス型) |
モデル選択に悩んだら、下記を参考にしてみてはいかがでしょうか?
- とりあえず試したいなら: small
手元のPCでサクッと動くか確認するのに最適。 - 仕事の議事録で使いたいなら: medium または turbo
誤字が少なく、実用的な文章が得られる最低ラインです。 - 最強の精度を求めるなら: large-v3
時間はかかってもいいから、一文字も漏らさず書き起こしたい場合。 - スペックの低いPCやスマホなら: tiny または base
精度より「リアルタイム性」や「リソース消費」を優先する場合。
量子化(Quantized)モデルについて
whisper.cpp では、さらにメモリ消費を抑えた「量子化モデル(q5_0, q8_0など)」も使えます。
量子化は「軽量化と引き換えに、わずかに精度が落ちる」技術です。
例えば、medium モデルを量子化(q5_0)すると、サイズが約 1.5GB → 約 500MB まで軽量化され、非力なPCでもスイスイ動くようになります。
デメリットは下記のようなものがあります。
1. 文字起こしの精度がわずかに低下する
数値を丸める(粗くする)ため、計算結果にわずかな誤差が出ます。
具体的には: 専門用語の誤字が増えたり、句読点の位置が不自然になったりすることがあります。
ただし: q5_0(5ビット)や q8_0(8ビット)程度の量子化であれば、人間がパッと見て気づくほどの差は出にくいです。q4_0 以下になると明確に精度が落ち始めます。
2. 「幻覚(ハルシネーション)」が起きやすくなる
音声がない無音部分で、モデルが勝手に「存在しない言葉」を生成してしまう現象が、量子化によってわずかに発生しやすくなる傾向があります。
3. 計算コスト(変換作業)が必要
標準モデル(f16)を量子化して使うには、最初に一度 quantize というコマンドで変換作業を行う必要があります(※ネット上で配布されている量子化済みモデルを使う場合は不要です)。
4. GPU環境では逆効果になることも
最新の強力なGPU(NVIDIA RTX 40シリーズなど)を使っている場合、量子化モデルを使うよりも、標準の f16 モデルをそのまま流した方が高速に処理できるケースがあります。量子化は主に 「CPUやモバイル端末で動かす時」に最も恩恵がある技術 です。
最新・推奨モデル(迷ったらここから)
bash ./models/download-ggml-model.sh [モデル名] の [モデル名] 部分に入れる文字列です。
| モデル指定名 | ベースモデル | 量子化 | ファイル容量 | 推奨メモリ(RAM) | 特徴 |
|---|---|---|---|---|---|
large-v3-q5_0 |
large-v3 | 5-bit | 約 1.1 GB | 2 GB以上 | 精度重視の鉄板。迷ったらこれ |
large-v3-q8_0 |
large-v3 | 8-bit | 約 1.6 GB | 3 GB以上 | ほぼ劣化なし。余裕がある人向け |
large-v3-turbo-q5_0 |
turbo | 5-bit | 約 600 MB | 1.5 GB以上 | 速度重視の鉄板。驚くほど軽い |
large-v3-turbo-q8_0 |
turbo | 8-bit | 約 900 MB | 2 GB以上 | turbo の最高精度版 |
全量子化モデル一覧(medium / small / base / tiny)
| モデル指定名 | ベースモデル | 量子化 | ファイル容量 | 推奨メモリ(RAM) | 特徴・用途 |
|---|---|---|---|---|---|
medium-q5_0 |
medium | 5-bit | 約 515 MB | 1.0 GB以上 | 旧世代の定番。中堅PCでの実用ライン |
medium-q8_0 |
medium | 8-bit | 約 815 MB | 1.5 GB以上 | medium の精度を極限まで維持したい場合 |
small-q5_0 |
small | 5-bit | 約 170 MB | 500 MB以上 | 非常に軽快。短文なら十分実用的 |
small-q8_0 |
small | 8-bit | 約 260 MB | 800 MB以上 | 低スペックPCでの文字起こしテスト用 |
base-q5_0 |
base | 5-bit | 約 55 MB | 300 MB以上 | 翻訳なしの単純な聞き取り確認用 |
base-q8_0 |
base | 8-bit | 約 80 MB | 400 MB以上 | 精度より反応速度重視 |
tiny-q5_0 |
tiny | 5-bit | 約 30 MB | 200 MB以上 | 最軽量。ほぼ全てのデバイスで動作 |
tiny-q8_0 |
tiny | 8-bit | 約 45 MB | 300 MB以上 | リアルタイム字幕の実験向け |
まとめ
whisper.cpp を使えば、API課金やクラウド接続なしで、高精度な音声文字起こし環境をローカルに構築できます。
今回の検証では、一般的なビジネス向けノートPC(Core i5 / メモリ16GB / GPUなし)でも medium モデルが実時間の約1.8倍で動作しました。特別なGPUや高価なワークステーションがなくても、実用的な文字起こしが可能です。
インストール手順もシンプルで、
- リポジトリを clone
- make でビルド
- モデルをダウンロード
- 実行
これだけで動きます。
用途に応じてモデルサイズや量子化モデルを選べば、速度と精度のバランスも調整できます。無料でここまでできる環境は、知っておいて損はありません。
まずは small や medium から試してみると、手元のPCでどこまで動くのかが体感できます。ぜひ一度、自分の環境で動かしてみてください。
Tips
whisper.cpp のオプション
最低限必要なオプション
| オプション | 短縮形 | デフォルト | 内容 |
|---|---|---|---|
--model |
-m |
(必須) | 使用するモデルファイル(.bin)のパスを指定します |
--file |
-f |
(必須) | 文字起こししたい音声ファイルのパスを指定します |
--language |
-l |
ja |
音声の言語を指定します。日本語なら ja、自動判定なら auto
|
--threads |
-t |
4 |
使用する CPU のスレッド数。PC のコア数に合わせると高速化できます |
--processors |
-p |
1 |
使用するプロセッサ数。通常は 1 のままで問題ありません |
--translate |
-tr |
false |
日本語などを英語に翻訳しながら文字起こしする場合に指定します |
出力フォーマット指定
| オプション | 短縮形 | デフォルト | 内容 |
|---|---|---|---|
--output-txt |
-otxt |
false |
テキストファイル(.txt)で結果を出力します |
--output-srt |
-osrt |
false |
字幕ファイル(.srt)で出力します。動画編集に便利です |
--output-vtt |
-ovtt |
false |
Web 動画などで使われる字幕形式(.vtt)で出力します |
--output-json |
-oj |
false |
詳細なデータを含む JSON 形式で出力します |
--output-csv |
-ocsv |
false |
Excel などで開きやすい CSV 形式で出力します |
--output-file |
-of |
なし | 出力ファイル名を指定します(拡張子なし)。指定しない場合は入力ファイル名が使われます |
--no-timestamps |
-nt |
false |
画面表示やテキスト出力時に [00:00:00] のようなタイムスタンプを非表示にします |
文字おこしの挙動調整
| オプション | 短縮形 | デフォルト | 内容 |
|---|---|---|---|
--duration |
-d |
0 |
音声の冒頭から何ミリ秒分だけ処理するかを指定します(0 は全編)。テスト時に便利です |
--offset-t |
-ot |
0 |
音声の開始地点をミリ秒で指定します |
--max-len |
-ml |
0 |
1つのセグメント(行)の最大文字数を制限します |
--print-colors |
-pc |
false |
信頼度が低い単語を色分けして表示します(確認作業が楽になります) |
--prompt |
なし | なし | 最初の文字 |
VAD(音声区間検出)設定
| オプション | 内容 |
|---|---|
--vad |
音声区間検出(VAD)を有効にします |
--vad-threshold |
声かノイズかを判別するしきい値(0.0〜1.0)。値を高くするほど判定が厳格になります |
--vad-min-speech-duration-ms |
指定したミリ秒以下の短い音を「声ではない」として無視します |
音声ファイルの再生
FFmpeg パッケージに含まれているプレイヤーです。
ffplay -nodisp output.wav
音声の長さを HH:MM:SS で表示
ミリ秒は不要なため、awkにて整形しています。
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 output.wav | awk '{printf "%02d:%02d:%02d\n", $1/3600, ($1%3600)/60, $1%60}'