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でのマイク録音３種盛り：レイテンシ比較](https://qiita.com/TyounanMOTI/items/5306336823316b0b289c)
・ [【Unite Tokyo 2018】AniCast！東雲めぐちゃんの魔法ができるまで](https://www.youtube.com/watch?v=1rfoFg6LJgU)


#実装方法

0. OVRLipSyncが動いているプロジェクトを用意
1. AniLipSync.unitypackageをインポート
2. AniLipSyncプレファブをシーンに配置
3. OVRLipSyncのスクリプトを無効化
4. AniLipSyncプレファブの`AnimMorphTarget`と`OVRLipSyncContextMorphTarget`を入れ替える

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

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

![LipSync.PNG](https://qiita-image-store.s3.amazonaws.com/0/140271/d2aa89f7-c778-301f-0317-29997cf976b4.png)

![ovrbase.PNG](https://qiita-image-store.s3.amazonaws.com/0/140271/d1dc09c8-b481-8ae0-a26f-1525f2009398.png)


##2. AniLipSync.unitypackageをインポート。
以下よりAniLipSync.unitypackageをダウンロードできます。
- [XVI/AniLipSync](https://github.com/XVI/AniLipSync/releases)

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](https://qiita-image-store.s3.amazonaws.com/0/140271/6c3a7e05-d4de-d497-88a8-ab2c60f3f022.png)

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

1. AniLipSyncの`AnimMorphTarget`コンポーネントを無効化する。
2. AniLipSyncに`OVRLipSyncContextMorphTarget`をアタッチする。
3. これまで通り`OVRLipSyncContextMorphTarget`の各パラメータを設定して完成。(特に`Skinned Mesh Rendere`と`Viseme To Blend Tagets`の設定は忘れないように)

![lastset.PNG](https://qiita-image-store.s3.amazonaws.com/0/140271/7bb23599-35cd-57bc-13c7-aa8301dfe7e3.png)

##遅延と音声の合わせ方(配信)
配信ソフトの設定で**250ms音声を遅延させる**ようにすると大体丁度良くなります。
OBSを使っている場合は、左上の**編集>オーディオの詳細プロパティ**と選択し、そこからマイクの同期オフセットに入力するとできます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3134303237312f64383234386632342d363238322d393637652d616637622d3834643365363230616639622e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/140271/a2bc65da-ffe3-1c08-96a8-5268fd19b8d4.png)
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3134303237312f34356664653761312d373863352d653562382d313633392d3963643562366330346561372e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/140271/3d0fde80-8528-ca7f-2029-67592748c99b.png)




#参考

- [レイテンシの軽減とリミテッドアニメーションを実現するAniLipSyncを使ってみる](https://qiita.com/kaikiofkaiki/items/f15b31167bbf97c730a0)
- [Unity でリップシンクができる OVRLipSync を試してみた](http://tips.hecomi.com/entry/2016/02/16/202634)
- [XVI AniLipSync](https://github.com/XVI/AniLipSync)
- [Unityでのマイク録音３種盛り：レイテンシ比較](https://qiita.com/TyounanMOTI/items/5306336823316b0b289c)
- [【Unite Tokyo 2018】AniCast！東雲めぐちゃんの魔法ができるまで](https://www.youtube.com/watch?v=1rfoFg6LJgU)