【UE4】簡単な音声認識をしてみた
はじめに
裏 Unreal Engine 4 (UE4) Advent Calendar 2016 10日目です。
本記事の主役とも言えるほげたつさんのアセットのレビューがされている こちらの記事も合わせてお読みください(何ももらってませんよ)
今回はちょーお手軽に音声認識をしてみようと思います。
というのもmikulusを見てるとUnityは標準で音声認識が出来たり、プラグインを探すと大体英語対応のものばかりで辛い目に遭いました。
なので作りました。
現在作成中のVR内で使えるキーボードに音声認識で入力アシストするのに使っています。
イメージ
音声認識で入力アシストできるようにした #UE4 #VR_keyboard https://t.co/NYLHmjmO1H
— てんちょー (@shop_0761) 2016年11月20日
こちらテスターを募集しているのでOculusTouchがある方はぜひお願いします。@shop_0761にご連絡ください。(圧倒的テスター不足)
方針
色々遠回りしたお話は、あとに書くとして端的に実装方針を説明します。
http通信を用いて実装します。
しかもこれ、ほげたつさんがすでにプラグインを作成して公開しています!!
まぁWebApiプラグインはUE4を触り始めて1週間くらいで作り始めたものだから直すところ沢山なのは仕方ない
— ほげたつ (@HogeTatu) 2016年11月18日
つよい。
ちなみに
@shop_0761 たぶん今後は要望があればバージョンアップ対応だけやって非推奨になると思いますー
— ほげたつ (@HogeTatu) 2016年11月18日
らしいので先日のこちらの記事を参照してゆくゆくは移行しましょう。
http通信については適当にググるか、頭を空っぽにしてそういうものがあるんだなくらいでも動きます。
参考サイトを貼っておくので自作しても構いません。先人は偉大!
参考:
面倒な方は僕がすでに作成したものでも使ってください。実行するだけです。おわり。
ダウンロードするだけで環境が整ってしまいました。
音声認識の精度について
精度的なお話だと、
こちらのほうがいいかもしれません。ただなぜか手元の環境だと、
await contSpeechRecognizer.ContinuousRecognitionSession.StartAsync();
のところで The speech privacy policy was not accepted prior to attempting a speech recognition. と言われてしまい実行できず…
音声認識のプライバシーポリシーってどこで設定するんだ…となってしまったので詳しい方がいればぜひお教えいただけると嬉しいです。
このように認識は外部のツール依存なので、自作してチューニングすればよりよいものになるかと思います。
実装する
と言っても、大したことはしません。
先程のほげたつさんのプラグインにはサンプルプロジェクトWebApiDemoがあるので、それを起動します。
その中にあるWebApiDemo/WebApi/Api 内にあるBP_DemoApiBaseを開きましょう。
そして、継承元の変数を表示するために赤線のところにチェックを入れます。
すると
Domain変数が見えます。
今回はアプリのポートの都合上ここを http://127.0.0.1:50001/ に書き換えます。
あとは、さっきの音声認識のツールを実行後にUE4側で実行しましょう。
SimpleGetを押せば終了!!
音声認識の結果が得られます。
ちなみにこのStringはBP_01_SimpleGet内のResponsebodyに入ってるので後はご自由に。
VRKeyboardの方ではTickで適当にポーリングするBPComponentにしてます。
応用例
普通に音声認識してそのまま使ってもいいのですが、ちょっとあちこち手を加えてこんなことをしてみました。
声が先に聞こえるよ(いっこく堂風) #UE4 https://t.co/r7Po9pnMTD
— てんちょー (@shop_0761) 2016年12月5日
音声認識した結果を使ってLipSync的なことをしています。これをLipSyncさせても面白いかもですね。
[UE4] Grayちゃんと会話 https://t.co/pbFJ5YjaLq
— ほげたつ (@HogeTatu) 2016年11月27日
Docomo雑談APIを使ってGrayちゃんと会話してみた。APIリクエストには開発中のNekoNekoOnlineプラグインを使用。 #UE4
色々できるので遊んでみてください。
辛い目にあったお話
これ以降は今回の記事に至るまでに迷子になった余談なので、気が向いたら読んで下さい。
きっかけはこの辺
ぬああああ!やっとできたww簡単すぎるところで躓きすぎ( ;∀;)ww
— gsk (@gsk39) 2016年10月20日
ヒストリアさんブログみたら一発だったありがとうでした( ;∀;)ww pic.twitter.com/pRW1ecCu39
こんなのあるんだ と思って調べてみたら Pocketsphinxってのがベースらしく
pocketsphinx 多分日本語に対応していないのでsphinxプラグインつらそう
— てんちょー (@shop_0761) 2016年10月20日
と、以外にも日本語の音声認識プラグインが無いことを知りました。
しばらく経って、先程のwin10で動く音声認識のサンプルがあるのを知ったので、これUDP通信で実装するできそうと思ってました。
よく聞くJuliusとかでプラグインでも作ったほうがよさそうかなと思いましたが、あれはデフォのままだとかなりアレな感じなのでガツガツやるにはいいのかもしれません…(DNNベースでもHMMベースでもできます)
じゃあさっそくH社のUDPのサンプルを読みつつ進めていくと、デシリアライズの方法で引っかかりました。
UDP Socket Sender Receiver From One UE4 Instance To Another - Epic Wiki
こことか見てたんですが、日本語stringの場合文字コード周りで死にたくなりましたね…。C++から文字コードを日本語にする方法が見当たらなかったので、 お友達に聞くとpythonをかますか、http通信にしたほうがいいよと言われたので、今回の方法に落ち着きました。
文字コード周りで辛い目に遭っている
— てんちょー (@shop_0761) 2016年11月13日
UnrealC++を読む機会が出来たので、副産物的に前よりは抵抗感がなくなりまし た。
ほげたつさんのコードを読んでUnrealC++を覚えていこうな
— てんちょー (@shop_0761) 2016年11月18日
まとめ
そろそろデフォで音声認識ができてもいいんじゃないかなとは思います。
ただVR_keyboardで日本語の変換周りを扱っていると日本語難しいなと思ったので、当分ないだろうなと思ってしまいました。
明日はprince_ue4さんの「エフェクトネタやります」です。