0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

概要

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

必要なもの

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

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をインストールします。
手順は以下の通りです。

  • FFmpeg公式サイトにアクセス
  • 「Download Source Code」をクリックし、tarファイルをダウンロード
  • 「ffmpeg-7.1.1.tar.xz」を解凍し、回答したフォルダーを「C:」上に移動※ダウンロード後のファイル名は「ffmpeg-7.1.1」なので「ffmpeg」に名前を変更
  • システム環境変数の「Path」に「C:\ffmpeg\bin」を追加
  • PCを再起動

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

アルゴリズムは以下の通りです。

  • 利用可能なマイクをリストアップ
  • 使いたいマイクを数字で指定※ここではPCのマイクが0番目にあったので0と指定
  • サンプリング周波数と出力するファイル名を定め、さらに引数として録音時間を指定
  • with mic.recorderで録音
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」を使用した認識に挑戦します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?