【えもふり】Unityで静的なリップシンクをおこなう

はいどーもこんにちは正真正銘のニートです。
本日は「えもふり」で静的なリップシンクをおこなうスクリプトを紹介しようと思いますよ。

付属のリップシンク用スクリプトの問題点

前回の記事でも書きましたが、公式に付属しているリップシンク機能のスクリプトは「リアルタイムに音声の解析をしているため、環境によってはCPU負荷が問題になる可能性」があるようです。
そこで今回は解析済みのデータをつかい、静的なリップシンクをおこなおうというわけですね。

とりあえず作ってみた

ちゅーわけで作ってみたので、Gistsからダウンロード(あるいはコピペ貼り付けでも)してください。
https://gist.github.com/Tsumio/e198e7dfe1c9cbdfc32e4d929a356007

使い方

えもふりのオブジェクトを設置したあと(ここがよくわからんという人は僕の記事を読んだり、公式のマニュアルを参照してください。えもふりのSDKは必須です)、適当なオブジェクトにTsumioLipSynchControllerスクリプトをアタッチします。
ついでにAudioSourceを持つオブジェクトも用意してください(やり方は前回の記事に書いてます)。
その後、インスペクタをこんな風に設定します。

具体的には以下の通りです。

1.Sourcesのsizeに対象(普通はキャラクラター)のAudioSourceから流される可能性があるだけの音声の数を設定
2.EmotePlayerに対象のえもふりオブジェクトを設定
3.AudioClipに流したい音声を設定
4.CsvSourceに解析済みのcsvファイルを設定(詳細は前回の記事を参照)
5.これら(2~3)を全ての要素に対して繰り返す

これで準備は完了です。
次は実際の再生ですね。
今回はボタンをタップで再生できることとします。

1.uGUIのボタンを作成
2.OnClickイベントにTsumioLipSynchControllerスクリプトを貼り付けたオブジェクトを設定
3.TsumioLipSynchControllerスクリプトのStartVoiceActionメソッドを設定
4.再生するときに使用するCSVファイル名(インスペクタで設定したもの。例えばsample_voice_003.vol)を設定
5.ゲームを実行して再生されるかどうかを試す

これでリップシンクされて音声が再生されればOKです。

その他の使い方

簡単な使い方は以上です。
TsumioLipSynchControllerには他に「登録された音声からランダムに一つ再生するメソッド」や「終了時のface_talkの値を設定できるStartVoiceActionメソッド」があります。
コメントも色々と書いているので、詳細はコードを見てもらえればなと思います。

TsumioLipSynchControllerの問題点

静的なリップシンクをおこなう場合、公式の説明によれば「音声再生時に Time.deltaTime の進行に合わせて EmotePlayer.setVariable() 関数で の E-moteキャラの face_talk 変数に値を設定する」とのことでした。
ですが意味がよくわからなかったので、僕は「Update関数内で毎フレームリップシンクのモーションを更新させる」という方法を取りました。
確かにこれだとリップシンクの同期が微妙にずれる場合があるようだったのですが(公式付属のリップシンク用スクリプトで実行した場合と比べてみてください)、個人的には許容範囲内だったのでひとまずこれでいいかなーと思いました。

追記:この問題を修正しました。恐らくこれで綺麗に動いてくれるはずですが、あんまり試してないのでダメそうなら教えてください。デフォルトでは60FPSで出力した場合を想定しています。

おわりに

いかがでしたでしょーか。
何か参考になれば幸いです。
ニートで貯金が日々減っているので、週休4日あるお仕事も募集しています。
TwitterでDMください。

ほなまた。

最後にこのページにもコードをペタリ。

フォローする