ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

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

はじめに

この記事はこちらの記事の続きです
pafuhana1213.hatenablog.com

前回はOVRLipSyncのサンプルについて解説しました。しかし、サンプルに含まれるモデルはOVRLipSyncの仕様に超特化したものなので、そのまま他モデルに適用することはできません。
そこで、他モデルでOVRLipSyncを使うにはどうすればいいのかについて解説します。なお、今回の解説では皆大好きなGrayちゃんのモデル・ボイスをお借りしています。
3Dモデル:Grayちゃんモデルデータ – rarilog
ボイス:Grayちゃんボイスが、より扱いやすくなりました - Grayちゃん OFFICIAL WEBSITE


OVRLipSyncプラグインの導入

まずは公式サンプルプロジェクト( OVRLipSyncDemo )に含まれるOVRLipSyncプラグインを別プロジェクトで移植します。今回はGrayちゃんの3Dモデルに含まれるGrayChanProjectに移植します。

1. OVRLipSyncプラグインをコピペ

OVRLipSyncDemoにある Pluginsフォルダ を GrayChanProjectのルートフォルダ(GrayChanProject.uprojectがあるフォルダ)にコピペします

2. マイクを使うために設定追加

GrayChanProjectのConfigフォルダにある DefaultEngine.ini に 以下の文字列を追加します。これでマイクが使用可能になります。なお、事前に録音した音声しか使わない場合はこの設定追加は不要です。

[Voice]
bEnabled=True

[OnlineSubsystem]
bHasVoiceEnabled=False

3. OVRLipSyncプラグインが有効になっているか確認

GrayChanProjectを開き、PluginsからOVRLipSyncプラグインが有効になっているか確認します。
f:id:pafuhana1213:20181126001832p:plain

なお、OVRLipSyncプラグインは "EnabledByDefault" : true なのでデフォルトで有効になっているはずです。ですので、この確認はあくまで念の為だったりします。
( 気になる方は、OVRLipSync.uplugin をテキストエディタで開いてみましょう! )

Grayちゃんボイスで口パクしてみる

今回はマイク音声ではなく、事前に収録された音声であるGrayちゃんボイスを使ってみます。マイクを使用する場合でもBPによる実装内容は殆ど変わりないからです。準備周りはサンプルからコピペしましょう!

音声データのインポート・変換

まずは使用する音声データをUE4にインポートし、右クリックメニューからOVRLipSync Frame Sequenceを生成します。(詳細は前回の記事で)
f:id:pafuhana1213:20181126002349p:plain

必要なコンポーネントの追加・セットアップ

次に、ThirdPersonCharacterにOVRLipSyncPlaybackActorコンポーネントとAudioコンポーネントを追加します。
f:id:pafuhana1213:20181126002526p:plain

そして、OVRLipSyncPlaybackActorコンポーネントには先程作成したOVRLipSync Frame Sequenceを指定します。
f:id:pafuhana1213:20181126002853p:plain
また、Audioコンポーネントにはインポートした音声データ(SoundWave)を指定し、さらに勝手に自動再生されないように Auto ActivateをOFFにしておきます。
f:id:pafuhana1213:20181126002920p:plain

口パク(モーフターゲット)制御の実装

最後に、OVRLipSyncが解析した口パクをGrayちゃんモデルに渡す処理をBPで実装します。

まずは、ボイスとOVRLipSyncによる解析を開始する処理を書きます。今回は簡単に 1キー を押したら処理を開始するようにします。
f:id:pafuhana1213:20181126004946p:plain

次に、OVRLipSyncによる解析結果が更新される On Visemes Ready イベントにてGrayちゃんのモーフターゲットを制御する処理を実行します。

前回の記事で紹介した通り、OVRLipSyncはVisemsという音声解析を元にした口の形状パラメータの配列を返してくれます。
公式ドキュメント:Viseme Reference

そして、今回使用するGrayちゃんモデルには母音( a, i, u, e, o )用のモーフターゲットが用意されています。
f:id:pafuhana1213:20181126003856p:plain

ですので、Visemsの10番目から15番目のパラメータを各Visemに対応するモーフターゲットに渡す形になります。ちなみに、パラメータの順番はこんな感じ。
f:id:pafuhana1213:20181126004431p:plain

上記のように配列から一つずつ値を取得する感じで実装しても良いのですが、せっかくなのでシンプルに実装してみました!
f:id:pafuhana1213:20181126011400p:plain
コピペ用: https://blueprintue.com/blueprint/p-z2c6ys/

これで準備完了です。実行して 1キー を押すと 「はじめに」で載せた動画のように音声に合わせて口パクします!

最後に

これでサンプル以外のモデルでもOVRLipSyncを用いた口パクができるようになりました。しかし、改良の余地はまだまだまだまだあります。例えば、口をもっと大きく開くように補正処理をかけたり…
f:id:pafuhana1213:20181126010038p:plain

