ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

Oculus社のリップシンクライブラリ「Oculus LipSync ( OVRLipSync )」をUE4で使う方法について その2 (Grayちゃんでリップシンク!編)

はじめに

この記事はこちらの記事の続きです
pafuhana1213.hatenablog.com

前回はOVRLipSyncのサンプルについて解説しました。しかし、サンプルに含まれるモデルはOVRLipSyncの仕様に超特化したものなので、そのまま他モデルに適用することはできません。
そこで、他モデルでOVRLipSyncを使うにはどうすればいいのかについて解説します。なお、今回の解説では皆大好きなGrayちゃんのモデル・ボイスをお借りしています。
3Dモデル:Grayちゃんモデルデータ – rarilog
ボイス:Grayちゃんボイスが、より扱いやすくなりました - Grayちゃん OFFICIAL WEBSITE


OVRLipSyncプラグインの導入

まずは公式サンプルプロジェクト( OVRLipSyncDemo )に含まれるOVRLipSyncプラグインを別プロジェクトで移植します。今回はGrayちゃんの3Dモデルに含まれるGrayChanProjectに移植します。

1. OVRLipSyncプラグインをコピペ

OVRLipSyncDemoにある Pluginsフォルダ を GrayChanProjectのルートフォルダ(GrayChanProject.uprojectがあるフォルダ)にコピペします

2. マイクを使うために設定追加

GrayChanProjectのConfigフォルダにある DefaultEngine.ini に 以下の文字列を追加します。これでマイクが使用可能になります。なお、事前に録音した音声しか使わない場合はこの設定追加は不要です。

[Voice]
bEnabled=True

[OnlineSubsystem]
bHasVoiceEnabled=False

3. OVRLipSyncプラグインが有効になっているか確認

GrayChanProjectを開き、PluginsからOVRLipSyncプラグインが有効になっているか確認します。
f:id:pafuhana1213:20181126001832p:plain

なお、OVRLipSyncプラグインは "EnabledByDefault" : true なのでデフォルトで有効になっているはずです。ですので、この確認はあくまで念の為だったりします。
( 気になる方は、OVRLipSync.uplugin をテキストエディタで開いてみましょう! )

Grayちゃんボイスで口パクしてみる

今回はマイク音声ではなく、事前に収録された音声であるGrayちゃんボイスを使ってみます。マイクを使用する場合でもBPによる実装内容は殆ど変わりないからです。準備周りはサンプルからコピペしましょう!

音声データのインポート・変換

まずは使用する音声データをUE4にインポートし、右クリックメニューからOVRLipSync Frame Sequenceを生成します。(詳細は前回の記事で)
f:id:pafuhana1213:20181126002349p:plain

必要なコンポーネントの追加・セットアップ

次に、ThirdPersonCharacterにOVRLipSyncPlaybackActorコンポーネントとAudioコンポーネントを追加します。
f:id:pafuhana1213:20181126002526p:plain

そして、OVRLipSyncPlaybackActorコンポーネントには先程作成したOVRLipSync Frame Sequenceを指定します。
f:id:pafuhana1213:20181126002853p:plain
また、Audioコンポーネントにはインポートした音声データ(SoundWave)を指定し、さらに勝手に自動再生されないように Auto ActivateをOFFにしておきます。
f:id:pafuhana1213:20181126002920p:plain

口パク(モーフターゲット)制御の実装

最後に、OVRLipSyncが解析した口パクをGrayちゃんモデルに渡す処理をBPで実装します。

まずは、ボイスとOVRLipSyncによる解析を開始する処理を書きます。今回は簡単に 1キー を押したら処理を開始するようにします。
f:id:pafuhana1213:20181126004946p:plain

次に、OVRLipSyncによる解析結果が更新される On Visemes Ready イベントにてGrayちゃんのモーフターゲットを制御する処理を実行します。

前回の記事で紹介した通り、OVRLipSyncはVisemsという音声解析を元にした口の形状パラメータの配列を返してくれます。
公式ドキュメント:Viseme Reference

そして、今回使用するGrayちゃんモデルには母音( a, i, u, e, o )用のモーフターゲットが用意されています。
f:id:pafuhana1213:20181126003856p:plain

ですので、Visemsの10番目から15番目のパラメータを各Visemに対応するモーフターゲットに渡す形になります。ちなみに、パラメータの順番はこんな感じ。
f:id:pafuhana1213:20181126004431p:plain

上記のように配列から一つずつ値を取得する感じで実装しても良いのですが、せっかくなのでシンプルに実装してみました!
f:id:pafuhana1213:20181126011400p:plain
コピペ用: https://blueprintue.com/blueprint/p-z2c6ys/

これで準備完了です。実行して 1キー を押すと 「はじめに」で載せた動画のように音声に合わせて口パクします!

最後に

これでサンプル以外のモデルでもOVRLipSyncを用いた口パクができるようになりました。しかし、改良の余地はまだまだまだまだあります。例えば、口をもっと大きく開くように補正処理をかけたり…
f:id:pafuhana1213:20181126010038p:plain

アニメ的な表現を再現するために更新間隔を調整したりなどなど…色々あります!(ググると色々…モニョモニョ…)
是非色々カスタムしてみてください!

補足

シーケンスレコーダーによるベイク処理を使って、OVRLipSyncによる口パクをアニメーションアセット化したい方がそれなりにいるかと思います。

www.slideshare.net
(シーケンスレコーダーについては、126ページ以降)

しかし、Set Morph Targetでモーフターゲットを制御する場合はベイク処理の対象外になります。そのため、ベイク処理の対象にするためには、Animation BPのAnim Graphにて Modify Curveノードを使って各モーフターゲットの値を制御する必要があります。ご注意下さいまし。
f:id:pafuhana1213:20181126011012p:plain

おわり