くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2024-11-26

日記

まだ咳が出る。もう少しで治りそうで治らん。ぐぬぬぬ。

土日もなんもできんかったなあ。いやなんかやったような気もする。CD取り込みとか。

[プログラム] オフラインで音声認識続き

nodejsでReazonSpeechで文字起こしができるのは確認できてたのでunacastに入れたい。

とりあえず一番こわいのはElectronで動くunacastでsherpa-onnx-nodeが読み込めるかだが、やってみたらすんなり読み込めたっぽい。じゃああとは組み込んでみよう。

マイクはレンダラープロセスで入力してバックエンドにPCMデータを送りたいが、マイク入力からPCMデータを取得するのが意外と大変。WebAudioてので取得するんだがScriptNodeてのを使おうとするとそれはDepricatedだからやめとけとめちゃくちゃ言われる。しかし代替手段がWorkerなので古いElectronで動くかわからんぞ。ということでまあどうせ古いしブラウザで動かすわけじゃないしScriptNode使おう。

入力はなんとかできたのでバックエンド側にそのまま渡して音声認識させる。認識させる部分は以前やったサンプルと同じ。やってみると一瞬「あ」とかなんとかは認識されるんだがそれっきりになってしまう。なんでだー?

入力のデータがおかしそうなのでじゃあサンプリング周波数が違う?getUserMediaの時に16kHzを指定してるんだが、これはヒントでしかないので結局デバイスの自然なサンプリング周波数を返してきてしまい48kHzになっている。絶対16kHzにしろやと指定もできるんだが、そんなデバイスねえよと怒られてしまう。役に立たねえな。これ別途ダウンサンプルしないといけないか。

でダウンサンプルの方法を探したんだが簡単にはなさそうだ。JavaScriptで書く方法もあるがそれなりのデータ量なのでちょっと不安。sherpa-onnx自体には周波数変換してくれる機能があるがVADにはその機能がなぜか付いてなくて、周波数変換単体の機能もあるがnodejs向けのライブラリには公開されていない。残念すぎる。

いろいろ探してたらWebAudioのOfflineAudioContextを使って変換する方法が見つかった。48kHzのPCMを受け取ってOfflineAudioContextで16kHzにレンダリングするとのこと。うーん、まあ確かにできそうだけどもオーバーヘッド大丈夫?遅くない? まあとりあえずやってみるかで試してみたが特に気になることもなく動いた。ほんとにいいんかという気もしなくはないが、今のところ問題なく動くしこれでいいか。 で、無事音声認識も行われるようになった。

あとはexe作るまでは普通にいったんだが全然起動しない。なんか拡張がパスにないぞと言われる。これのdllがどうやって入ってきたのかよくわかってないが勝手にコピってくれたりするわけじゃないのか。必要そうなdllだのをコピってきたらウィンドウは出たんだが、なぜかすぐ落ちてしまう。こっちはなんもログ出てこないのでわからんなあ。 ひとまずはexe無しでも手元で動かす分には問題ないのでしばらく使ってみよう。

で、日曜の夜に一度使ってみたんだが、音声認識はバッチリだった。今まで使ってたAzureの有料Speech to textより精度良く感じるくらい。まあAzureのはリアルタイム音声認識な一方で今回のReazonSpeechはしゃべったフレーズだけ切り出してあとから音声認識させると方式が違うので直接比較してよいものでもないんだろう。しかし配信時にしゃべったログを表示させておきたいという程度のリアルタイム性であれば十分だった。

しかしexe化以外は上手くいったんだと思ってたものの、なぜかVOICEVOXが読み込めなくなっていた。読み上げにVOICEVOX Coreを使ってるので同じプロセスにdllを読み込んでるんだが、それが読み込めないとかで読み上げができなくなっていた。 なんだろなーと思ったが、そういやVOICEVOXもONNX Runtime使ってるんだった。おそらくsherpa-onnxが使うONNX Runtimeと競合して読み込み失敗してんだなこりゃ。困ったね~。 ひとまず読み上げは他の使うことで回避したけどどうしたもんだろう。

VOICEVOXはCoreを直接読み込むんじゃなくて別プロセスのEngineを呼び出す方法もある。しかしこれだと毎度別にVOICEVOXを起動しとかないといけないのでめんどくさいねえ。 sherpa-onnxの方を別プロセスにする手もあるんだが、その実行ファイルどこでどうやってビルドするのめんどくさい。 あとはsherpa-onnxは今回使ってたsherpa-onnx-nodeの他にWASM版のsherpa-onnxというのがある。これはおそらくCPUで1スレッドしか使えないかわりに全部WASMになってるのでバイナリとか考えずに使えるのではなかろうか。 今もどっちにしろCPUしか使えてないしCPUで十分足りてるし、バイナリの問題がなくなるならexe化しても自然に動くはず。 ただ問題はnodejsの18以上が必要とのことで、今使ってる古いnodejsおよびElectronをアップグレードしないといけない。うーんつらい。

でもほんと古いnodejsとElectronを使い続けるのつらすぎるし普通にアップグレードはした方がいいよなあ。やるか~。そのうち。


ページのトップへ | トップ «前の日記(2024-11-19) 最新 次の日記(2024-12-10)» | 編集 | kumaryu.net by kumaryu