AI / ML Technology

Unityで対話できるAIキャラクターを作る(2)

AI / ML
スポンサーリンク

どうも、前回に引き続き「AIで対話できるキャラづくり」を記事にしていきます。
今回は合成音声の使い方に入ります。

合成音声の生成

そもそも、合成音声とは「人工的に生成された人の声」であり、ライブ配信や事前に録音などをすることなく、まるで人が話しているような音声を出力することを目的としています。初音ミクをはじめとしたVOCALOIDや「ゆっくりボイス」でおなじみのAquesTalkもその一種です。

音声合成も数多くのソフトウェアが出ていますが、今回はその中でも「VOICEPEAK」と「VOICEVOX」を取り上げます。

VOICEVOX

VOICEVOXは「無料で使える中品質なテキスト読み上げソフトウェア(公式談)」というオープンソフトの音声合成ソフトウェアで、触れ込みの通り無料でインストールできます。商用・非商用に関わらず無料で使える(要クレジット表記)上、音声の品質も高いのでとても使い勝手の良いソフトウェアです。

ただ、非公式ですが少しでもストレージの容量を圧迫したくない様な人のためにWeb API版もあります。

WEB版VOICEVOX API(低速)

今回は、このAPIを使って音声を合成してみました。早速ですがソースはこちら。

スクリプトの使い方は以下の通り。

ミライ小町 (© (株)バンダイナムコスタジオ)
  1. 適当なGameObject(Emptyなど)に貼り付け
  2. AudioSourceを割り当て
  3. メソッドSetSpeakerIDで声の選択(入力は1~)
  4. メソッドSetTextでしゃべらせたい内容を設定
  5. [任意] イベントOnPlayVoiceに音声再生時の処理を割り当て
  6. メソッドVoiceを呼び出す(他のスクリプト、GUIなど)

ちょっと長いので、特に重要なところだけ抜粋。

まず、APIを叩いて音声合成をリクエストするコルーチンを作成します。基本的には、UnityWebRequestクラスでパラメータを追加したURLにGETを送り、通信が成功(ステータス200)の場合のみサーバーから取得したJSONを返します。

続いて、音声データを取得して再生するためのメソッドを作ります。上記のメソッドの戻り値(JSON)もここで使います。

先ほどのメソッド(GetAudioQuery)をコルーチンで実行し、戻り値がAudioQueryクラスの時だけ、今度はUnityWebRequestMultimediaクラスのGetAudioClipメソッドでwav形式の音声ファイルをリクエストします。通信が成功したら、Unityで再生可能な形式(AudioClip)に変換してダウンロードし、音声を再生します。AudioQueryクラスは、リクエストに対するAPIのレスポンスで、通信成功の可否や音声のダウンロードURLなどが定義されています。

ちなみに、MP3も取得可能ですが、GetAudioClipメソッドがMP3に対応していないためWAVを選択しています。また、当初はOnPlayVoiceで3Dモデルの表情や動きも付けていましたが、発声の瞬間とタイミングが合わなかったので、6.のVoiceメソッド呼び出しと同時にモーションも動かすように変えました。

OnClickに音声再生(Voice)とモーション動作関係を割り当て

VOICEPEAK

一方、こちらは列記とした株式会社AHSの製品。必ずインストールする必要がありますが、無料版もあるのでそちらを使用しても問題ありません。

こちらを使う場合、とにかくまずはパッケージをダウンロードしてインストールします(手順は簡単なので省略)。

VOICEPEAK|製品情報|AHS(AH-Software)

続いて、VOICEPEAKをUnityから動かす処理ですが、残念ながらSDKは用意されてません。ただ、代わりにC#のProcessクラスを駆使すれば外部アプリケーションを実行できるので、UnityからProcess(コマンドプロンプト)経由でVOICEPEAKを実行し、生成された音声を読み込んで再生します。

それを踏まえて、スクリプトを見てみましょう(OnStandardOutなど、一部不要な部分もあります…orz)。

スクリプトの使い方は以下の通り。

邪神ちゃんドロップキック二次創作素材集 (© 株式会社KADOKAWA)
  1. 適当なGameObject(Emptyなど)に貼り付け
  2. Exepath にVOICEPEAK実行ファイルのフルパスを入力
  3. AudioSourceを割り当て
  4. メソッドChangeMessageでしゃべらせたい内容を設定
  5. メソッドPlayVoiceを呼び出す(他のスクリプト、GUIなど)。または、Play(string)で喋らせたい内容を直接入力してもOK

ちょっと長いので、こちらも重要なところだけ抜粋します。

PlayVoiceは、VOICEPEAKを呼び出して合成音声を生成させるメソッドです。

まず、Processのインスタンスを作成して実行時の設定をStartInfoプロパティに入れます。特にArgumentsで実行時のパラメータを追加できます。

  • o : 音声ファイルの出力先
  • s : 喋らせるメッセージ
  • n : ナレーター(対応時のみ。「邪神ちゃん」無料版では使えませんでした)

そして、終了時のイベントを有効にした後、StartメソッドでVOICEPEAKを起動します。

終了後に音声を直接読み込めなかったので、代わりにフラグ(isReadyVoice)を立てて、音声再生はUpdateメソッド内で処理します。

Updateでは常にフラグを見ており、trueになったらGetAudioClipメソッドで声を再生します。GetAudioClipでは受け取ったURLから音声ファイルを読み込んでAudioSourceから鳴らすようにしていますが、実はUnityWebRequestMultiMedia.GetAudioClipがローカルファイルも読み込めるので、出力先のファイルパスに「file://」を付けて呼び出すことで生成された音声ファイルを読込・再生しています。

どちらを使うべき?

使い勝手や出力音声の品質でいうとVOICEVOXに軍配が上がります。

VOICEPEAKは感情設定やピッチ等の調整が無いと無機質になる上、わざわざ外部アプリを実行(コマンドプロンプトから呼び出し)するので余計に処理時間がかかる感じがしました。どちらもUnityからだと細かい調整は難しいですが、それとなく自然な声を生成できるVOICEVOXがやはりUnityからだと使いやすいと思います。

逆に、特定のキャラクターの音声を使いたいときにはVOICEPEAKを選択する事もあるかもしれません。

次回は?

モーションのつけ方について触れていきます。

参考

UnityでVoicePeakを使う時のサンプルコード(コマンドプロンプト経由)|とりにく
タイトル通りです。口パクとの連携等は割愛。以下参照記事。 voicepeak v1.2.1のコマンド - takashiskiのブログ もろもろの発表タイミングでbeta -> v1.2.1で正式対応となり、一部変わったので併記 制限など 2023/0 takashiski.hatenablog....
GPT-3とVoiceVoxを活用してAIエージェントを作る!【Unity】|ねぎぽよし
何を作ったのか? OpenAI GPT-3+VoiceVoxで、3D AIエージェントを作ってLooking Glassで良い感じに表示させてみた! ふとした時に何か会話するの楽しいし、自分の作業してるすぐ横で見守ってくれるし、AIにどんどんかわいさを感じていってあまりにも良い…👏😭 pic.twitter.com...
タイトルとURLをコピーしました