凹みTips

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

A.I.VOICE for GAMES に uLipSync 連携機能が追加されました

はじめに

このたび、株式会社エーアイ様の提供する A.I.VOICE for GAMESuLipSync 連携の機能を追加いただきました!

本記事では、実際に使用してる流れや仕組みの解説を行いたいと思います。

デモ

セリフやパラメタを入力して Apply すると、自動的に AudioClip とともにリップシンクデータ(Baked Data)が生成されるため、これを uLipSync へセットすることでリップシンクが実現できます。A.I.VOICE を導入していなくてもユニティちゃん(© UTJ/UCL)の声を利用することができます。

A.I.VOICE for GAMES の紹介

aivoice.jp

A.I.VOICE for GAMES は A.I.VOICE と連携し、ゲーム開発環境上で簡単に音声合成を行い、それらを直ぐにアセットとして使用できるようにしてくれるプラグインとなっています。商用利用の場合はライセンス料を支払う必要がありますが、個人の非営利目的であれば規約の範囲内で無料で使用することができます。

形式としてはエディタ拡張となっており、エディタ上の UI で、セリフや抑揚やテンションなどのパラメタを管理するオブジェクトから AudioClip を自動生成してくれます。また CSV からの一括音声生成も可能となっています。

機能一覧については公式のページをご参照ください。

aivoice.jp

環境

  • Windows 10
  • Unity 2022.3.26f1(執筆時点での最新の LTS)

なお現在は Windows のみでの動作となっており、Mac では動作しませんでしたのでご注意ください。

インストール

以下の公式ページにてインストール方法が提示されています。

aivoice.jp

導入方法を解説されている公式動画もあります。

www.youtube.com

ここでは画像も交えながら順に見ていきたいと思います。

A.I.VOICE for GAMES のダウンロード

まず規約を確認し、AIVOICEforGAMES_Unity.zip をダウンロード、展開、そして展開したディレクトリをどこか適当な場所においておきます。

aivoice.jp

このダウンロードして配置したディレクトリはパッケージの構造となっています。そのため Package Manager より取り込むことができる形です。

私は自身の開発パッケージは npmjs へとアップロードしてしまっていますが、こういった規約の同意ボタン押下を経てダウンロードする形ですと、どこかのサーバへ上げるのは権利的に難しいため、一旦ローカルへとダウンロードしたデータを自身のプロジェクトへと取り込む方式となっているのだと思われます。

依存関係のあるパッケージの導入

A.I.VOICE for GAMES は CsvHelper というパッケージに依存していますので、こちらをまず導入する必要があります(CSV からのセリフ一括読み込みなどで使用されているようです)。A.I.VOICE for GAMES を組み込みたい Unity のプロジェクトを開き、Window > Package Manager で Package Manager を開きます。

次に、このメニューから Project Settings > Package Manager を表示します(Project Settings は Edit からも開けます)。

ここで、次の Scoped Registry を登録します。

  • Name: Unity NuGet
  • URL: https://unitynuget-registry.azurewebsites.net
  • Scope(s): org.nuget

ついでに、後で uLipSync も利用するので次のように私の URL も登録しておいてみてください。

  • Name: hecomi (ここは任意の文字列で大丈夫です)
  • URL: https://registry.npmjs.com
  • Scope(s): com.hecomi

Package Manager に戻って Packages: My Registries を選び登録したスコープのレジストリを表示します。右上の検索窓から CsvHelper と入力して CsvHelper (NuGet) を探し、Install しましょう。

同様に uLipSync も導入しておきます。

A.I.VOICE for GAMES の取り込み

次に先ほどダウンロードした A.I.VOICE for GAMES を取り込みます。Package ManagerAdd package from disc... を選択します。

ここであらかじめ展開してあるディレクトリ内に含まれる package.json を選びます。

これで導入完了です。

A.I.VOICE for GAMES を使ってみる

Assets ウィンドウでの右クリックメニューに A.I.VOICE for GAMES が追加されるようになります。

