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