Oculus LipsyncとADX Lipsyncを比較してみた


# 最初に

どうも、[ろっさむ](https://twitter.com/4_mio_11)です。

今回は現在存在する代表的なLipsyncライブラリである「Oculus Lipsync」と「ADX Lipsync」の現在公開されている情報と、使ってみた個人的な感想をこの記事にまとめようと思います。



# Lipsyncとは何か？

端的に言えば口パク表現です。

口パク表現を行うことで二次元のキャラクター達が生き生きとして見え、存在感や実在感が高まります。

この口パクデータを、音声データから解析を行い、良い感じに作成してくれるのが先述した「Oculus Lipsync」と「ADX Lipsync」というプラグインとなります。

どちらも、マイク入力又は音声データから音声波形を解析し、唇の動きを予測して、その結果の値をモデル側に流し込んでおり、リアルタイムで口パクパターンの生成が可能です。



# 両者の共通の仕組み部分について

Lipsyncをするためのライブラリなので、コア部分の音声波形の解析アルゴリズム以外は、ある程度仕組みも似た部分が多いです。

まずは基本的な流れを確認してみましょう。



1. 音声データの入力
2. 音声波形の解析
3. それぞれの音の、唇の形状を計算
4. 計算結果の数値を、3Dモデルの場合は`skinnedMeshRenderer`の`BlendShape`に入れる。2Dの場合はテクスチャを変更。

この`skinnedMeshRenderer`とは、ボーンアニメーションを使用するために必要なコンポーネントです。そして`BlendShapes`はボーンを使用せずにメッシュの頂点を動かすことで形状を変形させることができる機能です。1つの`BlendShape`に対して`0~100`の数値が入力可能です。

例えば以下のような感じです（モデルは私がVRoidで作成したものです）。

![blendshape.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/e6f38f44-14e8-6b83-7da8-d85477870257.gif)




いくつかの`BlendShapes`を合成させることによって複雑な口の動きなどを再現できます。

`BlendShapes`は一番上を`0`とし、順番に1,2,3と数字が割り当てられています。

Lipsyncライブラリでは、予めユーザー側で指定した`BlendShape`（例えば「あ」なら、数字を指定して`xxxx_A`という`BlendShape`）セットに対して、音声波形を解析し、どの`BlendShape`にどれくらいの数値を割り当てればよいかを計算して実際に数値を入れます。



この流れはどちらも共通しているかと思います。

では実際に何が異なるのか見ていきましょう。



# Oculus Lipsyncについて

まずは結構前からあるOculus Lipsyncから見ていきましょう。

こちらは元々Unity向けのライブラリでしたが、2018/10/5以降、UE4にも対応するようになりました。

Oculus Lipsyncでは、**「口形素」（Visemes）**と呼ばれる口などの形状を求め、それを`BlendShape`に反映させています。

口形素には15種類あり、「*sil*（無音）*, PP, FF, TH, DD, kk, CH, SS, nn, RR, aa, E, ih, oh, ou*」で構成されています。これらの形状の詳細を知りたい場合はOculus Lipsyncのリファレンスを参照してください。



https://developer.oculus.com/documentation/native/audio-ovrlipsync-viseme-reference/



実際に、日本語でも使用可能かと聞かれれば答えはYESです。ある程度は自然に見えますが、やはり英語の音声データの方を使用した方がナチュラルに見えます。計算結果を反映させてみた感じですと、日本語のようにはきはき音が分かれてる（大半の音が有声音）ものは、口があまり「あいうえお」とはっきりわかる形ではなく少しぼやけてる印象があります。

（あくまでも個人の感想です）



ですので以下の条件の際に使用を検討してみるのが良いかと思います。

- ネット上で使用ユーザーの解説記事など、情報が多いライブラリを使いたい
- 無料で使用したい
- 口パクにそこまで重点を置いていない



# ADX Lipsyncについて

こちらは2019の秋にリリースされたミドルウェアで、こちらもUnity、UE4どちらにも対応しています。

ADX Lipsyncではディープラーニングを駆使しているおかげか非常に精度の高い解析が行われている感じがします。



ADX Lipsyncでは二種類の口パクデータに対応しています。

- （二軸型（顎（縦）と唇の伸縮（横））に対して）**Width-Height形式**：入力音声に対する口形の幅、高さを解析。言語を選ばない。
- （音素別表情パターン型（あいうえお）に対して）**音素別ブレンド量形式**：入力音声に含まれる各音素の割合を解析。言語を選ぶ。

モデルの口構造に依存せずADX LipSyncを利用することができます。また、入力音声に対する「舌が上下どちらを向いていて、どれくらいの高さか」というのも（実験的ですが）解析可能です。

他にも「マ」「バ」など、一度口を閉じる発音「唇音」の場合は、一瞬の「閉じ口状態」に相当する口パクデータを返すように対応しています。

国内製なのでサポート体制も非常に整えられており、SDKへの対応や質問に関してのレスポンスが早いです。

また、CRI製なので、もちろん「CRI ADX2」と連携が取れます。

詳しい内容は「CEDEC2019」で講演された「キャラクターをより魅力的に! ゲーム向けリップシンクミドルウェア」がyoutubeの方に上がっているのでそちらを確認してください。

https://www.youtube.com/watch?v=VYap3VgLoF4



さて、私個人の感想としましては、日本語音声を使用した場合のLipsyncの品質は非常に高く感じました。Oculus Lipsyncと違い、「あいうえお」で`BlendShape`を指定するので、日本語に特化した仕組みになっています。そのため、使い勝手も良く、手軽に品質のいい口パクを乗せることができます。ただ使用する場合にはある程度の金額もかかってきますので、主に企業向けかと思われます。



- 企業レベルでのゲームやライブなどに使用したい
- ADX2を愛用している
- 品質の高いLipsyncを求めている
- 国内製で手厚いサポートが欲しい



# まとめ

今回は`Oculus Lipsync`と`ADX Lipsync`の二つを比較してみました。

ただ、どちらもリアルタイムで設定している`BlendShape`のセットを入れ替えるなどには対応していないため、その辺は実際にSDK内のコードをいじる必要があります（公式で対応してくれないかなぁ…）。

どのLipsyncライブラリを使用するか自分の使用目的や条件に合わせて選んでみましょう。





# 参考

https://svrinfo.jp/detail?p=247698

http://tips.hecomi.com/entry/2016/02/16/202634