您可以使用自動語音辨識 (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)
}
程式碼重點
- 使用
ACTION_RECOGNIZE_SPEECH時,您也必須指定EXTRA_LANGUAGE_MODEL額外項目。 LANGUAGE_MODEL_FREE_FORM適用於對話語音。