アニメ的な表現を再現するために更新間隔を調整したりなどなど…色々あります!(ググると色々…モニョモニョ…)
是非色々カスタムしてみてください!

補足

シーケンスレコーダーによるベイク処理を使って、OVRLipSyncによる口パクをアニメーションアセット化したい方がそれなりにいるかと思います。

www.slideshare.net
(シーケンスレコーダーについては、126ページ以降)

しかし、Set Morph Targetでモーフターゲットを制御する場合はベイク処理の対象外になります。そのため、ベイク処理の対象にするためには、Animation BPのAnim Graphにて Modify Curveノードを使って各モーフターゲットの値を制御する必要があります。ご注意下さいまし。
f:id:pafuhana1213:20181126011012p:plain

おわり

Oculus社のリップシンクライブラリ「Oculus LipSync ( OVRLipSync )」をUE4で使う方法について その1 (サンプル解説編)

はじめに

2018/10/14のアンリアルフェスにて、UE4VTuberをする方法について講演しました。

www.slideshare.net

その中で「Oculus LipSyncはいいぞ!」ムーブをキメました(p94以降)が…具体的にどのように導入・使用するのかについて触れなかったので記事にまとめようと思います。

Oculus LipSyncについて

Oculus LipSync ( 以下、OVRLipSync ) はOculus社が提供しているリップシンク(口パク)ライブラリで、2018/10/5にリリースされた v1.30.0 でUE4に対応しました。そして、2018/11現在(v.1.30.0)ではUE4.20に対応しており、サンプルプロジェクトも用意されています(v.1.30.0、UE4.21でも一応動きました)。

このライブラリを使うことで、マイク音声または事前に収録した音声データ( SoundWavアセット )からリップシンク情報を取得することができます。つまり、セリフに合わせたキャラクタの口パクアニメーションを簡単に作ることができます!
( 表情用のMorph TargetをキャラのSkeletalMeshに用意する必要はありますが… )

サンプルでは、OVRLipSyncが検出した口形素( Viseme )をSkeletal MeshのMorph Targetに渡すBPが用意されています。Visemeは音声から唇の形状を分類したもので、全部で15パターン用意されています。( ただ一般的によく用いられるのは母音(a, i , u, e, o)なので、全てのパターンを使い分ける必要はないかと思います。)
f:id:pafuhana1213:20181116232919g:plain
Visemeに関するドキュメント:Viseme Reference

以降は、サンプルに含まれるBPについて簡単にですが解説します。

OC5におけるOVRLipSyncに関する講演

www.youtube.com

続きを読む

Windows + iOS開発で必要な証明書・プロビジョニングファイルを削除する方法

はじめに

Windows上からMacをリモートで使ってiOSパッケージを作成するリモートビルドという機能がUE4にはあります。
そのリモートビルドが急に上手くいかなくなった時とかに試す証明書・プロビジョニングファイルの削除を
何度も何度も忘れるのでメモ。なお、自己責任でお願いします

Windows上での証明書・プロビジョニングファイルの作成手順
Unreal Engine | iOS クイックスタート

リモートビルドについて
Unreal Engine | Windows で iOS をビルドする

プロビジョニングファイルの削除

"C:\Users\\AppData\Local\Apple Computer\MobileDevice\Provisioning Profiles"
のファイルを全削除

証明書の削除

Win+Rを押した後に、certmgr.msc と入力・実行
f:id:pafuhana1213:20181019112922p:plain

Certificates->Personal->Certificates にある iPhone Developer :~ を全削除
f:id:pafuhana1213:20181019113135p:plain

以上

UE4 と Ikinema Orionで遊んでみた その1 <ソフト購入 + Vive Tracker固定用機材の購入 編>

はじめに

突然ですが、UE4VTuberムーブをキメることになったので、早速Ikinema Orionで遊び始めました!凄く楽しいです!!!

せっかくなので、メモ代わりに記事書いていきます。
今回はIkinema Orionの紹介と、Orionを使う上で必要なVive Trackerの購入、固定方法について説明します。

続きを読む

Vive Trackerを一定数繋いだ状態でUE4を起動するとクラッシュする不具合の修正方法について (UE4.21で正式修正予定)

はじめに

Vive Trackerを一定数以上繋いだ状態でUE4を起動するとクラッシュする、という不具合が報告されています… そこそこ本気でVTuberする上でこれは辛いので、修正方法を共有します…修正箇所は凄く少ないので対応コストは少ないです。
正式に入るのはUE4.21を予定しています。

関連issue
https://issues.unrealengine.com/issue/UE-54387
https://issues.unrealengine.com/issue/UE-63579 (申請が通れば公開されます)

修正内容

"\Engine\Plugins\Runtime\Steam\SteamVR\Source\SteamVRController\Private\SteamVRController.cpp"

30行目付近の MAX_TRACKED_DEVICES をコメントアウト

