【UE5】VRoidの3DキャラクターをOculus Lipsyncでリップシンクさせる

はじめに

OX ENGINEER STUDIOでクライアントエンジニアをしている林です。
Unreal Engine5(以下UE5)でマイク音声入力でのリップシンクを実装する際に、Oculus Lipsyncというリップシンク用のプラグインを使用しましたが、そのままでは使用できず、様々な修正が必要でした。
本記事では、UE5でOculus Lipsyncを動かすための修正方法について記載します。

また、Oculus Lipsyncの使用例として、VRoidの3Dキャラクターの口をリップシンクで動かす方法についても記載します。

Oculus Lipsyncとは

Oculus Lipsyncは、Meta社が提供するリップシンク用のUEプラグインです。
UnrealエンジンのOculusリップシンク

マイク入力やオーディオファイルからの音声入力を分析することで、音声に応じた口の形を表すパラメータを取得し、3Dキャラクターにアニメーションを付けることができます。
UEでリップシンクを実装する際に使用されていましたが、UE5が出る前の2021年以降更新されていないため、UE5に対応させるには修正が必要です。

事前準備

Oculus Lipsyncの修正にはVisualStudio(以下VS)が必要となります。
本記事ではVS2022を使用しています。
Visual Studio ダウンロード

VSが用意できたら、Oculus Lipsyncをダウンロードします。
Oculus Lipsync Unreal

解凍したフォルダの中にある「OVRLipSyncDemo.uproject」を右クリックし、メニューから「Generate Visual Studio project files」を選択します。
バーション確認画面が出るので、使用するUE5のバージョンを選択します。
本記事ではUE5.3を使用しています。

「Generate Visual Studio project files」が見つからない場合は、「その他のオプションを表示」を選択してください。

ソースコードの修正

ソリューションファイル「OVRLipSyncDemo.sln」をVSで開き、ソースコードを修正します。
ソースコードは、以下の画像の通りGame→Plugins→OVRLipSync→Source→OVRLipSyncフォルダにあります。

  • OVRLipSyncLiveActorComponent.cpp 122行目
    CreateVoiceCapture()の引数「DEFAULT_DEVICE_NAME」を「””」に変更します
