聲音觸發功能使應用程式能夠以低功耗和隱私敏感的方式偵聽某些聲音事件,例如熱詞。聲音觸發器的範例用例是“助理”和“正在播放”。
本頁概述了聲音觸發架構及其 HAL(硬體抽象層)介面。
聲音觸發堆疊
聲音觸發子系統分層構建,如圖 1 所示:
圖 1:聲音觸發堆疊
以下列表更詳細地描述了圖 1 中所示的每一層:
HAL 層(綠色)包含實現聲音觸發 HAL (STHAL) 介面的供應商特定程式碼。
SoundTriggerMiddleware
(黃色)位於 HAL 介面之上。它與 HAL 進行通信,並負責在不同客戶端之間共享 HAL、日誌記錄、強制執行權限以及處理與舊 HAL 版本的兼容性等功能。SoundTriggerService
(藍色)系統位於中介軟體之上。它有助於與其他系統功能(例如電話和電池事件)的整合。它還維護一個聲音模型資料庫,透過唯一 ID 進行索引。在
SoundTriggerService
層之上,堆疊(棕色)分別處理特定於 Assistant 和通用應用程式的功能。
聲音觸發堆疊的功能是傳遞代表聲學觸發事件的離散事件。在大多數情況下,聲音觸發堆疊不會處理音訊。收到觸發事件後,應用程式可以透過音訊框架開啟AudioRecord
物件來存取事件發生期間的實際音訊串流。聲音觸發器 HAL API 提供了與音訊框架一起使用的觸發事件的句柄。因此,由於聲音觸發 HAL 和音訊 HAL 在背景連接,因此它們通常共用一個進程。
聲音觸發HAL接口
聲音觸發 HAL (STHAL) 介面是聲音觸發堆疊的供應商特定部分,它處理熱詞和其他聲音的硬體識別。 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 進程才能恢復。這是最後的恢復策略,預計在正常工作的系統中不會發生此類情況。