Unreal Engine 5 + Omniverse Audio2Face で音声からリップシンクアニメーションを作成して動かす

# はじめに

Unreal Engine を使って映像作品を作ってみたいと思い、リップシンクアニメーションを作る方法を調べてまとめました。
筆者のレベルは Unity ちょっと使ったことのある Unreal Engine 初心者なので、ご指摘歓迎です。

# 動作環境

Windows 11
Omniverse Audio2Face 2022.1.2
Unreal Engine 5.1.0

# Omniverse Audio2Face のインストール

## Omniverse Launcher のインストール

下記ページの「Get Started」から個人情報を入力してダウンロードしてインストールする。
https://www.nvidia.com/en-in/omniverse/

## Omniverse Audio2Face のインストール

* プログラム「NVIDIA Omniverse Launcher」を起動する。
* 「更新」タブを開く
* 検索窓に「audio2face」と入力し、表示されるアプリ「OMNIVERSE AUDIO2FACE」を選択しインストールする

## Nucleus サービスを追加する

* Omniverse ではサンプル素材の利用や作成したリソースの共有のために Nucleus サービスというファイルサーバーのようなものが用意されているので、これをインストールする
* Omniverse Launcher の「NUCLEUS」タブを開く
* 「ローカル Nucleus サービスを追加する」を選択
* サーバー名とファイルの保存場所を確認されるので、デフォルトのまま「次へ」
* Nucleus サービス上での管理者アカウント情報の入力が求められるので、任意のユーザー名やパスワードなどを入力して「セットアップを完了する」

## Unreal Engine 5.1 Omniverse Connector のインストール

* Omniverse から Unreal Engine へリソースの共有をするためのアプリケーションをインストールする
* 「更新」タブを開いて「unreal engine」を検索し、表示される「Epic Games Unreal Engine 5.1 Omniverse Connector」をインストールする

# Omniverse Audio2Face  で音声からリップシンクアニメーションを作成する

* 下記の動画を参考にリップシンクアニメーションを作成する
* https://www.youtube.com/watch?v=jrZ71xtaJ5E 

## 音声の用意

https://ondoku3.com/ja/
音声読み上げサービスを使って音声を用意した。

ダウンロードできたファイルは mp3 だったので、
https://convertio.co/ja/
を使って wav に変換した。

## Omniverse Audio2Face の起動

* Omniverse Launcher の「ライブラリ」タブを開く
* アプリケーションの Omniverse Audio2Face を選択し「スタート」

## ブレンドシェイプ用のモデルを読み込み

* デフォルトのアニメーションから Unreal Engine で利用できるブレンドシェイプアニメーションに変換する
* 動作確認をするためのブレンドシェイプ用のモデルを読み込む
* 対象のファイルは Content パネルの「omniverse://localhost/NVIDIA/Assets/Audio2Face/Samples/blendshape_solve/male_bs_46.usd」にある
* このファイルをドラッグアンドドロップで Stage パネルにコピーする
* デフォルトのモデルと同じ座標に配置されており見づらいので、Stage で World > male > char_male_model_hi > c_headWatertight_hi を選択し、Viewport で移動させる

## ブレンドシェイプアニメーションへの変換

* 右上の A2F Data Conversion タブを選択
* BLENDSHAPE CONVERSION 欄の編集をする
    * Input Anim Mesh に /World/male/char_male_model_hi/c_headWatertight_hi  に
    * Blendshape Mesh に /World/male_bs_46/neutral に
 * SET UP BLENDSHAPE SOLVE を押す
 * Audio2Face Tool タブで AUDIO PLAYER 欄で音声の再生を行い、青いモデルが動いたら成功
 
 ## 音声ファイルをセットする
 
 * Audio2Face Tool タブの AUDIO PLAYER の Audio Source Directory に音声ファイルのあるディレクトリを指定
 * WAV Audio File に対象の音声ファイルを指定
 * 再生し、リップシンクが動いていることを確認
 
 ## アニメーションを書き出す
 
 * 右上の A2F Data Conversion タブを選択
* COMMON SETTINGS 欄で File Name にアニメーション名を入力する
* BLENDSHAPE CONVERSION 欄の EXPORT AS USD SkelAnimation を押してアニメーションの書き出しをする
 

# Unreal Engine 5 へ MetaHuman を読み込む

## Unreal Engine 5 のインストール

* 公式ドキュメントに従ってインストールし、起動する
    * https://docs.unrealengine.com/4.27/ja/Basics/InstallingUnrealEngine/
* ゲーム > Blank を選択、任意のプロジェクト名を入力して「作成」

## MetaHuman の読み込み

* 上部メニューから「ウィンドウ > コンテンツブラウザ1」と選択してコンテンツブラウザを開く
* コンテンツブラウザパネルの「追加」ボタンを押し、「Quixel コンテンツを追加」を選択
* Quixel Bridge パネルが開くので、右上のユーザーアイコンを押し、Epic Games アカウントでログイン
* 左メニューの「MetaHumans > MetaHuman Presets」プリセットの MetaHuman が表示されるので好きなものを選択。今回は Ada を選択
* Download して Add する
* コンテンツブラウザの「コンテンツ > MetaHumans > Ada > BP_Ada」に読み込まれるので、これをビューポートにドラッグアンドドロップして配置する

# リップシンクアニメーションを MetaHuman に適用

## アニメーションのインポート

* コンテンツブラウザの「MetaHuman > Ado」で右クリックし「Import Facial Animation」を選択
* Input USD File で Audio2Face でエクスポートしたファイルを選択（エクスポート時にパスを覚えておく。今回はデフォルトで「ドキュメント > Kit > shared > capture」になっていた。）
* Skelton に Face_Archetype_Skelton を選択
* OK 

##  音声のインポート

* コンテンツブラウザの「インポート」を押し、リップシンクのアニメーション作成の際に利用した音声ファイルをインポートする

## レベルシーケンスの作成

* Unreal Engine で Premiere Pro などのようにタイムラインでオブジェクトを操作するシーケンサーを導入する
* ビューポートパネルのカチンコのアイコンから「レベルシーケンスを追加」
* シーケンサーパネルが追加されることを確認

## シーケンサーへ音声と MetaHuman の登録

* アウトライナーパネルから BP_Ada を選択し、追加したレベルシーケンスのシーケンサーパネルへドラッグアンドドロップする
* シーケンサーの左側で右クリックし「オーディオトラック」を選択、「+ オーディオ」ボタンを押下し、インポートした音声ファイルを選択

## シーケンサーへリップシンクアニメーションの追加

* BP_Ada の Face の Face_ControlBoard_CtrlRig をミュートする
* Face の「+ トラック」を押下し「アニメーション」を選択、インポートしリップシンクアニメーションを読み込む
* シーケンサーを再生し、音声に合わせてアニメーションが動くことを確認する