void UOVRLipSyncActorComponent::StartVoiceCapture()
{
    VoiceCapture = FVoiceModule::Get().CreateVoiceCapture("", SampleRate, 1);
    if (!VoiceCapture)
    ......
  • OVRLipSyncEditorModule.cpp 90行目
    SoundWave->LoadingBehavior = ESoundWaveLoadingBehavior::ForceInline;」を追記します
if (SoundWave->NumChannels > 2)
{
	UE_LOG(LogTemp, Error, TEXT("Can't process %s: only mono and stereo streams are supported"), *ObjectPath);
	return false;
}
SoundWave->LoadingBehavior = ESoundWaveLoadingBehavior::ForceInline;
DecompressSoundWave(SoundWave);

auto SequenceName = FString::Printf(TEXT("%s_LipSyncSequence"), *SoundWaveAsset.AssetName.ToString());
  • OVRLipSync.Build.cs 39行目
    "AndroidPermission"」を追記します
string TargetBinariesDirectory = Path.Combine(BaseDirectory, "Binaries", PlatformString);
PublicIncludePaths.Add(Path.Combine(ThirdPartyDirectory, "Include"));
PublicDependencyModuleNames.AddRange( new string[] { "Core", "CoreUObject", "Engine", "Voice", "AndroidPermission" });
  • UEのバージョンが5.3以降の場合のみ
    OVRLipSyncEditorModule.cpp 95行目
    CreatePackage()の引数「NULL」を削除します
SoundWave->LoadingBehavior = ESoundWaveLoadingBehavior::ForceInline;
DecompressSoundWave(SoundWave);

auto SequenceName = FString::Printf(TEXT("%s_LipSyncSequence"), *SoundWaveAsset.AssetName.ToString());
auto SequencePath = FString::Printf(TEXT("%s_LipSyncSequence"), *SoundWaveAsset.PackageName.ToString());
auto SequencePackage = CreatePackage(*SequencePath);
auto Sequence = NewObject<UOVRLipSyncFrameSequence>(SequencePackage, *SequenceName, RF_Public | RF_Standalone);

ソースコードの修正後プロジェクトをビルドし、開きます。
プレビューを再生し、マイクの音声に合わせてキャラクターの口が動いていれば修正完了です。

口が動かない場合、ソースコードの修正内容か、マイク入力をご確認ください。

リップシンクの実装

プラグインの導入

Oculus Lipsyncが修正できたので、次にVRoidキャラクターのリップシンクを実装します。
新しくサードパーソンのプロジェクトを作成します。(ここではLipsyncProjectとします)

プロジェクトを作成し、UEエディタが起動したら、一度UEエディタを閉じます。

LipsyncProjectのConfigフォルダにある、「DefaultEngine.ini」の末尾に以下のマイク設定を追記します。
同じフォルダに似た名前のファイルがあるので注意。

[Voice]
bEnabled=True

[OnlineSubsystem]
bHasVoiceEnabled=False

VRoidのVRMファイルを使用するために、LipsyncProjectにVRM4Uを導入します。
VRM4U – セットアップ

OVRLipSyncDemoのPluginsフォルダにある「OVRLipSync」を、VRM4Uを配置したPluginsフォルダにコピーします。


LipsyncProjectを開き、編集→プラグイン メニューからOVRLipSyncとVRM4Uが有効になっているか確認します。

キャラクターのインポート

VRoid Studioで好きなキャラクターをVRMエクスポートし、LipsyncProjectにインポートします。
VRoid Studio

VRoid Hubではユーザーが作成した3Dキャラクターをダウンロードできますが、リップシンクに使用する表情の設定がユーザーによって異なる可能性があるため、最初はVRoid Studioからエクスポートした方が無難です。

BPの修正

BP_ThirdPersonCharacterを開きます。

MeshのSkeletal Mesh Assetをインポートしたキャラクターに変更し、コンポーネントOVRLip Sync Actorを追加します。


カメラとキャラクターを移動し、プレビュー実行時に顔が見えるようにします。

コンポーネントパラメータ
CameraBoom位置X=0,Y=0,Z=60
CameraBoomTarget Arm Length100
Mesh 回転X=0,Y=0,Z=90


BeginPlayイベントの最後にOVRLipSyncActorの「Start」ノードを追加します。

OVRLipSyncActorの「OnVisemesReady」イベントを追加します。


「OnVisemesReady」イベントに以下の処理を実装します。


OVRLipSyncは、人が話す言葉を15個の「口形素(Visemes)」と呼ばれる口の形に分解します。
この内、10~14番目の要素が日本語の母音「あ、え、い、お、う」に当たります。
上記のBPでは、口形素の10~14番目の値を、キャラクターが「あ、え、い、お、う」の音を発した際のモーフターゲットに割り当てています。

キャラクターのモーフターゲットは、スケルタルメッシュから確認できます。
VRoid Studioからエクスポートした場合、各母音を話す際のモーフターゲットは、以下のような名前になっています。


プレビュー実行すると、マイクの音声に合わせてキャラクターの口が動きます。


以上がUE5によるリップシンクの実装手順となります。
OVRLipSyncは言葉以外にも笑い声を認識することもできます。
色々カスタマイズして、より細やかな表情設定も試してみてください。

参考URL

本記事は以下のURLを参考にさせて頂きました。

Oculus Lipsync UnrealをUE5で動かす(サンプル実行編)

Oculus社のリップシンクライブラリ「Oculus LipSync ( OVRLipSync )」をUE4で使う方法について その2 (Grayちゃんでリップシンク!編)

関連記事

  1. Unreal Engine ゲーム制作体験会レポート(その①)

    2024-07-19

  2. 【UE5】MassAIで良く見る「Fragmentの複数追加」警告について(Fragment was added multiple time)

    2024-07-30

  3. Unreal Engine ゲーム制作体験会レポート(その③)

    2024-07-19

  4. 【UE5】コードまたはロードされているDLL内で標準出力を行っているとビルドが進行しなくなる

    2024-09-06

ABOUT

OX ENGINEER STUDIO

OX ENGINEER STUDIO並びにC&R CREATIVE STUDIOSの紹介サイトです。
本サイトでは、ゲーム開発や弊社スタジオに関する様々な情報を発信しています。

運営:
OX ENGEINEER STUDIO

所属:
C&R Creative Studios

カレンダー

2024年6月
 12
3456789
10111213141516
17181920212223
24252627282930
ページ上部へ戻る