Whisperによる音声の書き起こし on Windows/CUDA
Whisper について
Whisper は音声の書き起こし(Speech-to-Text)を実現するモデルの一つです。
この記事は、2023/03時点で最新バージョンの20230314をWindows/CUDA環境で動作させるための手順を記録したものになります。
ffmpeg のインストール
Whisper は内部で ffmpeg を使用していますので scoop を使用してインストールします。
scoop がインストールされていない場合は scoop を先にインストールします。
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
> irm get.scoop.sh | iex
> scoop install ffmpeg
CUDA のバージョンを確認
以下のコマンドで CUDA のバージョンを確認します。
もしインストールされていない場合は、こちらのページが参考になります。https://www.kkaneko.jp/tools/win/cuda.html
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:41:10_Pacific_Daylight_Time_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
2023/03時点でCUDAの最新版は12.1なのですが、PyTorchが12.1に対応していないため、PyTorchが対応しているバージョンのCUDAをインストールします。
私の場合は CUDA 11.8 を使用しました。
PyTorchの再インストール
CUDA のバージョンによって使用する PyTorch のバージョンが異なるため以下のページで確認をします。
例えば、 CUDA 11.6 の場合は以下のコマンドになります。
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu116
CUDA 11.8 の場合は、2023/03現時点で最新版のPyTorchでOKのため以下のようにバージョン指定なしでインストール可能です。(今後バージョンが変わる可能性があるためCUDAのバージョンとPyTorchのバージョンの対応状況を都度確認することを推奨します)
pip3 install --force-reinstall torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
Whisper をインストールした際に PyTorch も一緒にインストールされるのですが、そのままではCUDA環境で実行することができないため、コマンドに --force-reinstall を追加して強制的に再インストールするのがポイントです。
numba のアップグレード
私が実行したときはPyTorch を再インストールしたときに以下のエラーがでました。
numba のバージョンが依存する numpy のバージョンと現時点の numpy のバージョンに互換性がないため numba が利用できない状態になっています。
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
numba 0.56.4 requires numpy<1.24,>=1.18, but you have numpy 1.24.1 which is incompatible.
今回は以下の記事を参考に numba をアップグレードすることで解決しました。
pip install -U numba
Whisper を使用する
以上で Whisper を使用する準備は完了です。
以下のコードで音声ファイルを書き起こすことが可能になります。
import whisper
model = whisper.load_model("medium", device="cuda")
result = model.transcribe("audio.wav", language="ja")
print(result["text"])
Discussion