CRI LipSync V for Unity Manual  Last Updated: 2021-11-01
解析結果を加工してリップシンク

サンプル内容

概要

cri4u_samples_crilips_scene05_screen.png

CriLipsDeformer.UserModifyDelegate を使用して、CRI Lipsから取得できる解析結果を加工してリップシンクを行うサンプルです。
[PLAY] ボタンを押すと音声が再生され、キャラクターがリップシンクします。
[STOP] ボタンを押すと音声が停止し、キャラクターの口が閉じます。

サンプルシーンの解説

AudioSouce入力リップシンク 」シーンと同じ3つのCRI Lips コンポーネントが配置されていますが
これに加えて、解析結果を加工するためのサンプルコンポーネント Sample Delegate が追加されています。
cri4u_samples_crilips_scene05_setting.png

CRI Lipsによるリップシンク解析は、音量によらず口の形状をパラメーターとして出力します。
したがって以下のような、 リップシンク解析結果を加工したい 用途向けに独自の処理を登録できる CriLipsDeformer.UserModifyDelegate があります。
  • 音量によって口の大きさを追従させたい
  • 独自の平滑化などのフィルターをリップシンク解析結果に適用したい
以下ではSample Delegateコンポーネント内で実際に CriLipsDeformer.UserModifyDelegate を使用している処理について解説をします。

プログラムの解説

デリゲート登録関数の定義

解析結果の加工処理は delegate として提供されており、独自の処理を登録するためには CriLipsDeformer.UserModifyDelegate の戻り値と引数を揃える必要があります。
CriLipsDeformer.UserModifyDelegate の型は CriLipsDeformer.UserModifyDelegateFunction なので、 戻り値と引数を以下のように宣言しています。
void SampleLipSyncModifyDelegate(
ref CriLipsMouth.Info info,
ref CriLipsMouth.MorphTargetBlendAmountAsJapanese morph,
ICriLipsAnalyzeModule analyzeModule) {
}

解析結果の加工処理

デリゲートに登録する関数では ref キーワード付きでリップシンク解析結果が渡ってくるため
登録関数内で ref キーワードのついた値を書き換えることで解析結果が加工できます。
また第三引数の analyzeModule から、 CriLipsAnalyzer のリップシンク解析結果以外の値を参照することができます。

したがって本のサンプルでは analyzeModule から音量を取得し
取得した音量が指定した閾値より小さかった場合に、日本語5母音の解析結果を小さくする処理が実装されています。
currentVolume = analyzeModule.GetVolume();
if (currentVolume < volumeThreshold) {
morph.a *= scaleOnSmallVoice;
morph.i *= scaleOnSmallVoice;
morph.u *= scaleOnSmallVoice;
morph.e *= scaleOnSmallVoice;
morph.o *= scaleOnSmallVoice;
}

関数の登録

上記で実装した関数を CriLipsDeformer.UserModifyDelegate へ登録します。
本デリゲートへ登録された関数は CriLipsDeformerForAnalzyer の口パク更新のタイミングで呼び出され
加工された値は最終的に CriLipsDeformer.LipsMorph.Update() に渡されます。
void Start () {
~~~
lipsDeformer.UserModifyDelegate = SampleLipSyncModifyDelegate;
}