使用自動語音辨識功能處理 AI 眼鏡的音訊輸入

適用 XR 裝置
這份指南可協助您為這類 XR 裝置打造體驗。
AI 眼鏡

您可以使用自動語音辨識 (ASR) 透過 SpeechRecognizer 辨識使用者的特定語音,並將其轉換為文字。Android 內建 TTS (不需要額外程式庫),即使離線也能使用。SpeechRecognizer

如要讓 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
            }
        }

    }
    ...
}

程式碼重點

  • 系統會查詢套件中的兩個陣列。第一個陣列包含所有相符項目,第二個陣列則代表語音辨識器對所聽到內容的信心程度。這些陣列的索引會相互對應。系統會使用信心值 (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)

}

程式碼重點