Whisperを使った音声(動画)ファイルの文字起こし

# はじめに
今回は、音声認識AIのWhisperをローカル環境で使用する方法を詳しく紹介します。
Whisperは有料でAPI利用もできるが、今回は無料でローカルインストールして使用する。
# Whisperとは
Whisperとは、ChatGPTなどを開発したOpenAI社が提供している音声認識AIである。Whisperは機械学習アルゴリズムと深層学習を駆使して、高度な音声認識を実現している。
また、Whisperは日本語や英語など約100言語に対応している。
詳しいアルゴリズムなどは以下のリンクを参照してください。

https://github.com/openai/whisper?tab=readme-ov-file

# 環境
今回使用する私の環境は以下の通りです。
##### -PC内環境-
OS : Windows11
CPU : Intel Corei5-10400F
GPU : NVIDIA GeForce GTX 1660 SUPER ... GPUはなくても動くがあったほうが快適
Python 3.12.2 (Python 3.7以上が必要)
venv : 仮想環境構築
Cuda Toolkit : 12.1 ... NVIDIAのGPUを活用した並列コンピューティングを行うための開発ツールキット
FFmpeg ... オーディオやビデオを録画、変換、およびストリーミングするためのオープンソースのマルチメディアフレームワーク
# 環境構築
### 仮想環境構築
venvを使った仮想環境構築のやり方は以下を参照。

https://qiita.com/taiki_i/items/3601d6962edccd637415

ここでの仮想環境の名前([venv_NAME])は"whisper"とする。
### CUDA Toolkit
今回は[CUDA Toolkit 12.1](https://developer.nvidia.com/cuda-12-1-0-download-archive?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_local)をダウンロードする。(Pytorchとバージョンをそろえる。)
以下のように自分の環境を指定しダウンロードする。
![CUDAのversion指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806771/9155eb45-fe07-a631-8142-14b0bac635c8.png)
### Pytorch
CUDA Toolkitと同じバージョンを指定してインストールする。今回の場合は[+cu121のPytorch](https://pytorch.org/get-started/locally/)をインストール。
以下のように自分の環境の指定を行う。
![Pytorch cu+121](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806771/7ae367e1-55b0-49de-2dc5-4794913b1ea7.png)
すると画像の「Run this Command」にインストールするためのコマンドが生成される。これを仮想環境上に入力していインストールを行う。
```cmd.(whisper)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
```
### FFmpeg
以下の手順で[FFmpeg](https://github.com/BtbN/FFmpeg-Builds/releases)をダウンロードを行う。また、FFmpegを使用するにはPassを通す必要がある。
まず、画像の「ffmpeg-master-latest-win64-gpl.zip」を指定してダウンロードする。(ダウンロードを行ったフォルダーをメモすると良い。)
![FFmpeg Assets](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806771/b9bf28c8-5c8a-5b52-03eb-e310d79e35eb.png)

次にFFmpegのPathを通す。
Windowsの検索欄に「システム環境変数の編集」と入力して実行する。
![システム環境変数の編集画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806771/19685813-3238-c8ca-08b9-4bf995450f60.png)
次に「環境変数」を実行。
「[USER名]のユーザー環境変数(U)」の「Path」を実行する。
「新規作成」を実行し、先ほどFFmpegをダウンロードしたファイルの一つ下のディレクトリにある「bin」までのPathを通す。
```
[USER_PASS]\ffmpeg-master-latest-win64-gpl-LatestAuto-Build (2024-05-31 1250)\bin
```
「OK」を押してウィンドウを閉じる。
### ライブラリのインストール
Whisperのインストールを行っていく。
```
pip install git+https://github.com/openai/whisper.git
```
上のコマンドを実行することで以下のパッケージがインストールされる。
* numpy
* torch
* tqdm
* more_itertools
* transformers
* ffmpeg-python
# テスト実行
では今から、Whisperのサンプル音声の文字起こしを行っていく。
今回は[サンプル音声データ](https://self-development.info/%E3%81%BB%E3%81%BC%E5%AE%8C%E7%92%A7%E3%81%AA%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8Bai%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98whisper%E3%81%AE%E3%82%A4%E3%83%B3/)の文字起こしを行う。こちらの音声ファイルを拝借しました。
サンプル音声の内容は以下の通り。
```
過去最強クラスの台風14号が近づいてきています。九州南部、そして北部の皆さんを中心に防風、高波、高潮や大雨などに最大級の警戒をしてください。
```

### プログラム
サンプルプログラムは以下の通りである。
```transcription.py
import whisper

# モデルのロード
model = whisper.load_model("base")

# 音声ファイルのパス
audio_path = "file_path"

# 音声ファイルの文字起こし
result = model.transcribe(audio_path)

# 結果を表示
print(result["text"])
```
このプログラムはシンプルにモデルをロードして結果のテキストを出力するプログラムである。「file_path」のところを音声ファイルとする。また、モデルは公式ドキュメントに以下のような記載がある。
| Size | Parameters | English-only model | Multilingual model | Required VRAM | Relativ speed |
|:-:|:-:|:-:|:-:|:-:|:-:|
|  tiny |  39 M |  tiny.en |  tiny |  ~ 1 GB | ~ 32 x  |
|  base |  74 M |  base.en |  base |  ~ 1 GB |  ~ 16 x |
|  small |  244 M |  small.en |  small |  ~ 2 GB |  ~ 6 x |
|  medium |  769 M |  medium.en |  medium |  ~ 5 GB |  ~ 2 x |
|  large |  1550 M |  N/A |  large | ~ 10 GB  | 1 x  |

今回のプログラムではテストとして標準の「base」モデルで行う。

### 結果
プログラムを実行した結果は以下の通りになる。
```
過去最強クラスの台風14号が近づいてきています。九州南部、そして北部の皆さんを中心に防風、高波、高市屋大雨などに最大球の警戒をしてください。
```
出力の結果、「高潮や」を「高市屋」と誤字しているだけだった。
# 参考文献
* https://github.com/openai/whisper
* https://self-development.info/%E3%81%BB%E3%81%BC%E5%AE%8C%E7%92%A7%E3%81%AA%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8Bai%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98whisper%E3%81%AE%E3%82%A4%E3%83%B3/