はじめに
先日 v3.0.0 をリリースした uLipSync ですが、いくつか不具合修正が来ていたため修正しました。
- VRM パッケージを読み込んでいない際にエラーが出る
- VRM パッケージを両方(VRM 0.X / VRM 1.0)読み込まないとならない
- Unity 2019 でエラーが出る
- 古い Timeline アセットを読み込んでいる際にエラーが出る
本エントリでは修正についてのメモと、ついでなので改めて VRM でのセットアップ方法について解説を行いたいと思います。
最新リリース
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 を展開すると見えます。
以下のサンプルをインポートしてください。
VRM 関連パッケージのインポート
次に UniVRM のパッケージをインポートします。
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 になります。
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
というデータを作製しておく必要があります。詳しい解説は以下の記事に書いてあります。
ここでは簡単に手順だけ解説します。
BakedData の作成
まず、BakedData
を右クリックのコンテキストメニューから生成します。
Profile
と変換したい AudioClip
を選択して Bake ボタンを押します。
これで準備完了です。
コンポーネントの追加変更
事前解析済みなので、uLipSync
コンポーネントは必要ありません。このコンポーネントは削除しておきます。代わりに、uLipSyncTimelineEvent
というコンポーネントをアタッチします。
ここでは先程同様 On Lip Sync Update (LipSyncInfo) でイベントの登録を行います。
TImeline の設定
Timeline ではリップシンクをさせるための専用のトラック(uLipSync.Timeline > uLipSync Track)があります。これを追加します。
追加したトラックにはどのモデルを動かすかの設定を行うため、トラックのスロットに先程の uLipSyncTimelineEvent
を追加した GameObject をドラッグ&ドロップします。そして、トラックには先程の BakedData
をドラッグ&ドロップします。
これで動作するようになります。
アニメーションのベイク
VRM 専用のアニメーションのベイクは現在サポートできていません。
もし VRM データの口の動きが BlendShape を使ってセットアップされている場合は、uLipSyncExpressionVRM
や uLipSyncBlendShapeVRM
コンポーネントを外し、代わりに uLipSyncBlendShape
コンポーネントでリップシンクをセットアップしてください。VRM でも(BlendShape で作られたモデルなら)直接 BlendShape を使って操作が可能で、通常の仕組みを使ってリップシンクさせることができます。この上で、以下のページに書かれた手順に従ってデータを作成してください。
作成したアニメーションを使えば、Animator を使って動かしたり、通常通り Timeline にアニメーションを指定してリップシンクさせることができます。
修正についてのメモ
ここからは開発のメモなので読み飛ばしていただいて大丈夫です。
VRM パッケージ非読込み時の対応
VRM パッケージが読み込まれているかどうかは Version Defines で判別するようにしました。
読み込まれていない際は、コンポーネントは次のようにワーニング表示を行うようにしました。
Path.GetRelativePath
Unity 2019.X にて、System.Path.GetRelativePath()
がないとエラーが出るとの報告がありました。実際は Unity 2021.2 から .NET Standard 2.1 が導入されたのですが、それ以前は .NET Standard 2.0 で、ここには Path.GetRelativePath
がないためエラーとなっていました。
そこで、これを行うサブセットを追加して対応しました。以下、参考にした stackoverflow のスレッドです。
おわりに
長らく着手できていない WebGL 周りのサポートもそろそろ何とかしたいですね。。