Android 10 改善了需要同時進行多項有效音訊擷取作業的使用者體驗,例如使用者想透過輔助服務提供的語音指令控制 VoIP 通話或錄影機。
音訊架構會實作政策,只允許特定特權應用程式與一般應用程式同時擷取。
並非透過防止應用程式開始擷取,而是透過靜音擷取的音訊來實作並行政策。如此一來,架構就能動態處理有效擷取用途的數量和類型變化,避免應用程式在其他應用程式可以擷取完整權限後,無法開始擷取。
音訊 HAL 和音訊子系統的後果是,它們必須同時支援多個有效輸入串流,即使在某些情況下,只有一個串流為有效用戶端提供非靜音音訊。
CDD 規定
如要瞭解並行擷取支援的規定,請參閱 CDD。
擷取音訊 HAL 的情況
在並行擷取情境中,在有效輸入串流數量、輸入裝置選取或預先處理設定方面,可能會出現不同的情況。
以下項目之間可能會發生並行:
- 來自應用程式處理器 (AP) 的多個輸入串流
- 輸入串流和語音通話
- 輸入串流和音訊 DSP 實作低功耗啟動字詞偵測
AP 輸入串流的同時活動
音訊架構會使用音訊政策設定檔 audio_policy_configuration.xml
,判斷可同時開啟及啟用的輸入串流數量。
音訊 HAL 至少必須支援每個輸入設定檔的至少一個例項 (mixPort
的角色 sink
),這些例項會列於已開啟且有效的設定檔中。
裝置選擇
當多個有效的用戶端連結至同一個 HAL 輸入串流時,架構會根據用途優先順序,為此輸入串流選取適當的裝置。
如果啟用多個輸入串流,每個串流都可以選擇不同的裝置。
如果技術相容,建議音訊 HAL 和子系統允許不同的串流從不同裝置擷取,例如藍牙耳機和內建麥克風。
如果不相容 (例如兩部裝置共用相同的數位音訊介面或後端),音訊 HAL 必須選擇哪個串流控制裝置選項。
在這種情況下:
- 重複相同情境時,產生的狀態必須一致,並提供相同的裝置選項。
- 並行狀態結束時,剩餘的使用中串流必須轉送到此串流中最初要求的裝置。
如果音訊 HAL 在有效用途之間定義了優先順序,請按照 frameworks/av/services/audiopolicy/common/include/policy.h
中的 source_priority()
所示順序進行操作。
預先處理選項
音訊架構可以使用 addEffect()
或 removeEffect()
HAL 方法,要求對輸入串流進行預處理。
針對特定輸入串流的預先處理作業,音訊架構只會啟用與輸入串流中最高優先順序的有效用途相對應的設定。不過,在啟用和停用用途的過程中,可能會出現重疊,導致兩個同時處於活動狀態的程序 (例如兩個回音消除器例項) 在同一個輸入串流上執行。在這種情況下,HAL 實作會選擇接受哪項要求;它會追蹤有效要求,並在任一程序停用時還原正確狀態。
當多個擷取串流同時啟用時,不同的串流可能會執行不同的預先處理要求。
HAL 和音訊子系統實作應允許將不同的預處理作業套用至不同的串流,即使這些串流共用相同的輸入裝置也一樣。也就是說,應在從主要擷取來源解析串流後,再套用預先處理。
如果在特定音訊子系統上無法使用技術原因,音訊 HAL 應套用類似於裝置選取一節所列的優先順序規則。
同時透過 AP 進行語音通話和錄影
在進行語音通話時,AP 可能會擷取內容。這種情況在 Android 10 中並非新現象,也不直接與並行擷取功能相關,但針對這種情況提供規範會很有幫助。
在通話期間,需要從 AP 擷取兩種不同類型的內容。
擷取通話接收和傳輸資料
使用音訊來源 AudioSource.VOICE_UPLINK
或 AudioSource.VOICE_DOWNLINK
,以及/或裝置 AudioDevice.IN_TELEPHONY_RX
時,系統會擷取通話的傳送和接收端。
音訊 HAL 應透過裝置 AudioDevice.IN_TELEPHONY_RX
提供可用的路徑,在輸入設定檔 (sink
角色的 mixPort
) 上公開。
連接通話 (音訊模式為 AudioMode.IN_CALL
) 時,裝置 AudioDevice.IN_TELEPHONY_RX
中至少應該具備一個有效的擷取串流。
在通話進行時從輸入裝置擷取內容
通話處於活動狀態 (音訊模式為 AudioMode.IN_CALL
) 時,應可依照「AP 輸入串流的並行活動」一節所述,開啟及啟用 AP 的輸入串流。
不過,如果與 AP 輸入串流的要求發生衝突,則裝置選擇和預先處理的優先順序應一律由語音呼叫驅動。
同時從需求端平台和應用程式程式碼擷取
如果音訊子系統包含支援低功耗音訊情境或熱字詞偵測功能的 DSP,實作方式應支援從 AP 和音訊 DSP 同時擷取。這包括 DSP 在初始偵測階段擷取的內容,以及 DSP 觸發偵測後,AP 使用 AudioSource.HOTWORD
擷取的內容。
這應該會反映在聲音觸發器 HAL 透過實作描述項 (ISoundTriggerHw.Properties.concurrentCapture = true
) 回報的並行擷取標記。
音訊 HAL 也應公開及輸入設定檔,用於透過旗標 AudioInputFlag.HW_HOTWORD
識別的啟動字詞擷取作業。實作內容應支援在這個設定檔上開啟及啟用多個串流,至少等於音訊觸發器 HAL 可同時載入的音訊模型數量。
在已啟用其他輸入設定檔的情況下,系統才能從這個輸入設定檔擷取內容。
對 Google 助理實作的影響
資料使用和使用者通知規定
由於同時使用麥克風可能會洩漏使用者的私人資料,因此我們需要將下列條件和保證套用至要求保有 Google 助理角色的預先載入特權應用程式。
- 除非使用者與 Google 助理互動,否則透過麥克風收集的資料不應離開裝置。例如在啟動字詞觸發後。
- 同時進行聆聽的應用程式應在偵測到熱字詞後,向使用者提供視覺提示。這有助於使用者瞭解後續對話會透過其他應用程式 (例如 Google 助理) 進行。
- 使用者應能關閉麥克風或 Google 助理觸發條件。
- 儲存語音記錄時,使用者應隨時可以存取、查看及刪除錄音檔。
Android 10 的功能改善
助理不會互相阻擋
在 Android 9 以下版本中,如果裝置上有兩個一律開啟的 Google 助理,則只有其中一個可以聆聽熱字詞。因此,需要在兩個助理之間切換。在 Android 10 中,預設的 Google 助理可以同時與其他 Google 助理同時監聽。讓這兩種 Google 助理的使用者享有更流暢的體驗。
持續開啟麥克風的應用程式
當 Shazam 或 Waze 等應用程式持續開啟麥克風時,預設的 Google 助理仍可聆聽熱字詞。
對於非預設的 Google 助理應用程式,Android 10 的行為不會有所變更。
音訊 HAL 實作範例
如要查看符合本文件規範的音訊 HAL 實作範例,請前往 Android 開放原始碼計畫。