//#define MAX_TRACKED_DEVICES (int32)EControllerHand::Special_9 - (int32)EControllerHand::Left + 1

115行目付近のMaxControllers に入れる値を変更

/** Total number of motion controllers we'll support */
//static const int32 MaxControllers = MaxUnrealControllers * CONTROLLERS_PER_PLAYER;

// NOTE: This used to be MaxUnrealControllers * CONTROLLERS_PER_PLAYER, but we needed to support many more trackers than that
static const int32 MaxControllers = vr::k_unMaxTrackedDeviceCount;

Github

#jira UE-63579 Assert when having too many VR devices
Increase max controllers to support more.
https://github.com/EpicGames/UnrealEngine/commit/01c783a907cffba11905dc8f15823b29d2b451d7


もしこの対応を入れてもクラッシュする場合はご連絡ください…

Frame Grabber機能を使って、レンダリング結果(フレームバッファ)をテクスチャ化する方法について

はじめに

ゲーム中に今画面に映っている内容をテクスチャ化したいケース、色々あると思います!
バトル画面への遷移演出(画面がパリーンと割れたり、ねじ曲がったり…)で使ったり、セーブ画面でのサムネイルだったり…などなど

上記のようなことをしたい場合、SceneCapture2DアクターやSceneCaptureComponent2Dを使うのが一般的です。
api.unrealengine.com

しかし、SceneCapture系は同じ内容をもう一度描画する必要があるため、かなりの処理負荷が発生します…。そのため、画面をキャプチャしたタイミングでフレームレートが急激に低下し、カクつきが発生してしまう可能性があります。
少し前のバージョンから描画対象のアクターを限定できたり、使用するポストプロセスを制限することは可能になりました。それらを駆使すれば負荷は抑えられますが、見た目が元の描画結果と異なってしまうため、やりたかった演出とは程遠いものになっていまう可能性が出てきます。
f:id:pafuhana1213:20180826235049p:plain

近い機能としてスクリーンショット機能があります。しかし、これはテクスチャアセットではなく .pngファイルで出力するため、ゲーム中で使用するのは少し面倒です。処理負荷もそこそこあります。
api.unrealengine.com
pafuhana1213.hatenablog.com

Frame Grabber

そこで今回ご紹介するのがFrame Grabber機能です!
api.unrealengine.com

この機能を使えば、描画結果(フレームバッファ)から直接テクスチャアセットを作成することが可能です!そのため、SceneCapture系のようにもう一度描画する必要がないため、処理負荷を大幅に抑えることが可能です!さらに、ポストプロセス適用後の絵をキャプチャできるので、SceneCapture系であった微妙な色味の違いも回避できる(はず)です!

Frame Grabberを用いたサンプル

ただ…C++が必要になったりで…少し使うのが面倒なので…
今回久々にサンプルを用意しました!
github.com
f:id:pafuhana1213:20180827000404p:plain

  • 描画結果をテクスチャ化して、Materialに渡すだけの簡単なサンプルです
  • 1キーを押すとキャプチャ開始します(Level BP参照)
  • 詳細はFrameGrabberActor.cpp / hをご確認くださいまし。
  • UE4.20.2 + PC環境で動作確認済みです。(たぶん、UE4.18, 4.19でも動くはず)
    • Androidでは動作しないため、glReadPixels(RHIReadSurfaceData )を使用する必要があるとのこと
  • 用途に応じて改造すること推奨。雑実装なので…

注意点としましては、UIも含めた描画結果がテクスチャ化されます。これはFrame Grabberの仕様です…。UIを含まない描画結果、つまりポストプロセス適用直後のフレームバッファをキャプチャできるようにするとは聞いています…ご期待下さい…!
(もしお仕事などの関係で早くほしいという方は…ご一報くださいまし)

ではでは~

「出張ヒストリア! ゲーム開発勉強会2018」にてUE4のポストプロセスに関する講演をしました!

atnd.org

2018/8/5に開催された「出張ヒストリア! ゲーム開発勉強会2018」にて、UE4のポストプロセスの使い方・各機能の紹介について講演しました!

www.slideshare.net

ぷちコンなどで「ポストプロセスがデフォルト設定のままでもったいないなぁ」と思うことがしばしばあり、どこかのタイミングで話したいとずっと思っていたので、講演の場を頂いたヒストリアさんには本当に感謝感謝です。今回時間の関係で話さなかったポストプロセスマテリアルについては別の機会で話せたらなぁと思ってます(スライド作るの大変だろうなぁ…(;´∀`))。

この資料が少しでも作品作りの役に立てば幸いです。ではでは~。

(今後は講演スライドを公開したらtwitterだけでなくブログでも書こうと思います。感想や補足など入れつつ…い、いや、決して、更新頻度を、楽に、あげようと、思っている、わけでは…ゴニョゴノニョ)