CRI LipSync V for Unity Manual  Last Updated: 2021-11-01
実行中にコンポーネントを生成・使用する

サンプル内容

概要

cri4u_samples_crilips_scene06_screen.png

アプリケーション実行中にキャラクターモデル制御コンポーネントを生成・設定等を行いモーフィングをさせます。
モーフィング処理はユーザーアプリケーション上での継承を想定した、サンプルシーン独自クラスを使用しています。

操作方法

  • [Setup Component] / [Unsetup Component]
    • キャラクター制御コンポーネント CriLipsDeformer.LipsMorph に対してモーフィングクラスを登録/登録解除を行います。
  • [Play]
    • AudioSource による音声再生を行います。
  • [Stop]
    • AudioSource による音声再生を停止させます。

プログラムの解説

本サンプルでは、大きく分けて以下の2つの操作を行っています。
  • アプリケーション実行中にキャラクター制御用コンポーネント CriLipsDeformerForAnalyzer の生成
  • ICriLipsMorph を継承した独自モーフィングクラスの定義とコンポーネントへの設定
以下の節ではそれぞれのサンプルスクリプト内の実装について解説します。

1.コンポーネントの生成

キャラクター制御コンポーネント CriLipsDeformerForAnalyzer をゲームオブジェクトへ追加します。
private void Start() {
this.criLipsDeformer = this.gameObject.AddComponent<CriLipsDeformerForAnalyzer>();
}
このコンポーネントは CriLipsAnalyzer への参照を保持するコンポーネントです。
実際のキャラクター制御を行っている部分は後述の CriLipsDeformer.LipsMorph に登録されたクラスになります。

2.コンポーネントの設定

上記で生成したコンポーネントは AddComponent() した段階ではモーフィング向けの設定はされていません。
サンプルスクリプトでは [Setup Component] ボタンを押下することで SampleAddCustomComponent.SetupComponent() が呼ばれ
生成した CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra のオブジェクトを CriLipsDeformer.LipsMorph へ登録します。
private void SetupComponent() {
customLipsMorph = new CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra();
~~~
criLipsDeformer.LipsMorph = customLipsMorph;
criLipsDeformer.UserModifyDelegate = customLipsMorph.GetVolumeDelegate;
~~~
}
CriLipsDeformer.LipsMorph へモーフィングクラスを登録すると次のフレーム更新のタイミングからリップシンクが行われます。

ex1.モーフィングインタフェースの継承と生成

本サンプルでは CRI LipSync V プラグインが提供しているモーフィング継承クラスでは対応できない
「キャラクターモデル構造に日本語5母音に加えて、音量によって変化する部位があることを想定したモデルデータ」を想定し
CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra クラスを以下のように定義しています。
public class CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra : ICriLipsMorph {
~~~
public int extraBlendShapeIndex;
~~~
public void Update(ref CriLipsMouth.Info info, ref CriLipsMouth.MorphTargetBlendAmountAsJapanese blendAmount) {
~~~
Target.SetBlendShapeWeight(extraBlendShapeIndex, this.volume + 96.0f);
}
}
本クラスを実行中に生成し、キャラクターモデルごとの設定を行っています。
private void SetupComponent() {
customLipsMorph = new CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra();
なお、 CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra クラスはブレンドシェイプのインデックス値をもとにモーフィングを行うため
キャラクターモデルのもつブレンドシェイプ名からインデックス値へ変換が必要なことに注意してください。
customLipsMorph.Target = skinnedMeshRenderer;
// Set morph target index to CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra.
customLipsMorph.aIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("MOUTH_A");
customLipsMorph.iIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("MOUTH_I");
customLipsMorph.uIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("MOUTH_U");
customLipsMorph.eIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("MOUTH_E");
customLipsMorph.oIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("MOUTH_O");
// Set eyebrow to extra blendshape
customLipsMorph.extraBlendShapeIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("BROW_FUN");
}
覚え書き
CustomLipsMorphBlendShapeJapaneseAIUEOWithExtra.Update() 内では以下の2つの値が常に最新の解析結果で渡ってきます。
サンプルのクラスでは MorphTargetBlendAmountAsJapanese とデリゲート内で取得した音量値のみ参照していますが
解析結果はどちらも同時に参照することができるため、両方の解析結果を組み合わせることも可能です。
(例:MorphTargetBlendAmountAsJapanese + Info.tonguePosition など)

ex2.モーフィングインタフェースの登録解除

CriLipsDeformerForAnalyzer コンポーネントはそのまま、キャラクターモデルを差し替えることが可能です。
この場合は CriLipsDeformer.LipsMorph に null を設定し、コンポーネントへのモーフィングクラスの登録を解除します。
private void UnsetupComponent() {
// Reset interface from CriLipsDeformer
criLipsDeformer.LipsMorph = null;
criLipsDeformer.UserModifyDelegate = null;
customLipsMorph = null;
}
登録を解除されたモーフィングクラスは ICriLipsMorph.Reset が呼び出されます。
これは登録解除した後もキャラクターモデルが口を開けたままになってしまう、など意図しないキャラクターの挙動への制御に利用できます。