はじめに
音声入力からリアルタイムにフェイシャルアニメーションを生成する仕組みは、
デジタルヒューマンやインタラクティブアバターを作る上で、ほぼ避けて通れない要素になっています。
今回は、
音声 → フェイシャルアニメーション生成AI → Unreal Engine で表示
という構成を実際に試しながら、
「中で何が起きているのか」「どういう設計思想なのか」を整理してみました。
今回やったこと(ざっくり)
- 音声入力をもとにフェイシャルアニメーションを生成
- AIは Audio2Face-3D NIM を使用(コンテナとして起動)
- 出力された表情データを Unreal Engine 側で再生
- キャラクターは Blend Shape(Morph Target)駆動
フェイシャルアニメーション方式について
なぜ Blend Shape を使うのか
今回の構成では、ボーン駆動ではなく Blend Shape(Morph Target)方式を使っています。
Blend Shape は、
- ニュートラルな顔メッシュ
- 各表情ごとの差分メッシュ
を用意しておき、
各表情の「重み(0〜1)」を合成して最終的な顔を作る方式です。
この方式の良いところは:
- 実行時に扱うデータが「名前 + 数値」だけで軽い
- エンジンやDCCツールをまたいでも互換性を保ちやすい
- AIが出力した数値をそのまま適用できる
音声駆動のように「外部システムが表情を決める」場合、
かなり相性が良い方式だと感じました。
Blend Shape 互換性で重要なポイント
実装上、最低限押さえておく必要があるのは以下です。
-
Blend Shape 名が一致していること
- 今回は ARKit 52 Blend Shape 命名規則を使用
- 値のスケールが 0〜1 で揃っていること
- 同一トポロジーで作られていること
これが揃っていれば、
- ポリゴン数
- テクスチャ
- シェーダ
が異なっていても、表情アニメーション自体は問題なく再生できます。
Audio2Face-3D NIM について
Audio2Face-3D NIM は、
音声(+感情情報)からフェイシャルアニメーションを生成するAIを
GPU対応のコンテナとして提供する仕組みです。
特徴を整理すると:
- 音声から自動的に口形・表情を生成
- 感情は自動推定も、明示指定も可能
- 出力は ARKit 互換の Blend Shape カーブ
- Docker コンテナとして起動できる
- 複数ストリームを同時に処理可能
重要なのは、
この仕組み自体は「描画」を一切しない点です。
あくまで「数値(表情データ)を出すAI」として割り切った設計になっています。
AIの出力データを見てみる
実際に出力される中間成果物は、主に2種類のCSVです。
animation_frames.csv
- 約30fpsでサンプリングされたタイムライン
- 各フレームに対して:
- timeCode
- blendShapes.JawOpen
- blendShapes.MouthSmile_R
- など約50種類以上のBlend Shape値
要するに、時系列に応じた大量のポリゴン・頂点の位置情報データが入っています。
a2f_3d_input_emotions.csv
- joy / anger / sadness などの感情値
- 各感情は 0〜1 のスカラー値
これは必ずしもフェイシャルに直接使う必要はなく、
- 体の動きに反映する
- カメラ演出に使う
- ログや分析用途に回す
など、アプリ側で自由に解釈できます。
全体アーキテクチャ
今回の構成はかなりシンプルです。
音声入力
↓
Audio2Face-3D NIM(GPU / Docker)
↓
Blend Shape の重みデータ
↓
Unreal Engine(キャラクター表示)
- AIは Ubuntu Server 上でコンテナとして常駐
- Unreal Engine 側はプラグイン経由でデータを受信
- Unreal は「受け取った数値を適用するだけ」
実装してみて感じたこと
この構成の良いところは:
- エンジンを差し替えやすい
- AIモデルを変えても下流が壊れにくい
- 表情データを保存・再利用・分析できる
- 複数キャラクター・複数ユーザーに拡張しやすい
「リアルな顔を作る」よりも、
インタラクティブなシステムをどう組むかという視点で見ると、
かなり扱いやすい設計だと感じました。
まとめ
音声駆動フェイシャルアニメーションを、
- AIは数値生成に専念
- エンジンは表示に専念
という形で分離して考えると、
実験・プロトタイプ・プロダクト化のどの段階でも柔軟に扱えます。
デジタルヒューマンだけでなく、
ゲーム、XR、教育、シミュレーションなど、
応用範囲はかなり広そうです。
