(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



OVRLipSync(Oculus Lipsync Unity)を使って音声に合わせて口の動かす(リップシンクさせる)【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2018.4.20f1
OVRLipSync 1.43.0


はじめに

今回はOVRLipSync(Oculus Lipsync Unity)という物を使って、音声に合わせてキャラクターの口の動かす

つまりリップシンクを実装するという話です。


イメージとしては以下のような感じ。



なお、記事中では以下のアセットを使っています。

Fighting Girl Voice Pack - Yukari Rokujo | Voices Sound FX | Unity Asset Store



OVRLipSync(Oculus Lipsync Unity)

そもそもOVRLipSyncとはなんぞやという話ですが、

名前の通りOculusが作っているUnity向けのリップシンクライブラリです。

Oculusリップシンクは、WindowsまたはmacOSでアバターの唇の動きを話し声や笑い声に同期させるために使用できるUnityプラグインを提供します。Oculusリップシンクは、マイク入力やオーディオファイルからのオーディオインプットストリームを分析し、特定の音声に対応する唇の動きや顔の表情を示す一連の値(口形素と呼ばれる)を予測します。口形素は特定の音声に対応する視覚的な唇の動きや顔の表情を示すものであり、音素が音を表す方法と類似しています。口形素という用語は、読唇を説明するときに使用され、明瞭度の基本的な視覚的単位です。コンピューターアニメーションでは、口形素を使って、アバターが話しているようにアニメーションを付けることができます。


なお、導入は以下のサイトからダウンロードしてきて、


f:id:kan_kikuchi:20200525073148j:plain



OculusLipSync.unitypackageをインポートするだけです。

f:id:kan_kikuchi:20200525073249j:plain



リップシンクの実装

さて本題の実装についてです。

まず適当なオブジェクトを作成し、OVR Lip SyncというコンポーネントAddします。

(以下の例では一人の女の子しかリップシンクしないので、Prefab内に作成しています)

f:id:kan_kikuchi:20200526145651j:plain


次に声を鳴らしたい位置にオブジェクトを作成し(今回はMouth)、

そこにOVR Lip Sync ContextとOVR Lip Sync Context Morph TargetをAddします。

なお、その時自動でAudio SourceもAddされます。

f:id:kan_kikuchi:20200526145800j:plain


そしてOVR Lip Sync Context Morph Targetに顔のSkinned Mesh Rendererを設定します。

f:id:kan_kikuchi:20200526145928j:plain


顔のSkinned Mesh Rendererが分からない場合は、

Hierarchy上で「t:SkinnedMeshRenderer」と検索して

BlendSharpsという項目を操作すると表情が変わるやつ(今回はbody)を探しましょう。

f:id:kan_kikuchi:20200526145834j:plain


後はOVRLipSyncContextMorphTargetのViseme To Blend Targetsで対応する表情を設定するだけです。

f:id:kan_kikuchi:20200526161107j:plain


ちなみに「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にチェックを入れましょう。

f:id:kan_kikuchi:20200526161132j:plain


設定はこれで完了なのですが、一部プログラムの修正が必要になります。

まずOVR Lip Sync Context Morph TargetにあるUpdateをLateUpdateに変更します。

f:id:kan_kikuchi:20200526161119j:plain


さらに自分が試した環境だと

口を動かした後になぜか片目が閉じた状態(VRC_blink_leftが100)になっていたので、

f:id:kan_kikuchi:20200526161143j:plain


OVR Lip Sync Context Morph TargetのSetVisemeToMorphTargetで

最初のBlendShapeは操作しないようにしました。

f:id:kan_kikuchi:20200526161155j:plain


あとは自動で付いたAudioSourceを使って声を鳴らせば、それに合わせて口が動くようになります。




参考