凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

uLipSync の不具合修正(VRM / .NET Standard 2.0 関連)をしました

はじめに

先日 v3.0.0 をリリースした uLipSync ですが、いくつか不具合修正が来ていたため修正しました。

tips.hecomi.com

  • VRM パッケージを読み込んでいない際にエラーが出る
  • VRM パッケージを両方(VRM 0.X / VRM 1.0)読み込まないとならない
  • Unity 2019 でエラーが出る
  • 古い Timeline アセットを読み込んでいる際にエラーが出る

本エントリでは修正についてのメモと、ついでなので改めて VRM でのセットアップ方法について解説を行いたいと思います。

最新リリース

github.com

VRM のセットアップ方法

uLipSync のインポート

uLipSync のインポートの方法は 3 種類ありますが、お手軽なのは git URL かな?と思います(個人的なオススメは Scoped Registry 登録ですが)。VRM 関連のパッケージも同じ仕組みで入れるので、ひとまずこちらで解説します。

まず、Window > Package Manager から Package Manager ウィンドウを開き、左上の+ボタンから Add package from git URL... を選択します。

ここで https://github.com/hecomi/uLipSync.git#upm を入力します。

Add ボタンを押せば導入完了です。次にサンプルをインポートします。サンプルは、Package Manager で uLipSync を選択、右側にある Samples を展開すると見えます。

以下のサンプルをインポートしてください。

  • 00. Common
    • サンプルで使うユニティちゃん関連アセットや Profile などが含まれています
  • 04. VRM

VRM 関連パッケージのインポート

次に UniVRM のパッケージをインポートします。

github.com

VRM 1.0 の場合は以下のパッケージを git URL にて追加します。

  • com.vrmc.vrmshaders
  • com.vrmc.gltf
  • com.vrmc.vrm

VRM 0.X の場合は以下になります。

  • com.vrmc.vrmshaders
  • com.vrmc.gltf
  • com.vrmc.univrm

両バージョン使う場合は両方インポートします。

VRM のインポート

VRM は UniVRM のおかげでファイルを Unity にドラッグ&ドロップすればインポートできるようになっています。テスト用には 04. VRM に VRoid を使って作製した VRM データも含んでいますのでそちらをご使用ください。

セットアップ

VRM 1.0 の場合を解説します。サンプルシーンは 04-2. VRM 1.0 になります。

VRM に次のコンポーネントをアタッチします。

  • AudioSource
    • 口パクのもととなる音声をセットします
  • uLipSync
  • uLipSyncExpressionVRM
    • VRM の Expression を使って uLipSync の解析結果を口パクに反映します

ここでは 00. Common に含まれたユニティちゃんの音声を利用してみます。これにあった口パクを行えるよう、uLipSync コンポーネントProfile タブの中の Profile に、uLipSync-Profile-UnityChan を指定してください。

そして、口パク解析結果が実際に Expression で動作するように、Parameters タブの On Lip Sync Update (LipSyncInfo) でイベントの登録を行います。+ ボタンを押下してスロットを追加し、自分自身のゲームをオブジェクトをドラッグドロップ、プルダウンリストから uLipSyncExpressionVRM > OnLipSyncUpdate を選択します。

これで、シーンを再生するとリップシンクが動作します。

マイクを使ったセットアップ

マイクを使ってリップシンクさせたい場合は、uLipSyncMicrophone というコンポーネントを更にアタッチしてください。こちらは、指定されたマイク入力を AudioSource から再生するものになります。マイクはプルダウンリストから適切なものを選択しておいてください。

また、同時に uLipSync コンポーネントProfile タブの Profile で、別の Profile を指定します。ここでは uLipSync-Profile-Sample を指定してみましょう。Packages > uLipSync > Assets > Profiles に格納されています。

uLipSync では Profile という予め「あいうえお」といった音素の情報を登録したデータを使い、入力された音とその登録済みの音の情報を比較して、どの音に最も近いかの解析を行っています、そのため、入力される音に応じた Profile の指定が必要です。ここで指定したものはとある男性・女性の音声を登録したデータになっています(ご自身で作成することもできます、こちらは過去の解説記事または GitHub をご参照ください)。

これで実行すればマイク入力に応じた口パクを行ってくれるようになります。

タイムラインの利用方法

タイムラインを利用する場合は、予め音声を解析した BakedData というデータを作製しておく必要があります。詳しい解説は以下の記事に書いてあります。

tips.hecomi.com

ここでは簡単に手順だけ解説します。

BakedData の作成

まず、BakedData を右クリックのコンテキストメニューから生成します。

Profile と変換したい AudioClip を選択して Bake ボタンを押します。

これで準備完了です。

コンポーネントの追加変更

事前解析済みなので、uLipSync コンポーネントは必要ありません。このコンポーネントは削除しておきます。代わりに、uLipSyncTimelineEvent というコンポーネントをアタッチします。

ここでは先程同様 On Lip Sync Update (LipSyncInfo) でイベントの登録を行います。

TImeline の設定

Timeline ではリップシンクをさせるための専用のトラック(uLipSync.Timeline > uLipSync Track)があります。これを追加します。

追加したトラックにはどのモデルを動かすかの設定を行うため、トラックのスロットに先程の uLipSyncTimelineEvent を追加した GameObject をドラッグ&ドロップします。そして、トラックには先程の BakedDataドラッグ&ドロップします。

これで動作するようになります。

アニメーションのベイク

VRM 専用のアニメーションのベイクは現在サポートできていません。

もし VRM データの口の動きが BlendShape を使ってセットアップされている場合は、uLipSyncExpressionVRMuLipSyncBlendShapeVRM コンポーネントを外し、代わりに uLipSyncBlendShape コンポーネントリップシンクをセットアップしてください。VRM でも(BlendShape で作られたモデルなら)直接 BlendShape を使って操作が可能で、通常の仕組みを使ってリップシンクさせることができます。この上で、以下のページに書かれた手順に従ってデータを作成してください。

tips.hecomi.com

作成したアニメーションを使えば、Animator を使って動かしたり、通常通り Timeline にアニメーションを指定してリップシンクさせることができます。

修正についてのメモ

ここからは開発のメモなので読み飛ばしていただいて大丈夫です。

VRM パッケージ非読込み時の対応

VRM パッケージが読み込まれているかどうかは Version Defines で判別するようにしました。

docs.unity3d.com

読み込まれていない際は、コンポーネントは次のようにワーニング表示を行うようにしました。

Path.GetRelativePath

Unity 2019.X にて、System.Path.GetRelativePath() がないとエラーが出るとの報告がありました。実際は Unity 2021.2 から .NET Standard 2.1 が導入されたのですが、それ以前は .NET Standard 2.0 で、ここには Path.GetRelativePath がないためエラーとなっていました。

そこで、これを行うサブセットを追加して対応しました。以下、参考にした stackoverflow のスレッドです。

stackoverflow.com

おわりに

長らく着手できていない WebGL 周りのサポートもそろそろ何とかしたいですね。。