そのうちやりたい事の一つ。
ストレッチしてて、30秒タイマーを音声で始めたい。 録音にして音声っぽいの来たら送る感じにしたいが、この形態だとどこかのクラウドサービスに送らないとだめそうなので無料枠でイケるかは調査がいるなぁ。
Googleは1時間まで無料、Azureは5音声時間まで無料。Azureはしばらくは十分かもしれない。
Android record audio while doing speech recognition - Stack Overflow
同じようなことをやろうとしてる話。
android-docs-samples/speech/Speech at master · GoogleCloudPlatform/android-docs-samples Cloud APIのAndroidの例。
認証周りが面倒そうだなぁ。
TFLiteでは日本語の音声認識のモデルは無さそう。 PyTorch Mobileというのはあって、これがどのくらい動くのかを試したい気がする。
とりあえず作業した事をメモしておく。(2022/08/15)
とりあえずは提供されているモデルをそのまま動かしてみる。
git cloneして、streaming_asrv2.ptlをダウンロードしassets下に置く。
あまり精度は良くないがとりあえず動いた。こういうのが一発で動くのは体験がいいな。Googleとの技術力の違いを感じるよなぁ。
WRITE_EXTERNAL_STORAGEとかのpermission、コードを見る限りは要らなさそうだけどいるのかしら? 消してみよう。>動いた
次は日本語モデルを使いたいので、自前でコンバートを調べたい。 なんかstreamingはモデルのインターフェースを変更する作業が必要そうだな。 これはどうなんだろう。
それよりは音の区切りは自分でハンドルして、単発の単語を送る、という風にしたい気がする。 SpeechRecognitionの方のサンプルも動かしてみよう。
なんかこっちはNDKが必要と言われるな。何に使ってるのかしら?
動かしたら精度はだいぶ高いな。ただ3秒くらい認識にかかっている気がする。少し遅いが、まぁこれでやってみるかなぁ。
モデルとしては以下を試すか。 NTQAI/wav2vec2-large-japanese · Hugging Face
SpeachRegonitionの変換コードを見ていると、logitからローマ字への変換は手動でやっているな。 これって日本語だとWav2Vec2Processorが必要な気がするんだけど、モバイルではどうするのがいいんだろうか? いまいちやり方は載ってないな。
変換する方法もありそうな気もするけれど、所詮logitからなにかへの変換テーブルなんだろうから、pythonからkotlinのテーブル吐き出させればいいか? なんかdexの制限に当たりそうな気もするか。 とりあえずjitを試してみて素直に動きそうならそれで、無理そうなら変換テーブルを作る方向でいこう。
まずはSpeechRecognitionのデモアプリのコンバートを自力でも試す。 colabで出来ないかな。
出来た。pytorch_android_liteのバージョンを上げたらロード出来て実行出来た。
以後以下のcolabで作業する。
wave2vec_conv.ipynb - Colaboratory
pred_idはvocab.jsonに書いてあるものっぽいな。まぁtokenizerから取り出してモデルに持たせるか。
出来た。でも精度はいまいちだな。この辺に特化したfine tuneしないとだめか。
ひらがなモデルというのがあった。こっちの方が使いやすいのでは?と思い評価してみる。
vumichien/wav2vec2-large-xlsr-japanese-hiragana · Hugging Face
うーむ、こちらの方が良いが、それでも実用には遠いか。
“facebook/wav2vec2-large-960h-lv60-self”はbaseよりスコアが良いという事に気づいて試してみる。 これは単語レベルでは割と使い物になる。
しばらく音声認識を試していて、結局やりたい事は開始だけなのだから、音量だけでいいんじゃないか? という気がしてくる。