pyttsx3で録音したwhisperのモデルごとの精度比較

# 概要
今回は、音声認識AIのWhisperをvenv環境上でインストールし、録音した声を認識してみます。
また、OpenAIのWhisperはChat-GPTやDALL-3と異なり、一部モデルはPythonで無償利用できます。

## 必要なもの
<ul>
    <li>FFmpeg→音声認識で必要となる動画・音声処理ツール</li>
    <li>pyttsx3→音声を録音するためのライブラリ</li>
    <li>whisper→OpenAI社が提供する音声認識AI</li>
</ul>

## Whisperのモデル
Whisperのモデルは以下を参照しました。
Whisperモデル|パラメータ|必要なVRAM|相対的な速度|
---|---|---|---|
tiny|39 M|~1 GB|~10x|
base|74 M|~1 GB|~7x|
small|244 M|~2 GB|~4x|
medium|769 M|~5 GB|~2x|
large|1550 M|~10 GB|1x|
turbo|809 M|~6 GB|~8x|

Whisperのモデル比較サイト
https://github.com/openai/whisper

## プログラム
まず、必要なライブラリをインストールします。
```
#録音用ライブラリ
pip install soundcard
pip install soundfile

#Whisper
pip install git+https://github.com/openai/whisper.git 

```

次、動画・音声処理ツールのFfmpebをインストールします。
手順は以下の通りです。
<ul>
    <li><a href="https://ffmpeg.org/download.html">FFmpeg公式サイト</a>にアクセス</li>
    <li>「Download Source Code」をクリックし、tarファイルをダウンロード</li>
    <li>「ffmpeg-7.1.1.tar.xz」を解凍し、回答したフォルダーを「C:」上に移動※ダウンロード後のファイル名は「ffmpeg-7.1.1」なので「ffmpeg」に名前を変更</li>
    <li>システム環境変数の「Path」に「C:\ffmpeg\bin」を追加</li>
    <li>PCを再起動</li>
</ul>

上記の作業で準備完了したのでプログラムを実行します。
まず、録音を行います。

アルゴリズムは以下の通りです。
<ul>
    <li>利用可能なマイクをリストアップ</li>
    <li>使いたいマイクを数字で指定※ここではPCのマイクが0番目にあったので0と指定</li>
    <li>サンプリング周波数と出力するファイル名を定め、さらに引数として録音時間を指定</li>
    <li>with mic.recorderで録音</li>
</ul>

```
import soundcard as sc
import soundfile as sf

 # 利用可能なマイクをリストアップ
print("Available microphones:")
for mic in sc.all_microphones():
    print(mic) 

def sound_catch(record_sec):
    # 指定されたマイクを取得
    mic_name = sc.all_microphones()[0].name
    mic = sc.get_microphone(id=mic_name, include_loopback=False)

    output_file_name = "output.wav"    # 出力するファイル名を指定
    samplerate = 48000                # サンプリング周波数 [Hz]

    if mic is None:
        print(f"指定されたマイク '{mic_name}' が見つかりません。")
        return

    with mic.recorder(samplerate=samplerate) as recorder:
        # 音声を録音
        print(f"録音を開始します ({record_sec} 秒間)...")
        data = recorder.record(numframes=samplerate * record_sec)
        
        # モノラルで保存
        sf.write(file=output_file_name, data=data[:, 0], samplerate=samplerate)
        print(f"録音が完了しました。'{output_file_name}' に保存されました。")

if __name__ == "__main__": 
    sound_catch(15) #引数record_secは録音時間なので予め設定
```

次、Whisperを使って音声認識します。
使用する音声は、私が「あめんぼのうた」の冒頭を言った時の声です。長さは15秒です。

```
import time
import whisper

input_file = "C:/使用するディレクトリ/output.wav"  # 音声データのファイルパスを設定
model = whisper.load_model("small")  # 使用するモデルを指定※Whisperのモデルを参照

start_time = time.time()
result = model.transcribe(input_file, fp16=False)  # 音声データの文字起こし
end_time = time.time()
print(result["text"])  # 文字起こし結果の表示
print(f'実行時間: {end_time - start_time} seconds') #実行時間の表示

```

以下は処理の結果です。

音声の長さが15秒の場合
Whisperモデル|認識結果|処理速度|
---|---|---|
tiny|アメンバーカイなIUAを受け持ち声びもおよいでいる書きのきくりのきかきくけこきつつきこつこつかれ気やすき|2秒|
base|アメンバーカイナー アイユウエーオウキモニ声々もおよいでるかきのきくりのきかきくけこきつつきこつこつかれけやしき|4秒|
small|アメンバーカイナアイウェーを 浮きもに声びも泳いでるかきのきくりのきかきくけこ きつつきこつこつかれけやしき|19秒|
medium|アメンバーカイナアイウエオウ ウキモニコエビモオヨイデルカキノキクリノキカキクケコ キツツキコツコツカレケアシキ|22秒|
large|アメンバーカイナアユウエオウキモニコエビモオヨイデルカキノキクリノキカキクケコキツツキコツコツカレケアシキ|92秒|
turbo|アメンバーカイナアイウエオウキモニコエビも泳いでるカキノキクリノキカキクケコキツツキコツコツカレケヤシキ|28秒|

結果を見るとモデルの規模によって認識精度が異なっているのが分かります。また、turboは最近できたwhisperのモデルであるので、処理速度が短くカタカナであれど高精度に認識できていることを確認しました。

# まとめ
今回はwhisperの基本的なモデルで精度比較をしてみたものの、高精度になるとより正確かつカタカナに認識されていることを確認しました。今後は日本語特化のwhisper「kotoba-whisper-v2.0」を使用した認識に挑戦します。