Unityで口パクをつけられるプラグイン「uLipSync」のご紹介
はじめに
Unityゲーム開発者ギルド Advent Calendar 2023の5日目の記事です。
普段は、会社員としてゲーム開発をしている、えれめん と申します。
今回は、Unityでキャラモデルに口パクをつけられる無料のプラグイン「uLipSync」をご紹介します。
私も過去のUnity1Weekで共同制作した「Gift×Stage」で、キャラの歌唱の口パクをつけるのに使用させていただいたことがあります。
口パク(リップシンク)方式の種類
uLipSyncを説明するに先立ちまして、簡単に口パク方式の種類を挙げておきます。
口パクをつける方式としては以下のようなものがあります。
- 実際の口の形状をカメラで撮影し、その形を認識してキャラモデルに反映する
- 話したテキスト内容を元に、口の形状を決める
- 音声を元に、口の形状を推定する
- 音量を口の形状に対応させる
\textcolor{red}{音色を解析して、口の形状を推定する}
今回ご紹介するuLipSyncは、上記のうち音色を解析して、口の形状を推定する方法を用いています。
「音色を解析して口の形状を推定する」とはどういうことか
人間の声は、声帯での振動が声道を通り、口から発せられることで他者に聞こえます。
口の形状によって、声道の形も変わり、音の響き方も変わります。
音声をケプストラム分析によって、声帯振動成分と声道情報成分に分解し、
このうち声道情報成分が、口の形状に対応することを利用して、リップシンクをつけていきます。
口の形状(/a/、/i/、/u/、/e/、/o/など)ごとに、声道情報をあらかじめプロファイルとして持っておき、その情報と、ケプストラム分析によって得たある時間の声道情報成分を比較して、最も近い成分を持っていた口の形状をそのときの口の形状として推定します。
(https://abcpedia.acoustics.jp/bs13_q4.pdf より引用)
uLipSyncとは
uLipSyncは、音声から音色の特徴量の一つであるMFCC(メル周波数ケプストラム係数)を求め、それを元に口の形状を推定し、リップシンクの情報を生成・利用できる無料のプラグインです。
凹(@hecomi)さんが開発を行っており、約3年前(2021年1月)にv0.0.1がリリースされ、それから継続的にアップデートが行われています(いつもありがとうございます)。今年の4月には、さらに口パクの精度が向上したv3.0.0がリリースされました(執筆時点の最新バージョンはv3.0.2)。
Unity Package Manager経由でインストールして、手軽に利用することができます。uLipSyncはUnity.Burst
とUnity.Mathematics
が必要なので、こちらもインストールを行います。
uLipSyncでは、事前解析、リアルタイム解析のいずれの方法でもリップシンクをさせることができます。
事前解析
事前解析は、あらかじめ音声が決まっている場合(収録済の音声など)に有効です。その音声について、対応するMFCCの時間変化を事前計算しておき、予めキャリブレーションして作成しておいたプロファイルと照らし合わせて一番近い口の形状を推定してBakedData
として持っておきます。それをリップシンクを行うタイミングで、データを読み出し、モデルのブレンドシェイプへと反映させます。
事前解析のメカニズム(https://github.com/hecomi/uLipSync より引用)
事前計算したデータはタイムラインと連携させることも可能で、音声トラックと同じタイミングに配置することでリップシンクさせることができます。
タイムラインとの連携(https://github.com/hecomi/uLipSync より引用)
過去のUnity1Weekで共同制作した「Gift×Stage」ではこの方法を用いています。
リアルタイム解析
リアルタイム解析は、その名の通り、リアルタイムにマイクなどで入力された音声を使って、モデルの口パクに反映させるといった場合に有効です。
リアルタイム解析のメカニズム(https://github.com/hecomi/uLipSync より引用)
実例
以下は私が作成した、ノベルゲームを想定したリップシンクの例です。「宴」と呼ばれるUnity用ビジュアルノベルゲームツールを拡張し、事前解析したデータを用いてリップシンクするようにしてみました。
(v2.0.1時点のuLipSyncを適用したデモ動画であり、最新のv3.0.2ではさらなるリップシンクの精度向上が期待できます)
おわりに
今回は、Unityで口パクをつけられる無料のプラグイン「uLipSync」をご紹介しました。主にuLipSyncの原理部分の説明になりました。
本記事では、あまり使用方法について触れませんでしたが、開発者の凹さんご本人がブログにて丁寧に説明してくださっているので、ぜひ皆さんもそれを参考に使ってみてください!
Discussion