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 助理同時聆聽。這樣一來,使用者就能在兩個助理之間切換,享有更順暢的體驗。
持續開啟麥克風的應用程式
當 Shazam 或 Waze 等應用程式持續開啟麥克風時,預設的 Google 助理仍可聆聽熱鍵字。
對於非預設的 Google 助理應用程式,Android 10 的行為不會有所變更。
音訊 HAL 實作範例
如要查看符合本文件規範的音訊 HAL 實作範例,請前往 Android 開放原始碼計畫。