Unityで口パクアニメーションを録画する方法

# Unityで口パクアニメーションを録画する方法：VRChatのアバター用

## 背景
VRChatのアバターを作る最中、アバターが再生する曲に合わせて口パクを同期させたいと思いました。しかし、自分のマイクで曲を再生してモデルの口を動かすのは避けたかったので、この試みを行いました。これはVRChatのモデルを作るためのものですが、一般的なUnityの映像制作でも役立つと思います。そのため、この記事を書くことにしました。

## 必要なツール
- Oculus Lip Sync：これはOculusが提供するリップシンク（口パク）のためのツールです。音声データから口の形を生成することができます。[ダウンロードリンク](https://developer.oculus.com/documentation/unity/audio-ovrlipsync-unity/?locale=ja_JP)
- Unity-Runtime-Animation-Recorder：これはUnityで実行時にアニメーションを録画するためのツールです。これにより、ゲームの実行中にキャラクターの動きを録画し、それをアニメーションクリップとして保存することができます。[ダウンロードリンク](https://github.com/newyellow/Unity-Runtime-Animation-Recorder)

## 手順

1. Oculus Lip SyncとUnity-Runtime-Animation-Recorderをダウンロードし、Unity内導入します。

2. `.\Assets\Oculus\LipSync\Scenes\LipSync_Demo.unity`シーンを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/542b3c8a-2d18-02bc-a69e-bd09740343b2.png)

3. シーン内の`LipSyncTargets\InputType_Microphone`オブジェクトの`InputType_Microphone`コンポーネントを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/3b10b19e-f3ed-b216-3a80-bf3b57dc3832.png)

4. 歌を口パクするため、`OVR Lip Sync Mic Input (Script)`のチェックを外し、同じオブジェクトの`Audio Source`コンポーネントの`AudioClip`を録画したい音楽に置き換えます。なお、口パクアニメーションの音源として曲自体を使用する場合、伴奏が口パクアニメーションに干渉する可能性があります。そのため、RVCなどのAIツールを使用して人声と伴奏を分離することをお勧めします。具体的な操作方法はここでは省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/cba6c5c7-a257-8840-5952-c55296eab100.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/7a170409-72cb-7f59-ab96-89912a07189d.png)

5. `OVR Lip Sync Context Morph Target (Script)`の`Skinned Mesh Renderer`を口パクを録画したいモデルのメッシュに置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/0b6b3aac-244a-269d-b4e8-cd6ef1ae29af.png)

6. `Viseme To Blend Target`の数字を自分のモデルメッシュの数字に置き換えます。Oculus LipSyncが認識できる15種類のVisemeは以下の順序に従います：

    - sil
    - PP
    - FF
    - TH
    - DD
    - kk
    - CH
    - SS
    - nn
    - RR
    - aa
    - E
    - ih
    - oh
    - ou

7. 対応する数字をBlenderShapesのnormalメニューに順次入力します。具体的には、blendshapesを持つメッシュのinspectorをロックし、2つのinspectorタブを開きます。一つはdebugモード、もう一つはnormalモードで対照として使用します。

8. 例えば、sil:0、PP:1というように、debugモードで見たsilがElement12、PPがElement10であれば、Viseme To Blend TargetのElement0とElement2をそれぞれ12と10に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/0197412b-5436-4033-a669-4866fd58df0b.png)

9. OVRLipSyncContextMorphTargetはOculus LipSyncプラグインの一部で、音声解析結果（つまり"visemes"）を3DモデルのBlendshapes（または"morph targets"）にマッピングします。

10. Oculus LipSyncでは、Visemeは特定の口の形を表す数値で、発音時の唇と舌の特定の位置に対応します。

11. OVRLipSyncContextMorphTargetのViseme To Blend Targetフィールドでは、上記の順序でモデルの対応するBlendshape名を入力する必要があります。例えば、モデルに"MouthOpen"という名前のBlendshapeがある場合、それを"aa"（口を開ける）Visemeにマッピングしたいと思うかもしれません。その場合、11番目の位置に"MouthOpen"を入力します。

12. モデルにはすべてのVisemeに完全に一致するBlendshapesがない場合がありますが、これは正常です。その場合、可能な限りマッチングを行うか、近似するために類似のBlendshapeを使用できます。例えば、モデルに"FF"（上下の歯が接触）Visemeを表す専用のBlendshapeがない場合、口を閉じるBlendshapeを代わりに使用できます。

13. これらのステップが完了したら、再生ボタンを押すと、キャラクターが再生される曲に合わせて口パクを同期する様子を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/f392138e-030d-2ae9-4cfc-26283feb7ef1.png)

14. 次に、blendshapesの録画に移ります。メッシュに`Unity Animation Recorder`コンポーネントを追加し、`Set Save Path`をクリックしてanimationの保存パスを指定します。ファイル名を指定し、下の`Record BlendShapes`オプションをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/2a36617a-c837-7885-2a3a-7b227c21b128.png)

15. 再生ボタンを押し、Qを押して録画を開始し、Wを押してanimationを保存します。これで、口パクのanimationを録画できました。おめでとうございます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513537/f670535c-8a84-b56e-8f21-17ad1b6c9876.png)

## 結果
成功したら、bodyのanimationを録画し、それをbodyにドラッグアンドドロップします。すると、キャラクターの口が録画した口パクアニメーションを再生し始めます。

## 参考リンク
- [Oculus Lip Syncの使用方法](https://developer.oculus.com/documentation/unity/audio-ovrlipsync-unity/?locale=ja_JP)
- [Unity-Runtime-Animation-Recorderの使用方法](https://github.com/newyellow/Unity-Runtime-Animation-Recorder)
- [Oculus Lip SyncのVisemeとBlendshapeのマッピング](https://developer.oculus.com/documentation/unity/audio-ovrlipsync-visemes-unity/?locale=ja_JP)
- [UnityのAnimation Recorderの使用方法](https://forum.unity.com/threads/recording-animations.529779/)