聲音觸發條件

應用程式可透過「聲音觸發」功能,以低耗電量且注重隱私權的方式,監聽特定聲音事件 (例如熱字詞)。Google 助理和「聽聲辨曲」就是使用聲音觸發功能的例子。

本頁面將概略介紹聲音觸發架構及其 HAL (硬體抽象層) 介面。

聲音觸發堆疊

如圖 1 所示,聲音觸發子系統是分層建構而成:

sound_trigger_stack

圖 1:聲音觸發堆疊

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

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

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

  • SoundTriggerService (藍色) 系統位於中介軟體上方。方便整合電話和電池事件等其他系統功能。此外,這項服務還會維護聲音模型資料庫,並以專屬 ID 編製索引。

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

聲響觸發堆疊的功能是傳送代表聲學觸發事件的離散事件。在大多數情況下,聲音觸發堆疊不會處理音訊。收到觸發事件後,應用程式會透過 Audio 架構開啟 AudioRecord 物件,存取事件發生時間前後的實際音訊串流。Sound Trigger HAL API 會提供觸發事件的控制代碼,用於 Audio Framework。因此,由於 Sound Trigger HAL 和 Audio HAL 在幕後是連線的,因此通常會共用一個程序。

Sound Trigger HAL 介面

Sound Trigger HAL (STHAL) 介面是 Sound Trigger 堆疊的供應商專屬部分,負責處理啟動字詞和其他聲音的硬體辨識作業。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 程序才能復原。這是最後的復原策略,在正常運作的系統中,預期不會發生這類情況。