てんちょーの技術日誌

自分がつまづいたこととかメモ

【UE4】簡単な音声認識をしてみた

はじめに

Unreal Engine 4 (UE4) Advent Calendar 2016 10日目です。

qiita.com

本記事の主役とも言えるほげたつさんのアセットのレビューがされている こちらの記事も合わせてお読みください(何ももらってませんよ)

pafuhana1213.hatenablog.com

今回はちょーお手軽に音声認識をしてみようと思います。

というのもmikulusを見てるとUnityは標準で音声認識が出来たり、プラグインを探すと大体英語対応のものばかりで辛い目に遭いました。

なので作りました。

現在作成中のVR内で使えるキーボードに音声認識で入力アシストするのに使っています。

イメージ

こちらテスターを募集しているのでOculusTouchがある方はぜひお願いします。@shop_0761にご連絡ください。(圧倒的テスター不足)

方針

色々遠回りしたお話は、あとに書くとして端的に実装方針を説明します。

http通信を用いて実装します。

しかもこれ、ほげたつさんがすでにプラグインを作成して公開しています!!

hogetatu.hatenablog.com

つよい。

ちなみに

らしいので先日のこちらの記事を参照してゆくゆくは移行しましょう。

hogetatu.hatenablog.com

http通信については適当にググるか、頭を空っぽにしてそういうものがあるんだなくらいでも動きます。

で、音声認識側のツールはC#で適当に作れます。

参考サイトを貼っておくので自作しても構いません。先人は偉大!

参考:

neareal.com

www.misuzilla.org

面倒な方は僕がすでに作成したものでも使ってください。実行するだけです。おわり。

www.dropbox.com

ダウンロードするだけで環境が整ってしまいました。

音声認識の精度について

精度的なお話だと、

コマンドプロンプトで UWP の音声認識APIを利用するサンプル。NuGet で UWPDesktop を追加してください。https://blogs.msdn.microsoft.com/lucian/2015/10/23/how-to-call-uwp-apis-from-a-desktop-vbc-app/ · GitHub

こちらのほうがいいかもしれません。ただなぜか手元の環境だと、

await contSpeechRecognizer.ContinuousRecognitionSession.StartAsync();

のところで The speech privacy policy was not accepted prior to attempting a speech recognition. と言われてしまい実行できず…

音声認識のプライバシーポリシーってどこで設定するんだ…となってしまったので詳しい方がいればぜひお教えいただけると嬉しいです。

このように認識は外部のツール依存なので、自作してチューニングすればよりよいものになるかと思います。

実装する

と言っても、大したことはしません。

先程のほげたつさんのプラグインにはサンプルプロジェクトWebApiDemoがあるので、それを起動します。

その中にあるWebApiDemo/WebApi/Api 内にあるBP_DemoApiBaseを開きましょう。

f:id:shop_0761:20161202234346p:plain

そして、継承元の変数を表示するために赤線のところにチェックを入れます。

すると

f:id:shop_0761:20161202234427p:plain

Domain変数が見えます。

今回はアプリのポートの都合上ここを http://127.0.0.1:50001/ に書き換えます。

f:id:shop_0761:20161202234559p:plain

あとは、さっきの音声認識のツールを実行後にUE4側で実行しましょう。

SimpleGetを押せば終了!!

f:id:shop_0761:20161202235109p:plain

音声認識の結果が得られます。

ちなみにこのStringはBP_01_SimpleGet内のResponsebodyに入ってるので後はご自由に。

f:id:shop_0761:20161202235534p:plain

VRKeyboardの方ではTickで適当にポーリングするBPComponentにしてます。

応用例

普通に音声認識してそのまま使ってもいいのですが、ちょっとあちこち手を加えてこんなことをしてみました。

音声認識した結果を使ってLipSync的なことをしています。これをLipSyncさせても面白いかもですね。

色々できるので遊んでみてください。

辛い目にあったお話

これ以降は今回の記事に至るまでに迷子になった余談なので、気が向いたら読んで下さい。

きっかけはこの辺

こんなのあるんだ と思って調べてみたら Pocketsphinxってのがベースらしく

と、以外にも日本語の音声認識プラグインが無いことを知りました。

しばらく経って、先程のwin10で動く音声認識のサンプルがあるのを知ったので、これUDP通信で実装するできそうと思ってました。

よく聞くJuliusとかでプラグインでも作ったほうがよさそうかなと思いましたが、あれはデフォのままだとかなりアレな感じなのでガツガツやるにはいいのかもしれません…(DNNベースでもHMMベースでもできます)

じゃあさっそくH社のUDPのサンプルを読みつつ進めていくと、デシリアライズの方法で引っかかりました。

UDP Socket Sender Receiver From One UE4 Instance To Another - Epic Wiki

こことか見てたんですが、日本語stringの場合文字コード周りで死にたくなりましたね…。C++から文字コードを日本語にする方法が見当たらなかったので、 お友達に聞くとpythonをかますか、http通信にしたほうがいいよと言われたので、今回の方法に落ち着きました。

UnrealC++を読む機会が出来たので、副産物的に前よりは抵抗感がなくなりまし た。

まとめ

そろそろデフォで音声認識ができてもいいんじゃないかなとは思います。

ただVR_keyboardで日本語の変換周りを扱っていると日本語難しいなと思ったので、当分ないだろうなと思ってしまいました。

明日はprince_ue4さんの「エフェクトネタやります」です。