はじめに
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を使用しています。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-4-1024x271.png)
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-5.png)
「Generate Visual Studio project files」が見つからない場合は、「その他のオプションを表示」を選択してください。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-7.png)
ソースコードの修正
ソリューションファイル「OVRLipSyncDemo.sln」をVSで開き、ソースコードを修正します。
ソースコードは、以下の画像の通りGame→Plugins→OVRLipSync→Source→OVRLipSyncフォルダにあります。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-18.png)
- 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);
ソースコードの修正後プロジェクトをビルドし、開きます。
プレビューを再生し、マイクの音声に合わせてキャラクターの口が動いていれば修正完了です。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-6-1024x541.png)
口が動かない場合、ソースコードの修正内容か、マイク入力をご確認ください。
リップシンクの実装
プラグインの導入
Oculus Lipsyncが修正できたので、次にVRoidキャラクターのリップシンクを実装します。
新しくサードパーソンのプロジェクトを作成します。(ここではLipsyncProjectとします)
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-11-1024x738.png)
プロジェクトを作成し、UEエディタが起動したら、一度UEエディタを閉じます。
LipsyncProjectのConfigフォルダにある、「DefaultEngine.ini」の末尾に以下のマイク設定を追記します。
同じフォルダに似た名前のファイルがあるので注意。
[Voice] bEnabled=True [OnlineSubsystem] bHasVoiceEnabled=False
VRoidのVRMファイルを使用するために、LipsyncProjectにVRM4Uを導入します。
VRM4U – セットアップ
OVRLipSyncDemoのPluginsフォルダにある「OVRLipSync」を、VRM4Uを配置したPluginsフォルダにコピーします。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-13.png)
LipsyncProjectを開き、編集→プラグイン メニューからOVRLipSyncとVRM4Uが有効になっているか確認します。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-14.png)
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-15-1024x216.png)
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-16-1024x314.png)
キャラクターのインポート
VRoid Studioで好きなキャラクターをVRMエクスポートし、LipsyncProjectにインポートします。
VRoid Studio
VRoid Hubではユーザーが作成した3Dキャラクターをダウンロードできますが、リップシンクに使用する表情の設定がユーザーによって異なる可能性があるため、最初はVRoid Studioからエクスポートした方が無難です。
BPの修正
BP_ThirdPersonCharacterを開きます。
MeshのSkeletal Mesh Assetをインポートしたキャラクターに変更し、コンポーネントOVRLip Sync Actorを追加します。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-31-1024x424.png)
カメラとキャラクターを移動し、プレビュー実行時に顔が見えるようにします。
コンポーネント | パラメータ | 値 |
---|---|---|
CameraBoom | 位置 | X=0,Y=0,Z=60 |
CameraBoom | Target Arm Length | 100 |
Mesh | 回転 | X=0,Y=0,Z=90 |
BeginPlayイベントの最後にOVRLipSyncActorの「Start」ノードを追加します。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-24.png)
OVRLipSyncActorの「OnVisemesReady」イベントを追加します。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-25.png)
「OnVisemesReady」イベントに以下の処理を実装します。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-29-1024x539.png)
OVRLipSyncは、人が話す言葉を15個の「口形素(Visemes)」と呼ばれる口の形に分解します。
この内、10~14番目の要素が日本語の母音「あ、え、い、お、う」に当たります。
上記のBPでは、口形素の10~14番目の値を、キャラクターが「あ、え、い、お、う」の音を発した際のモーフターゲットに割り当てています。
キャラクターのモーフターゲットは、スケルタルメッシュから確認できます。
VRoid Studioからエクスポートした場合、各母音を話す際のモーフターゲットは、以下のような名前になっています。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-27.png)
プレビュー実行すると、マイクの音声に合わせてキャラクターの口が動きます。
![](http://ox.crdg.jp/tech/wp-content/uploads/2024/06/image-30.png)
以上がUE5によるリップシンクの実装手順となります。
OVRLipSyncは言葉以外にも笑い声を認識することもできます。
色々カスタマイズして、より細やかな表情設定も試してみてください。
参考URL
本記事は以下のURLを参考にさせて頂きました。
Oculus Lipsync UnrealをUE5で動かす(サンプル実行編)
Oculus社のリップシンクライブラリ「Oculus LipSync ( OVRLipSync )」をUE4で使う方法について その2 (Grayちゃんでリップシンク!編)