transformer asr japanese サンプルがある。kotoba-whisper-v1.0 を ONNX に変換

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) が軽くて、それなりの認識性能を得られる?

このブログ記事について

このページは、おんちゃんが2024年7月 3日 01:54に書いたブログ記事です。

ひとつ前のブログ記事は「OAK-D-Lite Object Detection YOLOv7 transfer learning.」です。

次のブログ記事は「Transformers Object detection - detr の転移学習とONNX変換と実行。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