自動音声認識を使用して AI グラスからの音声入力を処理する

対象の XR デバイス
このガイダンスは、このようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
AI メガネ

自動音声認識(ASR)を使用すると、SpeechRecognizer を使用してユーザーの特定の発話を認識し、テキストに変換できます。SpeechRecognizer は Android に組み込まれており(追加のライブラリは不要)、オフラインでも動作します。

SpeechRecognizer でユーザーの音声をテキストに変換するには、ユーザーがアプリに RECORD_AUDIO 権限を付与する必要があります。アプリでこの権限をリクエストする方法については、ハードウェアの権限をリクエストするをご覧ください。

SpeechRecognizer をインスタンス化する

AI グラス アクティビティの onCreate() メソッドで SpeechRecognizer をインスタンス化して、アクティビティのライフタイムで使用できるようにします。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    //The RECORD_AUDIO permission must be granted to your app before instantiation

    speechRecognizer = SpeechRecognizer.createOnDeviceSpeechRecognizer(this)
    speechRecognizer?.setRecognitionListener(recognitionListener)
    ...
}

RecognitionListener を構成する

setRecognitionListener() メソッドを使用すると、RecognitionListener.onResults() など、重要なコールバックが行われるオブジェクトを指定できます。このオブジェクトは、システムが音声言語を認識した後に呼び出されます。

val recognitionListener = object : RecognitionListener {

    override fun onResults(results: Bundle?) {

        val matches = results?.getStringArrayList(RESULTS_RECOGNITION)
        val confidences = results?.getFloatArray(CONFIDENCE_SCORES)

        val mostConfidentIndex = confidences!!.indices.maxByOrNull { confidences[it] }

        if (mostConfidentIndex != null){
            val spokenText = matches[mostConfidentIndex]

            if (spokenText.equals("Start my Run", ignoreCase = true)){
                // User indicated they want to start a run
            }
        }

    }
    ...
}

コードに関する主なポイント

  • バンドルに対して 2 つの配列がクエリされます。最初の配列にはすべての一致が含まれ、2 番目の配列は音声認識エンジンが認識した内容に対する信頼度です。これらの配列のインデックスは相互に対応しています。信頼値(mostConfidentIndex)が最も高い一致が使用されます。

  • 大文字と小文字を区別しない文字列照合を実行して、ユーザーが実行したいアクションを判断します。

照合時の代替アプローチ

上記の例では、信頼値が最も高い一致が使用されます。この選択は、システムがユーザーから理解した内容にかなり自信を持っている場合にのみ、一致を報告することを意味します。このアプローチを使用すると、偽陰性が発生する可能性があります。

別の方法として、信頼度に関係なくすべてのマッチを調べ、探している入力に一致するものを探すこともできます。一方、この種のアプローチでは、偽陽性が多くなる可能性があります。取るべきアプローチは、ユースケースに大きく依存します。

聞き取りを開始します

ユーザーのリスニングを開始するには、startListening() を呼び出すときに ACTION_RECOGNIZE_SPEECH インテントを指定します。

override fun onStart() {
    super.onStart()

    val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
        putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
    }

    speechRecognizer?.startListening(intent)

}

コードに関する主なポイント