🐨

Azure AI Speechを使ってHololens2上で喋った内容をリアルタイムで取得できるようにする

2024/01/24に公開

使うサービス

・ Azure AI Speech Service
・ Unity 2022.315LTS
・ MRTK2(なくてもいい)

Azure AI Speech Serviceとは?

Microsoftが提供するクラウドベースのAIサービスの一つで、リアルタイムやバッチでの音声をテキストに変換(音声認識)、逆にテキストを音声に変換(テキスト読み上げ)、さらには音声の翻訳まで可能なツールです。
各種アプリケーションやソフトウェアに音声認識や音声合成などの機能を組み込むことができ、ユーザーとの自然なコミュニケーションを実現します。

今回の実装ではリアルタイムな音声テキスト変換を使用します。

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/overview

実装

1. 事前準備

自分は既存のプロジェクトに導入しますが、新しくプロジェクトを立ち上げる場合は最新のLTSである2022.0315を使用してください。(比較的新しいバージョンであれば問題なく動くと思います)

2Dアプリでも3Dアプリでも問題ないです。


2. 必要なパッケージの導入

Speech SDKが必要です。

公式に書いてある通り、Unity用SDKをダウンロードしてプロジェクトにインポートします。
※Nuget経由からもSpeech SDKをインストールできますが、そちらは上手く動きませんでした。
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/quickstarts/setup-platform?tabs=windows%2Cubuntu%2Cdotnetcli%2Cunity%2Cjre%2Cmaven%2Cnodejs%2Cmac%2Cpypi&pivots=programming-language-csharp


3. UIの作成

処理を開始・終了するボタンと音声から変換されたテキストを表示するTextMeshProがあれば最低限大丈夫です。

自分はAzure Remote Renderingの検証を行ったプロジェクトにAI Speechを導入してるので、TutorialAssetsを使ってます。
以下のGitHubからダウンロードできます。
https://github.com/Azure/azure-remote-rendering/blob/master/Unity/TutorialAssets/TutorialAssets.unitypackage


4. Azure AI Speechにリクエストを送る処理の作成

AISpeechManager.csファイルを作成します。

AISpeechManager.cs
using System;
using System.Collections;
using System.IO;
using System.Threading.Tasks;

using UnityEngine;
using UnityEngine.UI;
using TMPro;

using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;


public class AISpeechManager : MonoBehaviour
{
    SpeechRecognizer recognizer;
    // テキストを表示するUI
    public TMP_Text spokenText;
    
    // 処理が走ってるか走ってないかのフラグ
    private bool recognitionStarted = false;
    private string responseText;

    public async void ToggleRecognition()
    {
        if (recognitionStarted)
        {
            await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(true);
            recognitionStarted = false;
            spokenText.text = "Disconnected";
        }
        else
        {
            await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);
            recognitionStarted = true;
        }
    }

    void Start()
    {
        SpeechConfig config = SpeechConfig.FromSubscription("<your subscription>", "<your region>");
	// 言語の日本語にするために必要
        config.SpeechRecognitionLanguage = "ja-JP";
        AudioConfig audioConfig = AudioConfig.FromDefaultMicrophoneInput();

        recognizer = new SpeechRecognizer(config, audioConfig);
	
	// リアルタイムでテキストが返ってくるイベントハンドラー
        recognizer.Recognizing += (s, e) => {
            responseText = e.Result.Text;
            Debug.Log("Recognizing... : " + message);
        };
	
	// 話終わった区切りのタイミングでテキストを返してくれるイベントハンドラー
        recognizer.Recognized += (s, e) => {
            responseText = e.Result.Text;
            Debug.Log("Recognized: " + message);
        };
	
        recognizer.Canceled += (s, e) => {
            responseText = e.ErrorDetails.ToString();
            Debug.Log("Canceled: " + message);
        };
    }

    void Update()
    {
        if (recognitionStarted)
        {
	  // 処理が走っている時はリアルタイムでテキストをUIに反映させる
            spokenText.text = responseText;
        }
    }
}



AISpeechManagerゲームオブジェクトを作成して、Add Componentで紐付けます。
TextMeshProの紐付けも忘れずに。

検証

Hololens2上で問題なく動作しました。
テキスト変換の精度も高くて、レスポンスに遅延も感じません。

なかなか良い。

ヘッドウォータース

Discussion