聲音觸發器
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
聲音觸發功能使應用程序能夠以低功耗和隱私敏感的方式偵聽某些聲音事件,例如啟動指令。聲音觸發器的示例用例是助手和正在播放。
本頁概述了聲音觸發架構及其 HAL(硬件抽象層)接口。
聲音觸發器堆棧 Sound Trigger 子系統按層構建,如圖 1 所示:
圖 1: 聲音觸發堆棧
以下列表更詳細地描述了圖 1 中所示的每一層:
HAL 層 (綠色)包含實現聲音觸發 HAL (STHAL) 接口的供應商特定代碼。
注意: 建議直接實現 STHAL 接口,而不是作為傳統 HAL 實現的適配器。 SoundTriggerMiddleware
(黃色)位於 HAL 接口之上。它與 HAL 通信並負責在不同客戶端之間共享 HAL、記錄、強制執行權限以及處理與舊 HAL 版本的兼容性等功能。
SoundTriggerService
(藍色)系統位於中間件之上。它有助於與其他系統功能集成,例如電話和電池事件。它還維護一個由唯一 ID 索引的聲音模型數據庫。
在SoundTriggerService
層之上,堆棧(棕色)分別處理特定於 Assistant 和通用應用程序的功能。
聲音觸發堆棧的功能是提供代表聲學觸發事件的離散事件。在大多數情況下,聲音觸發器堆棧不處理音頻。收到觸發事件後,應用程序可以通過音頻框架打開AudioRecord
對象來訪問事件發生時間周圍的實際音頻流。聲音觸發器 HAL API 提供了一個與音頻框架一起使用的觸發事件的句柄。因此,由於 Sound Trigger HAL 和 Audio HAL 在引擎蓋下連接,它們通常共享一個進程。
注意: 由於模型和數據類型對 Sound Trigger 子系統中的框架是不透明的,因此預計應用程序和 HAL 實現保持“隱藏契約”,即這些數據類型的實際內容、格式和語義是一致的之上。因此,使用 Sound Trigger 的應用程序旨在由供應商提供,而不是由獨立開發人員提供。 聲音觸發 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 客戶端可以調用forceRecognitionEvent()
來生成強制識別事件。返回的事件類似於正常的識別事件,但其狀態字段設置為FORCED
。這樣的識別事件不會自動停止識別。相反,即使在事件已交付後,模型狀態仍保持運行。 HAL 錯誤的處理 為了確保驅動程序實現之間的行為可靠且一致,在 Android 11 中,從 HAL 返回的任何不成功的錯誤代碼都將被視為編程錯誤,需要重新啟動 HAL 進程才能從中恢復。這是最後的恢復策略,並且期望這種情況不會在正常工作的系統中發生。
注意: 儘管這些錯誤在 HAL API 文檔中被稱為有效,但對於何時以及在什麼狀態下返回這些錯誤代碼以及預期的錯誤恢復過程是什麼仍存在歧義。因此,與較低版本的 Android 相比,Android 11 在運行時要求更嚴格的 Sound Trigger HAL 實現一致性。
這個頁面中的內容和程式碼範例均受《內容授權 》中的授權所規範。Java 與 OpenJDK 是 Oracle 和/或其關係企業的商標或註冊商標。
上次更新時間:2022-06-06 (世界標準時間)。
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"缺少我需要的資訊"
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"過於複雜/步驟過多"
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"過時"
},{
"type": "thumb-down",
"id": "translationIssue",
"label":"翻譯問題"
},{
"type": "thumb-down",
"id": "samplesCodeIssue",
"label":"示例/程式碼問題"
},{
"type": "thumb-down",
"id": "otherDown",
"label":"其他"
}]
[{
"type": "thumb-up",
"id": "easyToUnderstand",
"label":"容易理解"
},{
"type": "thumb-up",
"id": "solvedMyProblem",
"label":"確實解決了我的問題"
},{
"type": "thumb-up",
"id": "otherUp",
"label":"其他"
}]
{"lastModified": "\u4e0a\u6b21\u66f4\u65b0\u6642\u9593\uff1a2022-06-06 (\u4e16\u754c\u6a19\u6e96\u6642\u9593)\u3002"}
[[["容易理解","easyToUnderstand","thumb-up"],["確實解決了我的問題","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少我需要的資訊","missingTheInformationINeed","thumb-down"],["過於複雜/步驟過多","tooComplicatedTooManySteps","thumb-down"],["過時","outOfDate","thumb-down"],["翻譯問題","translationIssue","thumb-down"],["示例/程式碼問題","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["上次更新時間:2022-06-06 (世界標準時間)。"]]