サンプルUnreal Engineプロジェクト
口形状情報の生成・取得用クラス である "ULipsAtomAnalyzer" の具体的な使用方法を確認するために、サンプルUnreal Engineプロジェクトを下記の場所に配置しています。
- サンプルUnreal Engineプロジェクト://cri/expansion/cri_adx_lipsync/UnrealEngine/Samples/RealtimeLipSync
このプロジェクトに対して「 CRIWARE ADX LipSync Plugin のインストール方法 」を適用してビルド&起動すると、Unreal Editor 上で下記の画面を確認できます。
criware_ue4_adx_lipsync_sample_top.jpg

ビューポートにサンプルキャラクターモデル "FaceSample" の顔部分が表示されます。 Play In Editor を行うとセリフ音声が再生され、キャラクターモデルの口形状が変化するのを確認してください。 キャラクターモデルの口形状デザインについては「 ADX LipSyncに適したフェイシャルの口形状 」を参照してください。
一連のリップシンクを実装するために、本サンプルでは "FaceSample_BP" というキャラクターブループリント1つだけを用意しています。 これをエディタで開くと以下のようなグラフが表示されます。
criware_ue4_adx_lipsync_sample_bp.png

このブループリントでは主に以下の仕事をしています。
  1. BeginPlayイベント発火時、SetupAdxLipsyncAnalyzer マクロで ULipsAtomAnalyzer オブジェクトのセットアップを行います。この中で UAtomComponent オブジェクトとの紐付けも行います
  2. ULipsAtomAnalyzer に紐付けた UAtomComponent の Play() メソッドを呼び、セリフ音声再生を開始します。セリフ音声は UAtomComponent オブジェクトに予め設定されています
  3. Tickイベント発火時に音声再生中なら、口形状情報の取得とモデルのメッシュに反映します。IsLipSyncBasedOnJapaneaseVowel 変数の値に応じて、変化のさせ方を切り替えることができます。デフォルトでは日本語5母音の口形状情報を取得し、キャラクターモデルのメッシュに反映しています
以下、詳細を説明します。

ULipsAtomAnalyzerオブジェクトのセットアップ

SetupAdxLipsyncAnalyzer マクロは以下のようなグラフになっています。
criware_ue4_adx_lipsync_sample_bp_setup.png

このマクロでは主に以下の仕事をしています。
  1. ULipsAtomAnalyzerクラスからオブジェクトを構成(作成)します。これは必須の操作です
  2. ULipsAtomAnalyzerの Init() メソッドを呼び、初期化を行います。これは必須の操作です。引数にサンプリングレートを指定できますが、サンプルでは0つまりデフォルト値を指定します。詳細は後述します
  3. ULipsAtomAnalyzerの Attach() メソッドを呼び、UAtomComponentオブジェクトを紐付けます。これで音声再生を開始すれば口形状情報のリアルタイム解析・生成が始まります。これは必須の操作です
  4. ULipsAtomAnalyzerの GetInfoAtSilence() メソッドを呼び、無音状態の口形状情報の一部の値をWidthAtSilence変数に保持します。これは必須ではありません。詳細は後述します
補足:初期化時に指定するサンプリングレートについて
ADX LipSyncによる音声解析は、事前に入力する波形のサンプリングレートを指定する必要があります。 再生する音声データのサンプリングレートを揃えて利用することをおすすめします。 異なるサンプリングレートの音声データを再生する場合は、 ULipsAtomAnalyzer の SetSamplingRate() メソッドを呼び出して設定を行ってください。
補足:無音状態の口形状情報について
ULipsAtomAnalyzerは入力音声が無音状態であると判断すると、「口を閉じている状態」を示す口形状情報を返します。 デフォルトでは、無音状態の口の横幅値は0.583です。サンプルキャラクターモデル FaceSample は口の横幅に対応するモーフターゲットとして LipWidthOpen を所持していますが、 「口を閉じている状態」として0.0のブレンド値を想定した作りになっています。つまりULipsAtomAnalyzerとモーフターゲットの間で「無音状態」に対する解釈のズレが存在します。 口形状情報をモーフターゲットに適用する際、このズレを考慮して補正をかける必要があります。そのため、GetInfoAtSilence() メソッドで取得した値を WidthAtSilence 変数に保持しておき、後の処理で役立てます。

口形状情報の取得とメッシュへの反映 (日本語5母音で行う場合)

UpdateMouthShapeBasedOnJapaneseVowel マクロで口形状情報の取得とメッシュへの反映を行います。これは日本語5母音に対応するモーフターゲットを持つメッシュを想定した処理です。 以下のようなグラフになっています。
criware_ue4_adx_lipsync_sample_bp_update_vowel.png

このマクロでは ULipsAtomAnalyzer オブジェクトの GetMorphTargetBlendAmountAsJapanese() メソッドで取得した A、I、U、E、O のブレンド値を、各モーフターゲットにセットしています。

口形状情報の取得とメッシュへの反映 (口の横幅・縦幅で行う場合)

UpdateMouthShapeBasedOnJapaneseVowel マクロで口形状情報の取得とメッシュへの反映を行います。これは口の縦幅、横幅に対応するモーフターゲットを持つメッシュを想定した処理です。 以下のようなグラフになっています。
criware_ue4_adx_lipsync_sample_bp_update_wh.png

このマクロでは ULipsAtomAnalyzer オブジェクトの GetInfo() メソッドで取得した値を、WidthAtSilence 変数で保持した値で補正しつつ、各モーフターゲットにセットしています。

サンプルを改造するには

ユーザは サンプルUnreal Engineプロジェクト をカスタマイズして CRIWARE ADX LipSync Plugin の使い方を学ぶことができます。 例えば以下のようなカスタマイズを試してみることをおすすめします。
キャラクターモデルのメッシュを独自のものに差し替える
サンプルプロジェクト内の "FaceSample_BP" ブループリントには Mesh コンポーネントが追加されています。これを詳細パネルから編集し、独自メッシュに差し替え可能です。 ただしメッシュが持つモーフターゲットの種類に注意してください。このブループリントではサンプルメッシュ "FaceSample" のモーフターゲット名にのみ対応しています。
独自のセリフ音声をキャラクターに喋らせる
サンプルプロジェクト内の "FaceSample_BP" ブループリントには UAtomComponent が追加されています (Unreal Editor 上からは "Atom" という名前で確認できます)。 Atom を詳細パネルから編集し、Sound プロパティを別のキューアセットに差し替え可能です。 キューアセットの作り方やその元になる ADX データの作り方については「 ADX2サウンド再生 」と「CRI ADX2ユーザーズマニュアル」を参照してください。