この記事でのバージョン
Unity 2018.4.20f1
OVRLipSync 1.43.0
はじめに
今回はOVRLipSync(Oculus Lipsync Unity)という物を使って、音声に合わせてキャラクターの口の動かす
つまりリップシンクを実装するという話です。
イメージとしては以下のような感じ。
Oculus Lipsync Unity(OVRLipSync)を使って口の動きを音声に合わせる(リップシンクさせる) pic.twitter.com/dV18XAtS9Q
— カン@Game Creator(Unity/VR/Switch/Steam) (@Kan_Kikuchi) 2020年5月26日
なお、記事中では以下のアセットを使っています。
Fighting Girl Voice Pack - Yukari Rokujo | Voices Sound FX | Unity Asset Store |
OVRLipSync(Oculus Lipsync Unity)
そもそもOVRLipSyncとはなんぞやという話ですが、
名前の通りOculusが作っているUnity向けのリップシンクライブラリです。
Oculusリップシンクは、WindowsまたはmacOSでアバターの唇の動きを話し声や笑い声に同期させるために使用できるUnityプラグインを提供します。Oculusリップシンクは、マイク入力やオーディオファイルからのオーディオインプットストリームを分析し、特定の音声に対応する唇の動きや顔の表情を示す一連の値(口形素と呼ばれる)を予測します。口形素は特定の音声に対応する視覚的な唇の動きや顔の表情を示すものであり、音素が音を表す方法と類似しています。口形素という用語は、読唇を説明するときに使用され、明瞭度の基本的な視覚的単位です。コンピューターアニメーションでは、口形素を使って、アバターが話しているようにアニメーションを付けることができます。
なお、導入は以下のサイトからダウンロードしてきて、
OculusLipSync.unitypackageをインポートするだけです。
リップシンクの実装
さて本題の実装についてです。
まず適当なオブジェクトを作成し、OVR Lip SyncというコンポーネントAddします。
(以下の例では一人の女の子しかリップシンクしないので、Prefab内に作成しています)
次に声を鳴らしたい位置にオブジェクトを作成し(今回はMouth)、
そこにOVR Lip Sync ContextとOVR Lip Sync Context Morph TargetをAddします。
なお、その時自動でAudio SourceもAddされます。
そしてOVR Lip Sync Context Morph Targetに顔のSkinned Mesh Rendererを設定します。
顔のSkinned Mesh Rendererが分からない場合は、
Hierarchy上で「t:SkinnedMeshRenderer」と検索して
BlendSharpsという項目を操作すると表情が変わるやつ(今回はbody)を探しましょう。
後はOVRLipSyncContextMorphTargetのViseme To Blend Targetsで対応する表情を設定するだけです。
ちなみに「aaは"あ"の表情を表している」などの
各項目が何を表しているかは以下のサイトが分かりやすいです。
必要なシェイプキー一覧
VRC.v_sil :真顔
VRC.v_PP :Mをネイティブっぽく発音したエンムのム「にやり」か「ω」が近い
VRC.v_aa :「あ」 #最初に作る
VRC.v_oh :「お」か「う」下記より口を広げている方 #aaの横を圧縮
VRC.v_ou :「お」か「う」上記より口をすぼめている方 #ohの横を圧縮
VRC.v_ih :「あ2」ないし「あ3」それらがない場合「あ」か「□」のモーフを複製し適用 #aaの50%
VRC.v_TH :「ih」に近いので複製 #ihをコピー
VRC.v_nn :「ん」ないし「ih」か「dd」のモーフを複製 #ihの舌を持ち上げる
VRC.v_DD :控えめな「え」 #nnを少し下あごを閉じる
VRC.v_kk :「ih」と同じで口元が気持ち上がる感じ「ワ」も範囲に入る #ihの舌と上唇を上げる
VRC.v_FF :英語的なふの発音「□」が近い #aaの20%ぐらい 下唇を軽く噛む
VRC.v_E :「え」 #いの口
VRC.v_CH :「ss」よりも口をすぼめた「い」 #eの横を圧縮
VRC.v_RR :「□」が近いので「ff」を複製 #chの下あごを広げる
VRC.v_SS :「ch」よりも口を広げた「い」「ch」を複製しても良いかも #eの上唇をまっすぐ閉じる
なお、口の動きと同時に音を鳴らす場合は、
OVRLipSyncContextのAudioLoopbackにチェックを入れましょう。
設定はこれで完了なのですが、一部プログラムの修正が必要になります。
まずOVR Lip Sync Context Morph TargetにあるUpdateをLateUpdateに変更します。
さらに自分が試した環境だと
口を動かした後になぜか片目が閉じた状態(VRC_blink_leftが100)になっていたので、
OVR Lip Sync Context Morph TargetのSetVisemeToMorphTargetで
最初のBlendShapeは操作しないようにしました。
あとは自動で付いたAudioSourceを使って声を鳴らせば、それに合わせて口が動くようになります。
Oculus Lipsync Unity(OVRLipSync)を使って口の動きを音声に合わせる(リップシンクさせる) pic.twitter.com/dV18XAtS9Q
— カン@Game Creator(Unity/VR/Switch/Steam) (@Kan_Kikuchi) 2020年5月26日
参考