faster-whisperを使ってより速いく正確な文字起こし

# はじめに
Pythonを使って、文字起こしをする方法を記載する。
前回はwhisperを使った文字起こしを行った。しかし、whisperでの文字起こしでは高速で正確な文字起こしを行うことは難しい。よって今回の記事でwhisperよりも最大4倍の高速化をすることができ、さらに正確性も高くなったfaster-whisperを紹介する。
# faster-whisperとは
faster-whisperは、OpenAIのWhisperのモデルをCTranslate2という高速推論エンジンを用いて再構築したものである。CTranslate2とは、NLP(自然言語処理)モデルの高速で効率的な推論を目的としたライブラリであり、特に翻訳モデルであるOpenNMTをサポートしている。また、軽量で高速な推論を実現するために設計されており、CPUやGPU上での実行が可能である。Whisperと比較して、同じかそれ以上の精度を保ちながら最大4倍高速な処理速度と、より少ないメモリ使用量を実現している。faster-whisperとwhisprの処理速度とメモリ使用量のベンチマークは以下の通りになる。
##### Large-v2モデル(GPU)
| 実装 | 精度 | ビームサイズ | 時間 | 最大GPUメモリ | 最大CPUメモリ |
|:-:|:-:|:-:|:-:|:-:|:-:|
|  openai/whisper |  fp16 | 5  |  4分30秒 |  11325MB |  9439MB |
|  faster-whispe | fp16  | 5  |  54秒 | 4755MB  |  3244MB |
|  faster-whisper | fp16  | 5  |  59秒 |  3091MB |  3117MB |

##### Smallモデル(GPU)
| 実装 | 精度 | ビームサイズ | 時間 | 最大GPUメモリ |  
|:-:|:-:|:-:|:-:|:-:|
| openai/whisper  | fp32  | 5  |  10分31秒 |  3101MB  
|  whisper.cpp |  fp32 |  5 |  17分42秒 | 1581MB  | 
|  whisper.cpp | fp16 |  5 | 12分39秒  |  873MB | 
| faster-whisper  |  fp32 | 5  |  12分39秒 | 1675MB  |  
| faster-whisper  | int8  |  5 |  12分39秒 | 1675MB  | 

これらのベンチマークの結果から、faster-whisperはwhisperと比較して大幅な性能向上を達成していることが分かる。
# 使用環境
OS : Windows11
CPU : Intel Corei5-10400F
GPU : NVIDIA GeForce GTX 1660 SUPER ... GPUはなくても動くがあったほうが快適
Python 3.12.2 (Python 3.8以上が必要)
venv : 仮想環境構築
Cuda Toolkit : 12.1 ... NVIDIAのGPUを活用した並列コンピューティングを行うための開発ツールキット
FFmpeg ... オーディオやビデオを録画、変換、およびストリーミングするためのオープンソースのマルチメディアフレームワーク
# 環境構築
前回行ったwhisperの環境構築を行ったものとする。

https://qiita.com/taiki_i/items/99cb17049597fdee6ce2

これを行うことでcudaやtorch、ffmpegなどの環境構築が完了する。
次に、faster-whisperのインストールを行う。
以下のコマンドを仮想環境内で入力する。
```cmd.(faster-whisper)
pip install git+https://github.com/guillaumekln/faster-whisper.git
```
これでfaster-whisperの環境構築が完了する。
# テスト実行
faster-whisperを使って文字起こしを行う。今回はlarge-v2よりもさらに高性能なlarge-v3を使用する。
以下のテストプログラムを使用する。
```transcription.py
### 文字起こし(faster_whisperを使用)
from faster_whisper import WhisperModel

# モデル設定
model_size = "large-v3"

# GPU設定
model = WhisperModel(model_size, device="cuda", compute_type="float16")

AUDIO_FILE = "file_path"

# 文字起こしの実行
segments, info = model.transcribe(AUDIO_FILE, beam_size=5)

# 結果の表示
print("Detected language:", info.language)
for segment in segments:
    print(f"[{segment.start:.2f} - {segment.end:.2f}]: {segment.text}")
    
```
このプログラムはシンプルなプログラムであり、入力ファイルとして指定した音声ファイルの「file_path」の文章ごとに区切ってその文の開始時間と終了時間、文字起こしを行うことができる。
それぞれのプログラムを説明していく。
```.py
# GPU設定
model = WhisperModel(model_size, device="cuda", compute_type="float16")
```
このプログラムではWhisperModelクラスのコンストラクタを呼び出し、新しいWhisperモデルのインスタンスを作成する。
**model_size** : 使用するモデルのサイズを指定する。(ここでは変数として渡している。)
**device="cuda"** : モデルをGPUで実行することを指定している。
**compute_type="float16"** : 計算に半精度浮動小数点を使用することを指定している。これにより、高速化とメモリ使用量の削減が可能になる。
```.py
# 文字起こしの実行
segments, info = model.transcribe(AUDIO_FILE, beam_size=5)
```
**segments** : 文字起こしされたテキストセグメントのリストを返す。各セグメントには、開始時間、終了時間、文字起こしされたテキストが含まれる。
**info** : 文字起こしに関する追加情報を格納したオブジェクトを返す。これには、検出された言語とその確率などが含まれる。
**beam_size=5** : ビームサーチデコーディングのビームサイズを指定するパラメータである。ビームサーチはより正確な文字起こしの結果を得るために使用されるアルゴリズムである。ビームサイズが大きいほどより多くの候補が考慮されるため、計三個ストは増加するが、より正確な結果が得られる可能性がある。
```.py
# 結果の表示
print("Detected language:", info.language)
for segment in segments:
    print(f"[{segment.start:.2f} - {segment.end:.2f}]: {segment.text}")
```
これは使用している言語と文字起こしの結果を出力している。
segmentには開始時間、終了時間、文字起こしされたテキストが含まれる。これをfor分で順番に出力している。
# 参考文献
* https://github.com/SYSTRAN/faster-whisper?tab=readme-ov-file
* https://qiita.com/taiki_i/items/99cb17049597fdee6ce2
* https://qiita.com/daifuku10/items/c170a1361c232914f230