はじめに
本エントリは Oculus Rift Advent Calendar 2013の第1日目の記事になります。いよいよ始まりました!通常の Advent Calendar 同様 25 日だと少ない気がしたので 31 日に枠を拡大しましたが、無事開催前に満員御礼となりました。皆様、これから 1 ヶ月間よろしくお願いいたします!
概要
現在、「VR の世界のキャラクターと会話をする」ということを実現しようと色々と試みています。その経緯等については以前の記事(フォルマントから母音推定してリップシンクを目指してみる - 凹みTips)で大方語ってしまったので、そちらに譲るとしますが、ここで述べていたようなことを実現するために、MMD4Mecanim を適用したモデルにアタッチすることで以下の機能を実現するプラグインを作成しました:
そしてこれを利用して、音声認識した結果から会話を自動生成し、それをリップシンクさせながら喋ってもらう、というものを Oculus Rift を被って VR の世界で体験出来るものを作成してみました。
デモ
会話がうまく行かず、何回か撮り直しました。なかなかうまくいかないものですね。。
解説
MMD4Mecanim LipSync Plugin では以下のものを利用しています。
- OpenJTalk
- Open JTalk
- 音声合成に利用
- Mei (Voice Data Only)
- nkf
これを利用して、以下の様な構成で音声認識した結果から会話を自動生成、そして音声合成して喋ってもらうものを作成してみました。
1. まず音声認識をして喋った言葉を文字にします。音声認識には Chrome の Web Speech API を利用しています。
WebSocket 経由で結果を貰い続けるという、Google さんに対してちょっとお行儀の悪い使い方をしています。。次回解説記事を書きます。
2. 次に、この結果を SimSimi へ投げて、会話を自動生成します。
SimSimi は「理想の彼氏」でも話題になった人口知能(人工無能)プログラムで、文章を与えると返答をしてくれる API を提供してくれています。会話の内容はちょっとアレですが、とても面白い API です。
3. この結果を Unity へ WebSocket を投げて教えてあげます。WebSocket のやりとりでは、Node.js 側では ws、Unity 側では websocket-sharp を利用しています。
- GitHub - websockets/ws: Simple to use, blazing fast and thoroughly tested WebSocket client and server for Node.js
- GitHub - sta/websocket-sharp: A C# implementation of the WebSocket protocol client and server
4. そして、Unity では System.Process.Diagnostics.Start で Streaming Assets 内に配置した音声合成ソフトの OpenJTalk を呼び出して文章を喋る wav ファイルを作成します。Streaming Assets に置く所が鍵なのですが、これも別記事にまとめます。
5. 最後にこれを AudioClip で読み込み、ここから得られる音声波形データを前回 C++ で書いたフォルマントによる母音解析を C# に移植したもので解析し、同期等をうまくやりながらキャラクターの口を動かしています。これには MMD4Mecanim 付属の MMD4MecanimMorphHelper を利用して操作しています。スゴイ便利です、Nora さんありがとうございます。
ちなみに、以前やったように OpenJTalk 部分をサーバに持ってくれば、シングルカメラなら Unity Web Player でも出来る気がしますので、それは追々。
先行技術
Speech Helper
MMD4Mecanim には MMD4MecanimSpeechHelper という VOICEROID と連携してリップシンクを行ってくれるスクリプトが付属しています。
こちらは、ファイル名で与えられた平仮名のテキストを調べてモーフをさせるというものです。予め喋らせる言葉が決まっていてファイル名に落とし込める場合は、私のものよりも確実にリップシンクしてくれると思います。今回のリップシンクプラグインでは、SpeechHelper では対応できない喋る速度が一定速度でない音声や歌、マイクからの入力に対応させたく思い作成しました。
やりたかったけど出来なかったこと
精度
精度は正直それほど良いとはいえません。現状、声に合わせてキャリブレが必要ですし、分析のパラメータに大きく依存する形になってしまっています。本当は機械学習とかも入れたいところだったのですが、今回は時間切れでした。
コード
後日、解説記事は書きますが、現状の MMD4Mecanim LipSync Plugin は以下に上がっています:
Win / Mac 両対応で作っているつもりなので動くと思いますが、動かない場合はご連絡下さい。
おわりに・今後の展望
今回取り組めなかった表情変化の部分の実装や、視線制御、自動生成による多彩なモーションなどが加われば、より人間らしさが増すと思います。また完全にバーチャルのキャラクターでなくとも、遠隔の人とアバターを通じて VR 内で会話する、というものを作ってみると、バーチャル上のキャラクターにどういうイメージを抱くのかとか興味あります。表情も(Oculus Rift で顔が覆われてしまっていて画像解析できないので)筋電とかでとってアバター側に反映する、とか出来ると面白そうです。と、単純に思いつくだけでもネタはかなりたくさんありそうなので、今後も色々とやっていきたいと思います。
次回
次回は、@yasei_no_otoko さんです!よろしくお願いします。