👂

Windows × RustでローカルWhisperを動かす(whisper-rs)

2023/04/09に公開

環境

  • 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のコード例を拝借します。

https://github.com/tazz4843/whisper-rs/tree/master/examples/full_usage

この中の src/main.rs を手元の src/main.rs のコピペしてください。
サンプルのwavファイルもあるので、これもダウンロードしておきます。

コードを見るとわかりますが、音声ファイルとWhisperのモデルデータのパスを渡すと、音声認識の結果を返してくれるCLIツールのようです。

しかし、 cargo build しようとしても2023年4月8日現在はエラーが発生してしまいます。よくよく見てみたら「Windows/macOS/Androidでは動かないよ!!」とのこと。。

Linuxなら動くということだと思うので、WSL2上で試せばできるんだろうと思いますが、今回はWindowsで動かしたい事情がありました。

Windows対応を待つしかないかと思いながら、Issueを漁ってみると救世主がいました。

https://github.com/tazz4843/whisper-rs/issues/22

MSYS2 を使えばビルドできたよとのこと!
しかし、Issueを参考にやったもののそのままやってもうまくいかない点が多く、備忘録がてら結論の手順を書き残します。

MSYS2のインストール

まずMSYS2をインストールします。
https://www.msys2.org/ からダウンロードできるMSYS2のインストーラを利用してください。

具体的な手順についてはこちらが参考になります。

https://www.kkaneko.jp/tools/win/windows_msys2dev.html

インストールが完了したら、「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 と入力してエンターを押してください。

環境変数 PathC:\msys64\mingw64\bin を追加してください。
(MSYS2のインストール先に応じてパスは適宜変えてください)

LLVMのインストール

Issueには書いてありませんでしたが、MSYS2をインストールするだけではビルドができなくて、LLVMが必要でした。

ビルド時に使われる bindgen で C/C++ファイルを処理するために libclang を必要とするようで、そのための準備です。

https://rust-lang.github.io/rust-bindgen/requirements.html

を参考にLLVMをインストールし、展開先のbinディレクトリのパスを環境変数 LIBCLANG_PATH にセットしてください。

C:\Program Files\LLVM\bin

Rustツールチェインの準備

PowerShellに戻って、

  1. rustup toolchain install stable-x86_64-pc-windows-gnu
  2. 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ファイルと、モデルデータを用意して、ファイルパスを指定する必要があります。

モデルデータは

https://huggingface.co/ggerganov/whisper.cpp/tree/main

からダウンロードしましょう。

実行結果はこんな感じに。

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