凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Oculus Rift をかぶって VR の世界でおしゃべりしてきた

はじめに

本エントリは Oculus Rift Advent Calendar 2013の第1日目の記事になります。いよいよ始まりました!通常の Advent Calendar 同様 25 日だと少ない気がしたので 31 日に枠を拡大しましたが、無事開催前に満員御礼となりました。皆様、これから 1 ヶ月間よろしくお願いいたします!

概要

現在、「VR の世界のキャラクターと会話をする」ということを実現しようと色々と試みています。その経緯等については以前の記事(フォルマントから母音推定してリップシンクを目指してみる - 凹みTips)で大方語ってしまったので、そちらに譲るとしますが、ここで述べていたようなことを実現するために、MMD4Mecanim を適用したモデルにアタッチすることで以下の機能を実現するプラグインを作成しました:

そしてこれを利用して、音声認識した結果から会話を自動生成し、それをリップシンクさせながら喋ってもらう、というものを Oculus Rift を被って VR の世界で体験出来るものを作成してみました。

デモ

会話がうまく行かず、何回か撮り直しました。なかなかうまくいかないものですね。。

解説

MMD4Mecanim LipSync Plugin では以下のものを利用しています。

これを利用して、以下の様な構成で音声認識した結果から会話を自動生成、そして音声合成して喋ってもらうものを作成してみました。

1. まず音声認識をして喋った言葉を文字にします。音声認識には ChromeWeb Speech API を利用しています。

WebSocket 経由で結果を貰い続けるという、Google さんに対してちょっとお行儀の悪い使い方をしています。。次回解説記事を書きます。

2. 次に、この結果を SimSimi へ投げて、会話を自動生成します。

SimSimi は「理想の彼氏」でも話題になった人口知能(人工無能)プログラムで、文章を与えると返答をしてくれる API を提供してくれています。会話の内容はちょっとアレですが、とても面白い API です。

3. この結果を Unity へ WebSocket を投げて教えてあげます。WebSocket のやりとりでは、Node.js 側では ws、Unity 側では websocket-sharp を利用しています。

4. そして、Unity では System.Process.Diagnostics.StartStreaming Assets 内に配置した音声合成ソフトの OpenJTalk を呼び出して文章を喋る wav ファイルを作成します。Streaming Assets に置く所が鍵なのですが、これも別記事にまとめます。

5. 最後にこれを AudioClip で読み込み、ここから得られる音声波形データを前回 C++ で書いたフォルマントによる母音解析を C# に移植したもので解析し、同期等をうまくやりながらキャラクターの口を動かしています。これには MMD4Mecanim 付属の MMD4MecanimMorphHelper を利用して操作しています。スゴイ便利です、Nora さんありがとうございます。

ちなみに、以前やったように OpenJTalk 部分をサーバに持ってくれば、シングルカメラなら Unity Web Player でも出来る気がしますので、それは追々。

先行技術

Speech Helper

MMD4Mecanim には MMD4MecanimSpeechHelper という VOICEROID と連携してリップシンクを行ってくれるスクリプトが付属しています。

こちらは、ファイル名で与えられた平仮名のテキストを調べてモーフをさせるというものです。予め喋らせる言葉が決まっていてファイル名に落とし込める場合は、私のものよりも確実にリップシンクしてくれると思います。今回のリップシンクプラグインでは、SpeechHelper では対応できない喋る速度が一定速度でない音声や歌、マイクからの入力に対応させたく思い作成しました。

MMDAgent

ぶっちゃけてしまうと、今回の内容は名古屋工業大学の MMDAgent でほぼ実現されています。

唯一できていないのは、対応が簡単な VR 化くらいですね。。理論部分は分からないですが、体験的にはこれくらいを目指して頑張りたいです。

やりたかったけど出来なかったこと

精度

精度は正直それほど良いとはいえません。現状、声に合わせてキャリブレが必要ですし、分析のパラメータに大きく依存する形になってしまっています。本当は機械学習とかも入れたいところだったのですが、今回は時間切れでした。

表情

感情分析をして表情を変える、ということをやりたかったのですが、感情分析をしてくれる良い API がなく、単語感情極性対応表 を利用して自前で作っても見たのですが、あまり精度が出なく諦めました。文章のネガポジ判定をしてくれるためのデータを作成する良いロジックを思いつけばもう一度チャレンジしたいです。

コード

後日、解説記事は書きますが、現状の MMD4Mecanim LipSync Plugin は以下に上がっています:

Win / Mac 両対応で作っているつもりなので動くと思いますが、動かない場合はご連絡下さい。

おわりに・今後の展望

今回取り組めなかった表情変化の部分の実装や、視線制御、自動生成による多彩なモーションなどが加われば、より人間らしさが増すと思います。また完全にバーチャルのキャラクターでなくとも、遠隔の人とアバターを通じて VR 内で会話する、というものを作ってみると、バーチャル上のキャラクターにどういうイメージを抱くのかとか興味あります。表情も(Oculus Rift で顔が覆われてしまっていて画像解析できないので)筋電とかでとってアバター側に反映する、とか出来ると面白そうです。と、単純に思いつくだけでもネタはかなりたくさんありそうなので、今後も色々とやっていきたいと思います。

次回

次回は、@yasei_no_otoko さんです!よろしくお願いします。