【Unity】Microsoft Azure を用いてキャラクターを流暢に話させる
IT技術
Microsoft Azure でキャラクターを喋らせる
3Dゲームが従来より手軽に開発できる「Unity(ユニティ)」。
「スマートフォンアプリ」はもちろん、「Oculus(オキュラス)」などの VR ゲームまで開発することができます。
さらに、最近では「バーチャルYouTuber」の開発や運営にも「Unity」が使われています。
「Unity」で使える、様々な3Dモデルも無償で配布されており、それを使用して、開発する方も多いのではないでしょうか。
Unity での開発で音声をどうするか?
そんな開発の中、当たってしまう壁のひとつに「キャラクターの音声」が挙げられると思います。
「ゆっくりボイス」など、「合成音声によるフリーのテキスト読み上げソフト」で作成するのも一つの手です。
ですが、全てのセリフ毎に、mp3 の音声ファイルを作成するのは、大変な手間かもしれません。
そこで今回は、「Microsoft Azure(マイクロソフト アジュール)」を利用し、キャラクターに発声させ、「さらに、会話する」ところまで紹介したいと思います!
今回実装する上での注意点
- Microsoft Azure では、英語の読み上げしか提供されておりません。
- Unity の ver は 2018.3.14f1 です。2019ではエラーがでます。
- 本記事の Microsoft Azure の情報は 2020年1月21日時点のものになります。
- Microsoft Azure の Cognitive Service、Speech to Text、SpeechSDK を使用します。
有料のサブスクリプションが推奨されます。会社、学校などで確認をお願いします。
無料でも可能ですが、レスポンスが遅いので、違和感があります。
【準備1】Azure Speechリソースを作成する
まずは、下記のページの手順で、「Microsoft Azure」を使えるように設定をしましょう!
【Microsoft Azure 公式ドキュメント】
https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/get-started
設定が終わると、[リソースに移動]というボタンが出てくるので、選択します。
その後、左側のナビゲーションウィンドウで、[キー]を選択すると、「サブスクリプションキー」が表示されます。
この値を後ほど使用するので、記録しておいてください。
【準備2】UnityにSpeechSDKのパッケージをインストールする
下記のリンクから、「Unity のパッケージ」をインストールします。
【Unity パッケージ】
https://aka.ms/csspeech/unitypackage
※上記リンクで直接ダウンロードが始まります
その後、ダウンロードしたデータを、「取り込みたいUnityのプロジェクトを開いた状態」で右クリックします。
そうしてみると、以下のような画面が出てくるので、[import]を選択します。
プロジェクトビューの「Assets」に、「SpeechSDK」のフォルダができれば、準備は終了です。
話す側の設定
さて準備が整いました!
それでは、いよいよ、キャラクターを喋らせる設定を行いたいと思います!
まずは、こちらのドキュメントに従って、Unity のプロジェクトを操作します。
【Microsoft Azure 公式ドキュメント】
https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/quickstarts/text-to-speech?tabs=unity%2Clinux%2Cjre&pivots=programming-language-csharp
コードの変更
コードをコピーした後に、少し変更します。
サンプルプログラムの、90行目からです。
1// Creates an instance of a speech config with specified subscription key and service region.
2// Replace with your own subscription key and service region (e.g., "westus").
3speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
上記内の、YourSubscriptionKey と YourServiceRegion を、【準備1】で確認した値にします。
YourServiceRegion は、 japaneast か japanwest のどちらかに変更してください。
※「japaneast(東日本)」か「japanwest(西日本)」の設定は、居住している地域にすることで、若干応答が早くなります。
発声までの最後の仕上げ
その後、「HelloWorld」を「Canvas」にアタッチし、以下のように「Inputfield」や「text」をアタッチします。
これで準備は完了です。
[play] ボタンを押した後、「Inputfield」に英文を入力して、ボタンを押します。
音声が聞こえれば成功です!
聞く側の設定
次は「こちらからの問いかけに答える」ことが出来るようにしていきます。
まずは、「こちらが話した言葉を、文字に変換」していきます。
先ほど使用した、SpeechSDK のサブスクリプションを、そのまま使います。
Unity のプロジェクトに、「text」と「ボタン」を用意し、下記のドキュメントにある、コード「HelloWorld」を使用します。
【Microsoft Azure 公式ドキュメント】
https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/quickstarts/speech-to-text-from-microphone?tabs=unity%2Cx-android%2Clinux%2Cjava-runtime&pivots=programming-language-csharp
エラーの修正
ここで、前半使用した「HelloWorld」と、同じコード名が使用されているので、エラーが発生します。
ですので、スクリプトを作るときに「HelloWorld」でない名前を設定します。
また、スクリプトの中のクラス名「HelloWorld」も変更していきます。
1//ここのクラス名を変更しておく。
2public class HelloWorld2 : MonoBehaviour
3{
4 // Hook up the two properties below with a Text and Button object in your UI.
サブスクリプションキーとリージョンの設定
前半と同じように、「サブスクリプションキー」と「リージョン」の設定を行います。
こちらは、サンプルコード30行目あたりです。
1 public async void ButtonClick()
2 {
3 // Creates an instance of a speech config with specified subscription key and service region.
4 // Replace with your own subscription key and service region (e.g., "westus").
5 var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
変更が終わったら、下記図のように「canvas」にスクリプトをアタッチし、対象となるオブジェクトをアタッチします。
できたら、[play]ボタンを押して実験してみましょう。
話した文章が、文字列として表示されれば成功です。
話す側と聞く側、二つのプログラムを接続する
「話した言葉を文字に起こすプログラム」と、「文字通りに話すプログラム」を接続します。
想定問題集をつくる
まずは、チャットボットのように、想定問答集をつくります。
話した言葉を文字起こしするとき、大文字小文字には揺らぎがあるので、下記のように数パターン用意しておきましょう。
1if (inputField.text == "I am fine" || inputField.text == "I am fine." || inputField.text == "Hi I am fine." || inputField.text == "Hi I'm fine.")
2 {
3 inputtext.text = "wow ! happy!";
4
5 }
上記のように、「文字起こしした値」に対して、「想定問答に基づいた返答」に変更しましょう。
文字通りの音声を読み上げるスクリプト に渡す
それを、一番始めに作った「文字通りの音声を読み上げるスクリプト」に渡します。
もともとが、「text」なので、「InputField」に入るように形式を変更しましょう。
InputField.text = inputtext.text;
これが面倒な場合は、文字読み上げを行う「HelloWorld」のスクリプトを、以下のように書き換えます。
public Text inputText;
を定義。
コードの30行目あたりの
using (var result = synthesizer.SpeakTextAsync(inputField.text).Result)
を
using (var result = synthesizer.SpeakTextAsync(inputText.text).Result)
になるように変更。
上記のように変更した場合、アタッチされているスクリプトに、「GameObject」を割り当てる「inputText」が増えています。
下記画像の内容になるよう、変更しましょう。
UI で必要のない Text を除外
その後、UIとして必要のない Text は、画面の外に追い出しておきます。
画像を見てもらえばわかると思いますが、ボタンを「話す」と「返事を聞く」の二つに分けています。
「話す」ボタンを押して話し、「返事を聞く」ボタンを押せば返事を聞くことができます。
さいごに
いかがでしたでしょうか?
音声が入れば、ゲームのクオリティも格段に上がったように感じられるかと思います。
ご紹介した内容を参考に、キャラクターを喋らせて遊んでみてください!
日本語化について
「CustomSpeech(カスタムスピーチ)」という Azure の機能を使えば、「日本語化」ができるそうです。
ですが、Unity での組み込みではまだ動作しません。
そのため、更新があれば追記したいと思います!
【Microsoft Azure 公式ドキュメント】
https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/how-to-custom-speech
こちらの記事もオススメ!
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit