• トップ
  • ブログ一覧
  • 【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ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background