transformer asr japanese サンプルがある。
おんちゃんは、transformer asr のサンプルの、下記を試しておったが、
Automatic speech recognition
なんとも、日本語対応がすでに、ありますっと。
google で検索していたら、transformer asr japanese があった。
kotoba-tech/kotoba-whisper-v1.0 を ONNX に変換して動かしてみた。
1. 自分で転移学習をするなら、
August 2023, Fine-Tuning ASR Models for Japanese and Vietnamese by using OpenAI Whisper and Azure Speech Studio
2. そのまま使うなら、
kotoba-tech/kotoba-whisper-v1.0
ここのサンプルで、最近、判ったことだが、
torch_dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
の部分は、使う GPU によっては、注意が必要みたいぞね。
おんちゃんの、GPU は、 GTX-1070 じゃが、この場合は、float16 は、使えないみたいぞね。
#torch_dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
torch_dtype = torch.float32
こちらにすべきです。
これで、3.8 sec/f だったのが、 1.18 sec/f になったぞね。
日本語音声認識に特化したWhisperである kotoba-whisper-v1.0を早速試してみた
Kotoba-Whisper入門 - 日本語音声認識の新しい選択肢
結論を言えば、kotoba-whisper-v1.0 で、GTX-170 の場合、torch_dtype = torch.float32 で使うと、
リアルタイム MIC 入力で使えば、それなりに快適に動きます。
Yutube の怪談の動画の音声をスピーカーに出して、それをマイクで拾って遊んでいます。
まあ、間違いは、お愛嬌か。
2. kotoba-whisper-v1.0 を onnx に変換できるのか試してみる。
Export to ONNX を参考に、 ONNX に変換してみる。
$ optimum-cli export onnx -h
で、 --task を確認できるが。
--task automatic-speech-recognition を使うべきか。
$ optimum-cli export onnx --model kotoba-tech/kotoba-whisper-v1.0 --task automatic-speech-recognition kotoba-whisper-v1.0_onnx/
これは、変換できたのだろうか?
最後の部分が気になるが?
The ONNX export succeeded with the warning: The maximum absolute difference between the output of the reference model
and the ONNX exported model is not within the set tolerance 0.001:
- last_hidden_state: max diff = 0.011976242065429688.
The exported model was saved at: kotoba-whisper-v1.0_onnx
一応、kotoba-whisper-v1.0_onnx/ ディレクトリーにできたみたい。
しかし、ファイルが2 つも出てきた。
encoder_model.onnx
decoder_model.onnx
どうやって、使うのか? 皆目、わからん。
How can I use the ONNX model? あたりが参考になるのか?
Optimum Inference with ONNX Runtime
from optimum.onnxruntime import ORTModelForSeq2SeqLM
の
ORTModelForXxx 部分を、指定すればよいのか?
Transformers Asr は、何をつかうのか?
ORTModelForSeq2SeqLM で、良いのか?
下記コードを試してみた。
onnx-pred.py
実行してみた。
後は、人のspeechを入力すればよいのか?
入力データは、
kotoba-whisper-v1.0_onnx/config.json が参考になるのか。
"encoder_ffn_dim": 5120,
"max_length": 448,
辺りか。
自分で、ffn に変換するのか?もしかしたら、pipeline() で、変換してくれるのか?
ORTModelForSeq2SeqLM ではなくて、
ORTModelForSpeechSeq2Seq を使うみたい。
最終的に、下記コードで、OK でした。
onnx-pred.py
実行結果は、
なぜだか、うまく動いた。
すごい!!
後は、pipelines() は、遅いから、これを使わない方法を考えないといかんぞね。
ORTModelForSpeechSeq2Seq() に直接、音声データを入力する方法を、考えればよいのか。
ONNX から、quantize して、orange pi5 armbian jammy で動かせるようになるのだろうか?
3. Transformers Quantization を試してみる。
Transformers Quantization の、 bitsandbytes を試してみた。
bitsandbytes
上記を参考に、kotoba-tech/kotoba-whisper-v1.0 を、 8-bit モデルにしてみた。
quantize-pred.py
$ python quantize-pred.py
で、./kotoba-whisper-v1.0-8bit/model.safetensors が出てきたけれど、これは、
そのまま、 ONNX に変換できるのだろうか?
これは、このままロードすれば、使えるみたい。
GPU 版には、及ばないけれど、
sec/f: 3.8781877358754477
非GPU でも、早いみたい。
sec/f: 4.035113255182902
これを使った、prediction も作ってみた。
$ python sample2-bit8.py
4. ONNX を quantize してみる。
"2. kotoba-whisper-v1.0 を onnx に変換できるのか試してみる。" で変換した、ONNX を、quantize してみます。
深層学習の量子化に入門してみた 〜BERTをDynamic Quantization〜 を参考にさせてもらいました。
onnx2qauntize.py
kotoba-whisper-v1.0_onnx/encoder_model-8bit.onnx , decoder_model-8bit.onnx ができるので、
後は、前の onnx-pred.py で、これを使えばOK ぞね。
piplines() が、ネックか、あまり速度の改善は無い。
sec/f: 12.050926446914673
多分、piplines() をやめれば、もっと早いのでは?
Build and deploy fast and portable speech recognition applications with ONNX Runtime and Whisper に、
pipelines を使わない例があったので、取り込んでみた。
onnx-pred_pro.py
i) predicted_ids = model.generate(input_my)
を使えば、OK でした。
ii) 入力データの変換は、
x=feature_extractor(inputs,sampling_rate=feature_extractor.sampling_rate)
で、変換してくれました。
処理内容を調べるには、
transformers.WhisperFeatureExtractor
~/torch_env/lib/python3.10/site-packages/transformers/models/whisper/feature_extraction_whisper.py
の中をみてみないといかんぞね。
将来、マイク入力にする場合、ここの理解がひつようぞね!!
多分、 mel 化、 padding、ノーマライズ等の処理が入っているか?
ここの処理の流れは、
openai / whisper
のサンプルを見るとわかりやすい。
a) 音楽データをロードして、Normalize
b) pad_or_trim して、
c) mel 化して( tensor 化)
d) 読み込ませる。
該当コードは、
whisper/audio.py
にあるので、わかりやすい。
これは、使えるのでは?
試して見ましたが、処理時間は、ほとんど変わらない。残念。
sec/f: 11.72364239692688
ONNX quantize 版は、入力形式が、torch.float32 なのがなにか変。
大元の、torch 版は、 float32 -> float16 にロード時に、変換しているので、torch.float16 なのだが。
torch 8 bit 版の、pipelines を使わない、prediction も作ってみた。
$ python sample2-bit8_pro.py
試した、python scripts は、後で、github にでも上げておきます。
tosa-no-onchan/kotoba-whisper
Transformers kotoba-whisper-v1.0 の ONNX quntize 版は、OrangePi 5 の NPU でも変換すれば動くのだろうか?
参考。
1) 【音声認識2022】音声からテキストへ変換する「Whisper」でYouTube動画の文字起こしを実装する
2) 【音声認識2023】Google Colab で「Whisper large-v3」を使ってYouTube動画を文字起こしする(large-v2との精度比較あり)
3) Whisperを使ったリアルタイム音声認識と字幕描画方法の紹介
4) openai / whisper
5) 【音声認識ライブラリ】PythonでSpeechRecognitionを使って日本語を認識させてみる!
speech_recognition/__init__.py
line 58
class Microphone(AudioSource):
が、マイク入力の参考になりそう。
下の、サンプルでも使っているみたい。
6) Real Time Whisper Transcription
リアルタイムで、ASR を実行している。
常に、Mic 入力を取り込んで、queue で送ってくる仕掛けじゃが。
多分、 --energy_threshold=1000
以上のMic 入力が有ると、record を始めて、queuing してくるのでは?
おんちゃんも、以前 Mic 入力をしたとき、その様にした。
これを取りこんだ、sample2-pro_mic.py を作ってみた。
$ python sample2-pro_mic.py
こちらは、GTX-1070 flota32 版だが、それなりに遅滞なく変換できる。
しかし、YouTube の動画をマイクで取りこんでいると、取りこぼしが結構あるみたい。
入力部分をダブルバッファリングでもしないと、改善できないのでは?
C++ だと、その辺りは、うまくできそうだけど、Python は、どうするのか?
改善版を、作ってみました。ダブルバッファリングではないが、
pyaudio.PyAudio() Non Blocking と言うのがあったので、それを参考に
sample2-pro_mic_my.py を作ってみた。
$ python sample2-pro_mic_my.py
でも、時々、言葉が抜けているようじゃ。
しかし、おんちゃんが思うに、どのサンプルをみても、既存のライブラリーを組み合わせて使うだけで、
それを、参考にして、自分でもっと良い関数を作る発想が無い。
まことに、安直じゃ!!
他人のサンプルをそのまま使うのが嫌いなおんちゃんは、自分で MIC 入力関数を作りました。
マイク入力の音量が一定以上になると、Streamming を始めて、音量が低くなると停止する機能付きぞね。
mic_stream.py
単体でも動作確認できます。
$ python mic_stream.py
7) faster-whisper。
SYSTRAN/faster-whisper
こちらが、速いかと思ったが、 openai-whisper とそれほど違わない。
リアルタイムに、マイクから取りこんで、試していたら、
よく、GPUメモリー不足で、エラーになるみたい。
精度は、openai-whisper(medium) のほうが良い気がする。
でも、やはり、kotoba-whisper-v1.0(GPU flot32) が軽くて、それなりの認識性能を得られる?