はじめに
最近、音声認識にWhisperを使っていろいろ試しています。
Whisperでよく見かけるのは、音声ファイルを用意して、それをコマンドラインから指定して文字起こしする方法です。
では、これをリアルタイムの音声入力に対して使うにはどうすればいいのか?
たとえば、USBカメラからキャプチャしている音声を、そのままリアルタイムに文字起こししたい。
いざやってみようと思うと、このあたりの情報は意外と少ないんですよね。
そこで今回は、チャッピーさんと一緒にあれこれ調べながら、実際に実装してみることにしました。
1.まずは入力をどうするか
今回、入力として考えているのは次の2パターンです。
- Media FoundationでUSBカメラから取得したリアルタイムの音声
- 動画ファイルを通常速度で再生し、そこから取得した音声
どちらも、最終的にはC++で処理します。
今回のポイントは、音声を一度ファイルに保存しないことです。
キャプチャした音声をそのままメモリ上で受け取り、そのデータをストリーミング的にWhisperへ渡して文字起こししていきたいと思います。
イメージとしては、
USBカメラ
↓
Media Foundation
↓
音声データ
↓
メモリ上でバッファリング
↓
Whisper
↓
文字起こし結果
という流れです。
2.Whisperには何を使う?
今回使用するのはwhisper.cppです。
Whisperにはいくつか実装がありますが、whisper.cppはC/C++のプログラムから直接利用できます。
さらに、音声ファイルを渡すだけではなく、メモリ上の音声データを直接渡して処理できるので、今回の用途にはかなり相性がよさそうです。
「音声をファイルに保存 → Whisperで解析」という構成にする必要がないのは大きなポイントです。
ちょうど今回やりたいことに使えそうなライブラリが見つかりました。
3.whisper.cppをビルドする
さて、Whisperを動かすならGPUを使いたくなります。
CUDA対応でビルド!
……と言いたいところですが、私が使っているグラフィックカードはIntel Arc B580です。
そこで今回は、whisper.cppが対応しているOpenVINOを使ってみることにしました。
まず、Visual Studioの
x64 Native Tools Command Prompt for VS
を起動します。
そして、OpenVINOの環境を設定します。
C:\Program Files (x86)\Intel\openvino_2026.2.1\setupvars.bat
その後、whisper.cppのフォルダに移動して、以下を実行します。
cmake -B build -DWHISPER_OPENVINO=1
cmake --build build -j --config Release
これでビルド完了です。
4.実行環境を作る
次に、動作確認用の環境を作ります。
今回は、
C:\Whisper
というフォルダを作りました。
whisper.cppをビルドすると、
whisper.cpp\build\bin\Release
に実行ファイルなどが生成されるので、そこに生成されたファイルをC:\Whisperへコピーします。
さらに、OpenVINO関連のDLLもコピーします。
C:\Program Files (x86)\Intel\openvino_2026.2.1\runtime\bin\intel64\Release\*
および、
C:\Program Files (x86)\Intel\openvino_2026.2.1\runtime\3rdparty\tbb\bin\*
のファイルをC:\Whisperへコピーします。
ここまで準備できたら、
whisper-cli.exe
が起動できることを確認します。
5.Whisperのモデルを準備する
次はモデルです。
whisper.cppのmodelsフォルダには、OpenVINO用にモデルを変換するためのスクリプトが入っています。
このスクリプトを、
C:\Whisper\models
へコピーします。
コピーしたフォルダにてモデル変換用のPython環境を作成します。
python -m venv openvino_conv_env
openvino_conv_env\Scripts\activate
python -m pip install --upgrade pip
pip install -r requirements-openvino.txt
pip install onnxscript
準備ができたら、モデルをOpenVINO用に変換します。
python convert-whisper-to-openvino.py --model [モデル名]
今回はlarge-v3-turboを使用してみます。
python convert-whisper-to-openvino.py --model large-v3-turbo
変換元のモデルは、whisper.cppのHugging Faceリポジトリからダウンロードしておきます。
large-v3-turboの場合は、
ggml-large-v3-turbo.bin
を使用します。
6.まずは普通に文字起こししてみる
ここまで準備できたので、まずは普通に音声ファイルを解析してみます。
C:\Whisperで以下を実行します。
whisper-cli.exe -m models\ggml-large-v3-turbo.bin -f test.wav -l ja -oved GPU
すると、モデルの読み込みが始まります。
whisper_init_from_file_with_params_no_state: loading model from 'models\ggml-large-v3-turbo.bin'
whisper_init_with_params_no_state: use gpu = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw = 0
whisper_init_with_params_no_state: devices = 1
whisper_init_with_params_no_state: backends = 1
そしてOpenVINOのモデルも読み込まれています。
whisper_ctx_init_openvino_encoder_with_state:
loading OpenVINO model from
'models\ggml-large-v3-turbo-encoder-openvino.xml'
whisper_openvino_init:
path_model = models\ggml-large-v3-turbo-encoder-openvino.xml,
device = GPU
ここは今回の環境でちょっと面白いところです。
whisper.cpp側では、
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
となっているのですが、OpenVINO側ではdevice = GPUとしてモデルが読み込まれています。
つまり、今回の構成ではwhisper.cppのGPUバックエンドそのものを使うというより、OpenVINO側でEncoderをGPU実行する構成になっています。
そして実際に15秒ほどの音声を解析してみると……
[00:00:00.000 --> 00:00:02.000] 本当ですよ
[00:00:02.000 --> 00:00:06.000] 集中に欠けた2人の作品がこちら
[00:00:06.000 --> 00:00:09.000] お茶碗というよりもはやどんぶり
[00:00:09.000 --> 00:00:13.000] なんかすごい野菜とかデトックスになった気がする
[00:00:13.000 --> 00:00:15.160] なんかね
「すごい癒された」が「すごい野菜とか」に誤認識されてますが、ちゃんと?日本語で文字起こしできました。
今回の音声は、
15.2秒
242560 samples
です。
処理時間は、
whisper_print_timings: load time = 936.51 ms
whisper_print_timings: mel time = 10.45 ms
whisper_print_timings: sample time = 97.15 ms
whisper_print_timings: encode time = 273.16 ms
whisper_print_timings: decode time = 10.26 ms
whisper_print_timings: batchd time = 992.29 ms
whisper_print_timings: total time = 4724.31 ms
という結果でした。
モデルのロード時間も含まれていますが、15秒程度の音声を約4.7秒で処理できています。
まずは順調です。
ここからが本番
今回は、まず環境を整えて、
- whisper.cppをOpenVINO対応でビルド
- OpenVINO用のモデルを作成
-
whisper-cli.exeからモデルを読み込む - 音声ファイルを使って文字起こしする
ところまで確認しました。
ただ、今回やりたいのは音声ファイルの文字起こしではありません。
キャプチャしている音声を、そのままリアルタイムに解析することです。
そのためには、音声をどのくらいの単位でWhisperへ渡すのか、どのくらいバッファリングするのか、解析中に次の音声をどう蓄積するのかなど、まだまだ考えることがあります。
特にリアルタイム処理では、単純に「音声が届いたらWhisperを呼ぶ」というわけにはいきません。
このあたりを実際に試しながら、最適な構成を探っていきたいと思います。
今回はここまで。
次回は、今回ビルドしたwhisper.cppをベースに作成したwhisper.dllを実際のC++プログラムから呼び出し、音声をメモリ上でストリーミングしながらリアルタイムに文字起こしする処理を実装していきます。
果たして、Intel B580 + OpenVINOでどこまでリアルタイムに動かせるのか。
そのあたりも実際に試してみたいと思います。
続き