• トップ
  • ブログ一覧
  • 【Unity】Microsoft Azure を用いてキャラクターを流暢に話させる
  • 【Unity】Microsoft Azure を用いてキャラクターを流暢に話させる

    広告メディア事業部広告メディア事業部
    2020.02.26

    IT技術

    Microsoft Azure でキャラクターを喋らせる

    3Dゲームが従来より手軽に開発できる「Unity(ユニティ)」。

    「スマートフォンアプリ」はもちろん、「Oculus(オキュラス)」などの VR ゲームまで開発することができます。

    さらに、最近では「バーチャルYouTuber」の開発や運営にも「Unity」が使われています。

    「Unity」で使える、様々な3Dモデルも無償で配布されており、それを使用して、開発する方も多いのではないでしょうか。

    Unity での開発で音声をどうするか?

    そんな開発の中、当たってしまう壁のひとつに「キャラクターの音声」が挙げられると思います。

    「ゆっくりボイス」など、「合成音声によるフリーのテキスト読み上げソフト」で作成するのも一つの手です。

    ですが、全てのセリフ毎に、mp3 の音声ファイルを作成するのは、大変な手間かもしれません。

    そこで今回は、「Microsoft Azure(マイクロソフト アジュール)」を利用し、キャラクターに発声させ、「さらに、会話する」ところまで紹介したいと思います!

    今回実装する上での注意点

    1. Microsoft Azure では、英語の読み上げしか提供されておりません。
    2. Unity の ver は 2018.3.14f1 です。2019ではエラーがでます。
    3. 本記事の Microsoft Azure の情報は 2020年1月21日時点のものになります。
    4. 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");

    上記内の、YourSubscriptionKeyYourServiceRegion を、【準備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

    こちらの記事もオススメ!

    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事