kotoba-whisper-v1.0
が
large3 より速いし日本語特化らしい
https://zenn.dev/asap/articles/ba8fcb1880165e
これと
https://zenn.dev/asap/articles/2c0d421e68ef16
の
生成AIをローカルで簡単に 【Part5.5 faster-whisper+マイク録音編】
と組み合わせることにする
https://github.com/personabb/colab_AI_sample/tree/main/colab_fasterwhisper_sample
のソースコード
を参考に作り上げる
とりあえず設定ファイルの解説
https://zenn.dev/asap/articles/2c0d421e68ef16
の解説を見ながら行う
git clone https://github.com/personabb/colab_AI_sample.git
でリポジトリクローン
cd colab_AI_sample cd colab_fasterwhisper_sample
で
Faster-whisperのところへ移動
python main.py
でとりあえず稼働テスト
config.json: 100%|█████████████████████████| 2.39k/2.39k [00:00<00:00, 13.2MB/s] preprocessor_config.json: 100%|████████████████| 340/340 [00:00<00:00, 1.59MB/s] tokenizer.json: 100%|███████████████████████| 2.48M/2.48M [00:02<00:00, 962kB/s] vocabulary.json: 100%|██████████████████████| 1.07M/1.07M [00:02<00:00, 419kB/s] model.bin: 100%|███████████████████████████| 1.51G/1.51G [02:37<00:00, 9.58MB/s] [2024-09-03 05:52:04.173] [ctranslate2] [thread 17310990] [warning] The compute type inferred from the saved model is float16, but the target device or backend do not support efficient float16 computation. The model weights have been automatically converted to use the float32 compute type instead. stand by ready OK recording... finished ごめん stand by ready OK recording... finished ごめん stand by ready OK recording... finished あれ? stand by ready OK recording... finished 今日の天気 stand by ready OK recording... finished 明日の天気。 stand by ready OK recording... finished 今日はご飯を食べたいハンバーグも欲しい stand by ready OK recording... finished 終わり stand by ready OK recording... finished 一応はこれで使い物にはなるかな stand by ready OK recording... finished 文字を少しまで何秒 stand by ready OK recording... finished あらら stand by ready OK recording... finished あわわわ stand by ready OK recording...
となってほぼ聞き取りができている
ただしアレクサの音声は聞き取りがうまくできなかった
時間は数秒のタイムラグで実行され文字起こしされる
Ctrl+Cをおしてプログラムを停止するまで、永遠に録音と文字起こしが繰り返される
そこまでこだわらなくても
以前、顔の個人認識のときみたいに
ソースをもらって使えばいい
とりあえず修正にあたりソースの理解は必要なので
設定ファイルのソースからみる
[Recorder] fs=16000 silence_threshold=0.5 min_duration=0.1 amplitude_threshold=0.05 start_threshold = 0.3 [FasterWhisper] device = auto language = ja gpu_model_type = large-v3 gpu_beam_size = 1 gpu_compute_type = float16 cpu_model_type = small cpu_beam_size = 1 cpu_compute_type = int8 use_kotoba = True kotoba_model_type = kotoba-tech/kotoba-whisper-v1.0-faster chunk_length = 15 condition_on_previous_text = False
以下解説
[Recorder]部分は録音モジュールに関係する設定
fs=16000
サンプリングレート16,000Hzで録音
これは
Whisperが16,000Hzの音声を前提としているため
silence_threshold=0.5
無音になってから0.5秒後に録音を停止するパラメータ
min_duration=0.1
streamで録音する際の、chunkの大きさ
変更の必要はない
amplitude_threshold=0.05
無音判定の閾値です。音声の音量が0.05よりも小さい音は無音と判定
これが0だと、自然なノイズも全て音と判定するため、永遠に録音が終わりません
start_threshold = 0.3
閾値(amplitude_threshold)以上の音量が、0.3秒以上継続して入ってきたら、発話開始と判断して録音を開始します。
突発的なノイズによる閾値越えを防ぐための処理
[FasterWhisper]部分は文字起こしモジュールの設定
device = auto
マシンのGPUやCPUのどちらを利用するかの設定
autoの場合は、マシンがGPUを利用できるならGPUを利用する。
その他ではcudaやcpuを指定できる
gpu_model_type = large-v3 gpu_beam_size = 1 gpu_compute_type = float16 cpu_model_type = small cpu_beam_size = 1 cpu_compute_type = int8
は
モデルの設定をしている
GPUを利用する場合とCPUを利用する場合でモデルを変更している
GPU利用の場合はlarge-v3モデルという高性能モデルを利用している
CPU利用の場合はsmallモデルという軽量モデルを利用している
加えてCPUの場合は、int8という小さなデータ型を利用して、
計算量を減らしている
use_kotoba = True kotoba_model_type = kotoba-tech/kotoba-whisper-v1.0-faster chunk_length = 15 condition_on_previous_text = False
これは
日本語特化モデルであるkotoba-whisper-v1.0を利用する設定
kotoba_model_type = kotoba-tech/kotoba-whisper-v1.0-faster
で
利用するfaster-whisperモデルを指定
次に
import sounddevice as sd from module.module_whisper import FasterWhisperModel from module.module_recorder import Recorder def main(): recorder = Recorder() fasterWhispermodel = FasterWhisperModel() while True: audio_data = recorder.speech2audio() text = fasterWhispermodel.audio2text(audio_data) print(text) if __name__ == "__main__": main()
のソース
これがmain.py
from module.module_whisper import FasterWhisperModel from module.module_recorder import Recorder
で
moduleフォルダ内の録音用のモジュールと文字起こし用のモジュールを呼び出し
recorder = Recorder() fasterWhispermodel = FasterWhisperModel()
で
呼び出したモジュールのクラスのインスタンスを作成
while True: audio_data = recorder.speech2audio() text = fasterWhispermodel.audio2text(audio_data) print(text)
これで
recorder.speech2audio()メソッドで音声を録音して、録音データをaudio_dataに格納し、fasterWhispermodel.audio2text()メソッドにて、音声ファイルを文字起こしして、textとして表示
つまり
printではなく
文字を送信するメソッドを作成すれば処理は完成するはず