kotoba-whisper-v1.0

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ではなく
文字を送信するメソッドを作成すれば処理は完成するはず