凹みTips

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

uLipSync v3.0.0 をリリースしました

はじめに

Unity でキャラクタのリップシンクを行うことのできる uLipSync v3.0.0 をリリースしました。

github.com

本エントリではアップデートの内容について解説していきます。

MFCC の計算方法修正

一番大きなアップデートは MFCC の計算方法の改善です。これに関しては前回のブログ記事で解説しました。

tips.hecomi.com

端的に言うと、これまでの MFCC は計算方法が間違っていたため、正しくなるよう世の中一般のライブラリによる値と比較しながら修正を行った、という形です。ただし精度が劇的に上がった、というわけではありませんでした。。以前もそれっぽい特徴量を得られており判別は出来ていたようです。

また、これまでは 12 個ある MFCC の比較は各係数の差分の絶対値を足した L1 距離(マンハッタン距離)のみでしたが、新たに Profile で指定できるオプションとして L2 距離(ユークリッド距離)とコサイン類似度を追加しました。またこれらの比較の際、各特徴量を標準化するオプション(Use Standardization)も追加しました。

おすすめはどれか、と聞かれるとなかなか難しく...、比較関数もひとまずものすごい大きな差を生むような感じではありませんし、標準化を行うと大きい差分を生む特徴量に引っ張られないようになりますが、一方でノイズを生むような係数が合った際にそれにも引っ張られてしまいます。これ以上精度を上げるにはもっと単純な計算での比較ではなくて何かしらの分類をしないとですね。いずれ勉強のためにチャレンジしてみます。

併せてデフォルトのパラメタも調整を行い、付属のサンプルの Profile もそれに合わせてキャリブレーションしておきました。

VRM 1.0 のサンプル追加

VRoid が v1.20.0 から VRM1.0 のエクスポートに対応したので、サンプルを VRM1.0 にアップグレードしてみました(従来の VRM0.X 向けのコンポーネントも従来どおり付属しています)。mkc1370 さんに頂いたプルリクエストで VRM1.0 の Expression 対応をしているため、簡単なセットアップでリップシンクさせることが出来ます。

ランタイムの UI の追加

ランタイムでプロファイルを調整できる UI の仕組みを整えてサンプルを追加しました。

あくまでサンプルなので見た目はアレですが、シンプルな実装にしましたので、サンプルを参考に独自の UI も作成できると思います。もともと JSON へのプロファイルのセーブおよびロードは出来ていましたが、このサンプルのように行えば配布ソフトなどでもユーザに適宜プロファイルの調整をしてもらえるのではないかなと思います。

エディタのパフォーマンス改善

前項のランタイムの UI の追加のために、MFCC のテクスチャ生成機構が必要になりました。以前はエディタ拡張をゴリゴリして色塗り矩形を組み合わせながらエディタ上の UI を組み立てていたのですが、この仕組みを利用してエディタ側の更新も行いました。内部的には、uLipSync.TextureCreator というクラスを作成し、ここに対して CreateMfccTexture(Texture2D tex, MfccData mfcc, float min, float max) という関数を呼ぶとテクスチャが生成されるというものです。中では Burst の効いたテクスチャ生成ジョブが走る形になってますが、Texture2D を即時出力したいのでジョブはスケジュールするのではなく即時実行・回収を行う形になってます(なのでもう少し改善の余地はあります)。これを使うようにした結果、エディタのパフォーマンスがそこそこ向上しました。これまでは Runtime Information という現在の認識結果を表示するタブを開いている場合、かなり FPS 低下が見られましたが、現状はそこそこ大丈夫くらいになりました。とはいえ仕組み的に毎フレーム GUI の更新要求を出すような仕組みなので、依然として重くはあります。

マイクの遅延改善

ポーズから復帰したときや、なにか重い処理が挟まったタイミングで uLipSyncMicrophone によるマイク音声が遅れてしまう、という現象が起こっていました。これに対処するために以下のプルリクを頂きました。

github.com

頂いたものをもとに更に改善を行ったものが現在含まれています。

Advanced を展開すると Latency ToleranceBuffer Time というものがあります。Latency Tolerance はこれ以上マイクが遅れた場合に再同期処理を行うものです。Buffer Time はマイクを出力するまでにバッファリングを行う時間で、小さすぎるとプチプチしてしまうため、ある程度の時間をセットする必要があります(デフォルトは 30 msec)。

uLipSyncAnimator

以前追加した機能である uLipSyncAnimator に最初のパラメタが動作しない、というバグが有ったため修正しました。

github.com

確かにリリース時のブログを見てみると最初の要素が反応していませんでした...

tips.hecomi.com

おわりに

今回は計算方法の修正およびそれに伴う Profile の修正という大きな更新をしたため、メジャーバージョンアップを行いました。ただ、まだ良い性能を出すためには道半ばな感じもあるので、今後も地道に改善していきます。ユーザビリティ方面でも要求がありましたら Twitter かなにかでご連絡ください。