聲音觸發功能使應用程序能夠以低功耗和隱私敏感的方式偵聽某些聲音事件,例如啟動指令。聲音觸發器的示例用例是助手和正在播放。
本頁概述了聲音觸發架構及其 HAL(硬件抽象層)接口。
聲音觸發器堆棧
Sound Trigger 子系統按層構建,如圖 1 所示:
圖 1:聲音觸發堆棧
以下列表更詳細地描述了圖 1 中所示的每一層:
HAL 層(綠色)包含實現聲音觸發 HAL (STHAL) 接口的供應商特定代碼。
SoundTriggerMiddleware
(黃色)位於 HAL 接口之上。它與 HAL 通信並負責在不同客戶端之間共享 HAL、記錄、強制執行權限以及處理與舊 HAL 版本的兼容性等功能。SoundTriggerService
(藍色)系統位於中間件之上。它有助於與其他系統功能集成,例如電話和電池事件。它還維護一個由唯一 ID 索引的聲音模型數據庫。在
SoundTriggerService
層之上,堆棧(棕色)分別處理特定於 Assistant 和通用應用程序的功能。
聲音觸發堆棧的功能是提供代表聲學觸發事件的離散事件。在大多數情況下,聲音觸發器堆棧不處理音頻。收到觸發事件後,應用程序可以通過音頻框架打開AudioRecord
對象來訪問事件發生時間周圍的實際音頻流。聲音觸發器 HAL API 提供了一個與音頻框架一起使用的觸發事件的句柄。因此,由於 Sound Trigger HAL 和 Audio HAL 在引擎蓋下連接,它們通常共享一個進程。
聲音觸發 HAL 接口
Sound Trigger HAL (STHAL) 接口是 Sound Trigger 堆棧的供應商特定部分,它處理啟動指令和其他聲音的硬件識別。 STHAL 提供一個或多個引擎,每個引擎運行不同的算法,旨在檢測特定類別的聲音。當 STHAL 檢測到觸發器時,它會向框架發送一個事件,然後停止檢測。
STHAL 接口在/hardware/interfaces/soundtrigger/
下指定。
ISoundTriggerHw
接口支持在給定時間運行一個或多個檢測會話並偵聽聲學事件的能力。對ISoundTriggerHw.getProperties()
的調用會返回一個包含實現描述和功能的Properties
結構。
建立會話的基本流程如圖2所示:
圖 2: STHAL 狀態圖
以下步驟更詳細地描述了每個狀態:
HAL 客戶端使用
loadSoundModel()
或loadPhraseSoundModel()
加載模型。提供的模型對象指示要使用哪個特定於實現的檢測算法(引擎),以及適用於該算法的參數。成功後,這些方法返回一個句柄,用於在後續調用中引用此模型。成功加載模型後,HAL 客戶端調用
startRecognition()
開始檢測。識別繼續在後台運行,直到發生以下事件之一:- 已在此模型上調用了
stopRecognition()
。 - 發生了檢測。
- 檢測由於資源限製而中止,例如,當啟動了更高優先級的用例時。
在後兩種情況下,通過 HAL 客戶端在加載時註冊的回調接口發送識別事件。在所有情況下,在任何這些事件發生後,檢測將變為非活動狀態,並且不允許再進行識別回調。
稍後可以再次啟動相同的模型,並且可以根據需要多次重複此過程。
- 已在此模型上調用了
最後,HAL 客戶端通過
unloadModel()
卸載不再需要的非活動模型。
HAL 錯誤的處理
為了確保驅動程序實現之間的行為可靠且一致,在 Android 11 中,從 HAL 返回的任何不成功的錯誤代碼都將被視為編程錯誤,需要重新啟動 HAL 進程才能從中恢復。這是最後的恢復策略,並且期望這種情況不會在正常工作的系統中發生。