音效觸發條件

聲響觸發事件功能可讓應用程式以低耗電量且重視隱私權的方式,監聽特定聲響事件 (例如熱字詞)。聲音觸發條件可用於 Google 助理和現在播放的功能。

本頁面概略說明聲音觸發條件的架構及其 HAL (硬體抽象層) 介面。

聲音觸發事件堆疊

聲音觸發子系統是內建圖層,如圖 1 所示:

sound_trigger_stack

圖 1: Sound Trigger 堆疊

下列清單詳細說明圖 1 中顯示的各個圖層:

  • HAL 層 (以綠色表示) 包含供應商專屬程式碼,可實作 Sound Trigger HAL (STHAL) 介面。

  • SoundTriggerMiddleware (以黃色顯示) 位於 HAL 介面上方。它會與 HAL 進行通訊,並負責執行各種功能,例如在不同用戶端之間共用 HAL、記錄、強制執行權限,以及處理與舊版 HAL 的相容性。

  • SoundTriggerService (以藍色標示) 系統位於中介軟體之上。這有助於整合其他系統功能,例如電話和電池事件。它也會維護音效模型資料庫,並以獨特 ID 建立索引。

  • SoundTriggerService 層之上,堆疊 (以棕色表示) 會分別處理 Google 助理和一般應用程式的特定功能。

聲響觸發堆疊的功能是提供代表聲響觸發事件的個別事件。在大多數情況下,音訊觸發堆疊不會處理音訊。收到觸發事件後,應用程式會透過 Audio 架構開啟 AudioRecord 物件,取得事件發生前後的實際音訊串流。Sound Trigger HAL API 會提供一個句柄,其中包含與 Audio Framework 搭配使用的觸發事件。因此,由於聲響觸發 HAL 和音訊 HAL 已在內部連線,因此通常會共用一個程序。

音效觸發 HAL 介面

音訊觸發器 HAL (STHAL) 介面是音訊觸發器堆疊的供應商專屬部分,可處理硬體對熱鍵和其他音訊的辨識。STHAL 提供一或多個引擎,每個引擎都會執行不同的演算法,用於偵測特定類別的聲音。當 STHAL 偵測到觸發事件時,會將事件傳送至架構,然後停止偵測。

STHAL 介面是在 /hardware/interfaces/soundtrigger/ 下指定。

ISoundTriggerHw 介面支援在特定時間執行一或多個偵測工作階段,並監聽聲響事件。呼叫 ISoundTriggerHw.getProperties() 會傳回 Properties 結構,其中包含實作說明和功能。

圖 2 說明設定工作階段的基本流程:

sthal_state

圖 2:STHAL 狀態圖表

以下步驟將詳細說明各個狀態:

  1. HAL 用戶端會使用 loadSoundModel()loadPhraseSoundModel() 載入模型。提供的模型物件會指出要使用的實作專屬偵測演算法 (引擎),以及適用於這個演算法的參數。成功後,這些方法會傳回一個句柄,用於在後續呼叫中參照此模型。

  2. 成功載入模型後,HAL 用戶端會呼叫 startRecognition() 以開始偵測。辨識作業會持續在背景執行,直到其中一個事件發生為止:

    1. 這個模型已呼叫 stopRecognition()
    2. 系統偵測到問題。
    3. 系統會因資源限制而中止偵測,例如在已啟動優先順序較高的用途時。

    在後兩種情況中,系統會透過回呼介面傳送辨識事件,該介面是在載入時由 HAL 用戶端註冊。無論在何種情況下,發生任何上述事件後,偵測功能就會失效,且系統不會再允許辨識回呼。

    同一個模型可在稍後重新啟動,且可視需要重複多次。

  3. 最後,HAL 用戶端會透過 unloadModel() 卸載不再需要的非活動模型。

處理 HAL 錯誤

為確保驅動程式實作之間的行為可靠且一致,在 Android 11 中,從 HAL 傳回的任何非成功錯誤代碼都會視為程式設計錯誤,需要重新啟動 HAL 程序才能復原。這是最後一種復原策略,預期在正常運作的系統中不會發生這類情況。