Create AIVoiceObject を選択すると、次のように AIVoiceObject.aivoice ファイル)と AudioClip が作成されます。

ここで言葉やパラメタを調整します。話者はデフォルトではユニティちゃんのみ利用することができます。A.I.VOICE を導入することで他のキャラクタの音声も利用可能なようです。

そして、プレイボタンを押すと瞬時に音声が作成され、設定したセリフを設定したパラメタで読み上げてくれます。そしてこのタイミングで AudioClip へのデータの書き込みも行われます。

このように合成音声管理オブジェクトと AudioClip の生成を担うエディタ拡張の形となっているため、AudioClip にて音声を再生しているプロジェクトであれば、それぞれのプロジェクトにおけるセリフを喋らせる仕組みに合わせて簡単に組み込むことが可能なようになっています。

uLipSync との連携を試してみる

uLipSync 自体または uLipSync の Bake 機能をご存じない方は、以下の記事をご参照ください。

tips.hecomi.com

uLipSync の準備

まず下準備としてユニティちゃんを表示しましょう。Package Manager で uLipSync を選択し、Samples というタブから 00. Common05. Bake を Import します。

インポートしてできた 05. Bake ディレクトリの中に同名の 05. Bake シーンがありますのでこれを開いてください(なお、ビルトインパイプラインを想定しています)。

シーンを実行すると AudioClip の再生とともに口パクします。unitychan_dynamic を選択して Inspector で一番下の方にある uLipSyncBakedDataPlayer コンポーネントの UI を見ると、Baked Data というものがセットされています。この中には、再生したい AudioClip の参照とともに事前計算した音素の割合データが含まれています。これを音声の再生に合わせて参照しながら BlendShape を動かしている、というのが基本的な仕組みとなります。再度再生したい場合は Play ボタンを押すと確認できます。

A.I.VOICE for GAMES 生成の Baked Data を使用してみる

A.I.VOICE for GAMES で Baked Data を生成するには設定をする必要があります。まず Preferences を開きます(Edit メニューからも開けます)。

ここで uLipSync との連携機能を使用 にチェックを入れます。

これで以後作成される AIVoiceObject では BakedData も同時に生成されるようになります(緑色の音声波形アイコンのオブジェクト)。すでに生成済みのものに対して作成したい場合は、全セリフのリップシンクデータを生成 を押下すると全ての作成済みデータに対して BakedData が生成されます(Please set Profile. とワーニングが表示されていますが、これはそのままで大丈夫です)。

この生成された BakedData を先程のuLipSyncBakedDataPlayer コンポーネントにセットします。Time Offset は 0.0 にしておくのをオススメします。そして再生すると...

リップシンクできました!

仕組みについて

今回、A.I.VOICE for GAMES に対応いただいている仕組みについて解説します。uLipSync では次のように、AudioClip に含まれる波形データを事前に解析して時系列に並んだ音素(あいうえお等)情報を書き出した BakedData という形式のアセットを生成できます。

この中には、生成元の AudioClip の Profile(どういう声の「あいうえお」かを事前にキャリブレーションしたデータ)の参照も含まれています。

A.I.VOICE は音声合成を行うものであり、内部的には既に時系列の音素データを与り知る状態となっています。つまり、わざわざ音声波形を解析せずとも、既にあるその音素データをリップシンクに使えれば良い、ということになります。そのため、この解析部分を飛ばし、直接 BakedData を生成してくれます。

そのため、生成したデータには Profile が指定されていません。ただ、Profile が指定されていないときは UI 上で警告を出してしまっているため、今後修正しておきます。

なお、uLipSync では BakedData を使うとアニメーション生成も可能ですので、Timeline などで演出を組み立てている際はこちらもご利用ください(BakedData のままでも一応 Timeline 再生できるようになっています)。

tips.hecomi.com

おわりに

初めて試させていただきましたが、A.I.VOICE for GAMES を使うととてもお手軽に音声を生成でき素晴らしい機能だと思います。ゲームによってはリップシンクも大事になることもあると思いますので、そのような際に私の方の仕組みも貢献できると幸いです。