Windows × RustでローカルWhisperを動かす(whisper-rs)
環境
- Windows 11
- rustc 1.68.2 (9eb3afe9e 2023-03-27)
Pythonのパッケージとして提供されているWhisperのC/C++実装であるwhisper.cppのRustバインディング whisper-rs を使えるようにするまでの備忘録です。
まずは、 cargo new
で新しいプロジェクトを作ります。
(PS ~~~ >
の部分はプロンプト文字列で、コマンドではないので注意してください)
PS C:\xxx> cargo new whisper-rs-demo
Created binary (application) `whisper-rs-demo` package
PS C:\xxx> cd whisper-rs-demo
cargo add whisper-rs
でwhisper-rsを依存関係に追加します。
PS C:\xxx\whisper-rs-demo> cargo add whisper-rs
Updating crates.io index
Adding whisper-rs v0.5.0 to dependencies.
Features:
- simd
ここではビルドして動作することを確認できればいいので、whisper-rsのコード例を拝借します。
この中の src/main.rs を手元の src/main.rs のコピペしてください。
サンプルのwavファイルもあるので、これもダウンロードしておきます。
コードを見るとわかりますが、音声ファイルとWhisperのモデルデータのパスを渡すと、音声認識の結果を返してくれるCLIツールのようです。
しかし、 cargo build
しようとしても2023年4月8日現在はエラーが発生してしまいます。よくよく見てみたら「Windows/macOS/Androidでは動かないよ!!」とのこと。。
Linuxなら動くということだと思うので、WSL2上で試せばできるんだろうと思いますが、今回はWindowsで動かしたい事情がありました。
Windows対応を待つしかないかと思いながら、Issueを漁ってみると救世主がいました。
MSYS2 を使えばビルドできたよとのこと!
しかし、Issueを参考にやったもののそのままやってもうまくいかない点が多く、備忘録がてら結論の手順を書き残します。
MSYS2のインストール
まずMSYS2をインストールします。
https://www.msys2.org/ からダウンロードできるMSYS2のインストーラを利用してください。
具体的な手順についてはこちらが参考になります。
インストールが完了したら、「MSYS2 MINGW64」を起動してください(MSYS2には複数の環境があって、exeファイルも分かれています)。
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
というコマンドを実行してください。
MINGW64 ~
$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain
:: There are 19 members in group mingw-w64-x86_64-toolchain:
:: Repository mingw64
1) mingw-w64-x86_64-binutils 2) mingw-w64-x86_64-crt-git 3) mingw-w64-x86_64-gcc
4) mingw-w64-x86_64-gcc-ada 5) mingw-w64-x86_64-gcc-fortran
6) mingw-w64-x86_64-gcc-libgfortran 7) mingw-w64-x86_64-gcc-libs 8) mingw-w64-x86_64-gcc-objc
9) mingw-w64-x86_64-gdb 10) mingw-w64-x86_64-gdb-multiarch 11) mingw-w64-x86_64-headers-git
12) mingw-w64-x86_64-libgccjit 13) mingw-w64-x86_64-libmangle-git
14) mingw-w64-x86_64-libwinpthread-git 15) mingw-w64-x86_64-make 16) mingw-w64-x86_64-pkgconf
17) mingw-w64-x86_64-tools-git 18) mingw-w64-x86_64-winpthreads-git
19) mingw-w64-x86_64-winstorecompat-git
Enter a selection (default=all):
のように聞かれると思いますが、ここで必要なのは 3) mingw-w64-x86_64-gcc
なので、3
と入力してエンターを押してください。
環境変数 Path
に C:\msys64\mingw64\bin
を追加してください。
(MSYS2のインストール先に応じてパスは適宜変えてください)
LLVMのインストール
Issueには書いてありませんでしたが、MSYS2をインストールするだけではビルドができなくて、LLVMが必要でした。
ビルド時に使われる bindgen
で C/C++ファイルを処理するために libclang
を必要とするようで、そのための準備です。
を参考にLLVMをインストールし、展開先のbinディレクトリのパスを環境変数 LIBCLANG_PATH
にセットしてください。
C:\Program Files\LLVM\bin
Rustツールチェインの準備
PowerShellに戻って、
rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default x86_64-pc-windows-gnu
でRustがMSYS2を使うようにセットアップします。
.cargo/config.tomlの作成
プロジェクトルートに、.cargoディレクトリを作成し、その中にconfig.tomlファイルを作って、以下の内容を記述してください。
[target.x86_64-pc-windows-gnu]
linker = "C:\\msys64\\mingw64\\bin\\gcc.exe"
ar = "C:\\msys64\\mingw64\\bin\\ar.exe"
(実際のパスはmsys64のインストール先によって変わります)
完成
ここまでやったら、ようやく cargo build
できるはずです。ここにたどり着くまでが長かった。。
ビルドしたら、
.\target\debug\whisper-rs-demo.exe .\examples_full_usage_2830-3980-0043.wav .\ggml-base.bin
のように実行することで音声認識を試すことができます。
手元に対象のwavファイルと、モデルデータを用意して、ファイルパスを指定する必要があります。
モデルデータは
からダウンロードしましょう。
実行結果はこんな感じに。
PS xxx\whisper-rs-demo> .\target\debug\whisper-rs-demo.exe .\examples_full_usage_2830-3980-0043.wav .\ggml-base.bin
whisper_init_from_file: loading model from '..\tauri-demo\model\ggml-base.bin'
whisper_model_load: loading model
whisper_model_load: n_vocab = 51865
whisper_model_load: n_audio_ctx = 1500
whisper_model_load: n_audio_state = 512
whisper_model_load: n_audio_head = 8
whisper_model_load: n_audio_layer = 6
whisper_model_load: n_text_ctx = 448
whisper_model_load: n_text_state = 512
whisper_model_load: n_text_head = 8
whisper_model_load: n_text_layer = 6
whisper_model_load: n_mels = 80
whisper_model_load: f16 = 1
whisper_model_load: type = 2
whisper_model_load: mem required = 215.00 MB (+ 6.00 MB per decoder)
whisper_model_load: kv self size = 5.25 MB
whisper_model_load: kv cross size = 17.58 MB
whisper_model_load: adding 1608 extra tokens
whisper_model_load: model ctx = 140.60 MB
whisper_full: progress = 60%
whisper_full: progress = 65%
whisper_full: progress = 70%
whisper_full: progress = 75%
whisper_full: progress = 80%
whisper_full: progress = 85%
whisper_full: progress = 90%
whisper_full: progress = 95%
whisper_full: progress = 100%
[0 - 200]: Experience proves this.
わかりにくいですが、最終行の「Experience proves this.」が音声認識の結果です。たしかにwavファイルを聞くとそう言ってます。
Discussion