#はじめに
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!東雲めぐちゃんの魔法ができるまで
#実装方法
- OVRLipSyncが動いているプロジェクトを用意
- AniLipSync.unitypackageをインポート
- AniLipSyncプレファブをシーンに配置
- OVRLipSyncのスクリプトを無効化
- AniLipSyncプレファブの
AnimMorphTarget
とOVRLipSyncContextMorphTarget
を入れ替える
複雑そうに見えますが、やることはOVRLipSyncを無効化し(OVRlipSync
コンポーネントは残す)、AniLipSyncプレファブを置いてAnimMorphTarget
とOVRLipSyncContextMorphTarget
を入れ替えるだけです。
##1. OVRLipSyncが動いているプロジェクトを用意
前提として、OVRLipSyncが動いているプロジェクトがあるとします。状態としては以下の画像のようにOVRLipSync
コンポーネントがアタッチされたオブジェクト、OVRLipSyncContextMorphTarget.cs
、OVRLipSyncContext.cs
、OVRLipSyncMicInput.cs
の3つのコンポーネントがアタッチされたオブジェクトが存在しているとします。
##2. AniLipSync.unitypackageをインポート。
以下よりAniLipSync.unitypackageをダウンロードできます。
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
##5. AniLipSyncプレファブのAnimMorphTarget
とOVRLipSyncContextMorphTarget
を入れ替える
AnimMorphTarget
は、AniLipSyncに含まれるスクリプトで、リミテッドアニメーションを再現した上でリップシンクを行います。こちらのコンポーネントを無効化し、OVRLipSyncのOVRLipSyncContextMorphTarget
を設定します。
- AniLipSyncの
AnimMorphTarget
コンポーネントを無効化する。 - AniLipSyncに
OVRLipSyncContextMorphTarget
をアタッチする。 - これまで通り
OVRLipSyncContextMorphTarget
の各パラメータを設定して完成。(特にSkinned Mesh Rendere
とViseme To Blend Tagets
の設定は忘れないように)
##遅延と音声の合わせ方(配信)
配信ソフトの設定で250ms音声を遅延させるようにすると大体丁度良くなります。
OBSを使っている場合は、左上の編集>オーディオの詳細プロパティと選択し、そこからマイクの同期オフセットに入力するとできます。
#参考