Edited at

AniLipSyncを用いてOVRLipSyncの遅延(レイテンシ)を軽減する


はじめに

OVRLipSyncは約60ms~200msほどの遅延(レイテンシ)が存在します。AniLipSyncを用いて、OVRLipSyncのモーフ変更はそのまま使いつつ、その遅延だけを軽減する方法について書いていきます。今回の処理を行うことで、遅延は約40msとなり、約150msほどの遅延を軽減します。

なお、OVRLipSyncの使い方に関しては解説しません。既にOVRLipSyncが実装できているプロジェクトを前提として進めていきます。


動作環境


  • Windows 10 Version 1709 Build 16299.431

  • OVRLipSync Version 1.25.0

  • AniLipSync Ver.1.0.0

  • Unity2017.1.2f1

  • UnityChan_1_2_1

※AniLipSyncはOVRLipSyncのバージョンに依存しています。対応したバージョンを選択しましょう。


ざっくりとした説明

OVRLipSyncの音声取得の方法を変えます。OVRLipSyncではMicrophone.Start()OnAudioFilterRead()の組み合わせによって音声を取得しています。それをAniLipSyncを使ってMicrophone.Start()AudioClip.GetData()の組み合わせによって音声を取得するように変えます。

また、AniLipSyncにはリミテッドアニメーションを再現できる機能がありますが、今回はそれを使いません。モーフの変更はこれまで通りOVRLipSyncのものを使い、遅延(レイテンシ)だけ軽減させます。

音声取得のより詳しい解説は以下が非常に参考になります

Unityでのマイク録音3種盛り:レイテンシ比較

【Unite Tokyo 2018】AniCast!東雲めぐちゃんの魔法ができるまで


実装方法


  1. OVRLipSyncが動いているプロジェクトを用意

  2. AniLipSync.unitypackageをインポート

  3. AniLipSyncプレファブをシーンに配置

  4. OVRLipSyncのスクリプトを無効化

  5. AniLipSyncプレファブのAnimMorphTargetOVRLipSyncContextMorphTargetを入れ替える

複雑そうに見えますが、やることはOVRLipSyncを無効化し(OVRlipSyncコンポーネントは残す)、AniLipSyncプレファブを置いてAnimMorphTargetOVRLipSyncContextMorphTargetを入れ替えるだけです。


1. OVRLipSyncが動いているプロジェクトを用意

前提として、OVRLipSyncが動いているプロジェクトがあるとします。状態としては以下の画像のようにOVRLipSyncコンポーネントがアタッチされたオブジェクト、OVRLipSyncContextMorphTarget.csOVRLipSyncContext.csOVRLipSyncMicInput.csの3つのコンポーネントがアタッチされたオブジェクトが存在しているとします。

LipSync.PNG

ovrbase.PNG


2. AniLipSync.unitypackageをインポート。

以下よりAniLipSync.unitypackageをダウンロードできます。

- XVI/AniLipSync

DLができたらOVRLipSyncが実装されているプロジェクトにAniLipSync.unitypackageをUnityにインポートします。このAniLipSync.unitypackageをインポートすれば、AniLipSyncのスクリプトやプレファブなど必要なものを一括でインポートできます。なお、OVRLipSyncに関するファイルは含まれていないので注意してください。


3. AniLipSyncプレファブをシーンに配置

Asesets/AniLipSync/PrefabsにAniLipSycプレファブがあります。それをシーンに配置しましょう。


4. OVRLipSyncのスクリプトを無効化

AniLipSyncとOVRlipSyncで機能が被っているスクリプトや、競合するスクリプトがあります。音声入力と音声の受け渡し関連だけAniLipSyncを使い、モーフの変更部分だけOVRLipSyncを使いたいので関係のないコンポーネントを無効化していきます。

以下の3つのコンポーネントを無効化します(画像ではチェックを外してるだけですが、コンポーネントそのものをRemoveしてしまって大丈夫です)。

・ OVRLipSyncContextMorphTarget

・ OVRLipSyncContext

・ OVRLipSyncMicInput

talk.PNG


5. AniLipSyncプレファブのAnimMorphTargetOVRLipSyncContextMorphTargetを入れ替える

AnimMorphTargetは、AniLipSyncに含まれるスクリプトで、リミテッドアニメーションを再現した上でリップシンクを行います。こちらのコンポーネントを無効化し、OVRLipSyncのOVRLipSyncContextMorphTargetを設定します。


  1. AniLipSyncのAnimMorphTargetコンポーネントを無効化する。

  2. AniLipSyncにOVRLipSyncContextMorphTargetをアタッチする。

  3. これまで通りOVRLipSyncContextMorphTargetの各パラメータを設定して完成。(特にSkinned Mesh RendereViseme To Blend Tagetsの設定は忘れないように)

lastset.PNG


遅延と音声の合わせ方(配信)

配信ソフトの設定で250ms音声を遅延させるようにすると大体丁度良くなります。

OBSを使っている場合は、左上の編集>オーディオの詳細プロパティと選択し、そこからマイクの同期オフセットに入力するとできます。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3134303237312f64383234386632342d363238322d393637652d616637622d3834643365363230616639622e706e67.png

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3134303237312f34356664653761312d373863352d653562382d313633392d3963643562366330346561372e706e67.png


参考