
【Unity】Microsoft Azure を用いてキャラクターを流暢に話させる
2021.12.20
目次
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 2 3 | // Creates an instance of a speech config with specified subscription key and service region. // Replace with your own subscription key and service region (e.g., "westus"). speechConfig = 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 2 3 4 | //ここのクラス名を変更しておく。 public class HelloWorld2 : MonoBehaviour { // Hook up the two properties below with a Text and Button object in your UI. |
サブスクリプションキーとリージョンの設定
前半と同じように、「サブスクリプションキー」と「リージョン」の設定を行います。
こちらは、サンプルコード30行目あたりです。
1 2 3 4 5 | public async void ButtonClick() { // Creates an instance of a speech config with specified subscription key and service region. // Replace with your own subscription key and service region (e.g., "westus"). var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion"); |
変更が終わったら、下記図のように「canvas」にスクリプトをアタッチし、対象となるオブジェクトをアタッチします。

できたら、[play]ボタンを押して実験してみましょう。
話した文章が、文字列として表示されれば成功です。
話す側と聞く側、二つのプログラムを接続する
「話した言葉を文字に起こすプログラム」と、「文字通りに話すプログラム」を接続します。
想定問題集をつくる
まずは、チャットボットのように、想定問答集をつくります。
話した言葉を文字起こしするとき、大文字小文字には揺らぎがあるので、下記のように数パターン用意しておきましょう。
1 2 3 4 5 | if (inputField.text == "I am fine" || inputField.text == "I am fine." || inputField.text == "Hi I am fine." || inputField.text == "Hi I'm fine.") { inputtext.text = "wow ! happy!"; } |
上記のように、「文字起こしした値」に対して、「想定問答に基づいた返答」に変更しましょう。
文字通りの音声を読み上げるスクリプト に渡す
それを、一番始めに作った「文字通りの音声を読み上げるスクリプト」に渡します。
もともとが、「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
こちらの記事もオススメ!
書いた人はこんな人

- 「好きなことを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もりは大歓迎!
また、WEBエンジニアとモバイルエンジニアも積極採用中です!
ご応募をお待ちしております!
ITエンタメ2022.07.06高水準言語『FORTRAN』を開発したジョン・バッカス氏
ITエンタメ2022.06.22IntelliJ IDEAとkotlinを送り出したJetBrains創業物語
ITエンタメ2022.06.15【アタリ創業者】スティーブ・ジョブズを雇った男「ノーラン・ブッシュネル」
ITエンタメ2022.06.13プログラミングに飽きてPHPを開発したラスマス・ラードフ