会議の録音や動画の字幕起こしを外部サービスに投げるのは手軽だが、音声データを社外に出したくない場面も多い。OpenAIが公開しているオープンソースの音声認識モデル「Whisper」なら、手持ちのVPS上で完結させられる。今回はさくらのVPS(Debian 12、GPU無しのCPU環境)でWhisperを動かし、文字起こしを試すところまでをまとめる。
Whisperとは何か
WhisperはOpenAIが2022年に公開した音声認識(ASR)モデルで、多言語対応・オープンソースというのが最大の特徴。会議の議事録の下書き、動画の字幕生成、インタビュー音声のテキスト化など用途は幅広い。API経由で使うOpenAIの文字起こしサービスとは別に、モデル自体がオープンに配布されているため、自分のサーバー上でネットワークを切った状態でも推論できる。プライバシーが気になる音声(社内会議、顧客インタビューなど)を扱う場合はローカル実行の安心感が大きい。
実装の選択肢
Whisperを動かす方法はいくつかあり、VPSのスペックや用途によって選ぶと良い。
- openai-whisper(本家) ...
pip install openai-whisperで入る公式実装。PyTorchベースでシンプルだが、CPU環境だとやや重い - whisper.cpp ... C++で書き直された実装。依存が少なくCPUでも軽快に動く。VPSと相性が良い
- faster-whisper ... CTranslate2ベースの高速実装。同じ精度でも本家より速く動くことが多く、GPUがあれば特に効果が出る
GPU無しのVPSで手軽に試すならwhisper.cppが扱いやすい。以下、この記事ではwhisper.cppを主軸に手順を書く。
whisper.cppのビルド
まず必要なビルドツールを入れる。
apt update
apt install -y build-essential git ffmpeg
リポジトリをcloneしてビルドする。
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp
make
ビルドが終わったら、モデルをダウンロードする。モデルは複数のサイズが用意されているので、用途に応じて選ぶ。
bash ./models/download-ggml-model.sh base
実行が終わるとmodels/ggml-base.binが生成される。あとは音声ファイルを指定して実行するだけ。
./build/bin/whisper-cli -f audio.wav -l ja -m models/ggml-base.bin
-l jaで言語を日本語に指定し、-mで使うモデルファイルを指定する。標準出力にタイムスタンプ付きの文字起こし結果が流れてくる。
音声ファイルの前処理(ffmpeg)
Whisperは基本的に16kHz・モノラルのWAVファイルを想定している。MP3や44.1kHzのステレオ音声をそのまま渡すと動くには動くが、想定外のフォーマットで精度が落ちることがあるので、事前にffmpegで変換しておくのが無難だ。
ffmpeg -i input.mp3 -ar 16000 -ac 1 output.wav
-ar 16000でサンプリングレートを16kHzに、-ac 1でモノラルに変換している。動画ファイルから音声だけ抜き出したい場合も同様にffmpegで対応できる。
ffmpeg -i video.mp4 -ar 16000 -ac 1 audio.wav
モデルサイズと精度・速度のトレードオフ
whisper.cppのモデルはtiny / base / small / medium / largeの5段階が用意されている(largeはさらに細かいバリアントがある)。サイズが大きいほど精度は上がるが、その分メモリと計算時間を食う。
tiny... 数十MB程度で動く。英語なら実用範囲だが日本語は誤変換が目立ちやすいbase... 手元で試す最初の選択肢として無難なサイズsmall... 日本語で実用的な精度が出始めるライン。実務で使うならまずこれ以上を検討したいmedium/large... 精度は高いがCPUだとかなり時間がかかる。VPSのメモリにも余裕が要る
日本語の文字起こしをそれなりの精度で使いたいなら、体感的にsmall以上が実用ラインだと感じる。tinyやbaseは速いが、固有名詞や専門用語の誤変換が思った以上に多い。
CPU推論の現実的な速度
正直に書いておくと、GPUの無いVPSでの推論は決して速くない。モデルサイズやVPSのCPUコア数にもよるが、smallモデルで音声の実時間の2〜4倍程度の処理時間がかかることも珍しくない(30分の会議音声なら1〜2時間かかるイメージ)。バッチ処理として夜間に回す、あるいは緊急性の低い文字起こしに使う、といった前提なら十分実用的だが、リアルタイム性を求める用途には向かない。
もし速度が気になる場合はfaster-whisperへの切り替えを検討すると良い。CTranslate2による最適化で、同じCPU環境でも本家実装より体感でかなり速くなることが多い。さらにGPUを積んだサーバーが使えるなら、faster-whisperの恩恵はより大きくなる。GPU無しのさくらVPSで試す分にはwhisper.cppで十分だが、業務で常時稼働させるなら速度要件次第で構成を見直す価値がある。
出力形式
whisper.cppは標準出力へのテキスト表示のほか、オプションでファイル出力もできる。
./build/bin/whisper-cli -f audio.wav -l ja -m models/ggml-base.bin -otxt -osrt -ovtt
-otxtでプレーンテキスト、-osrtでSRT字幕ファイル、-ovttでWebVTT字幕ファイルをそれぞれ出力できる。動画の字幕として使いたい場合は-osrtで生成したファイルをそのまま動画編集ソフトやYouTubeにアップロードすれば良い。議事録の下書きとして使う場合はテキスト出力を後で人手で整形する運用になるだろう。
まとめ
Whisperをサーバーで動かせば、音声データを外部に出さずに文字起こしができる。GPUの無いVPSでもwhisper.cppを使えば実用的な範囲で動くが、モデルサイズと処理時間のバランスは意識しておきたい。まずはbaseあたりで試し、精度が足りなければsmallへ、速度がネックになるならfaster-whisperへの乗り換えを検討するのが現実的な進め方だと思う。
