空間音訊和頭部追蹤

Android 13 導入了原始設備製造商 (OEM) 支援空間音訊和頭部追蹤的標準做法,無需使用特定供應商的自訂或 SDK。

空間音訊是一種用於創造環繞聆聽者的音場的技術。空間音訊可讓使用者感知管道和個別聲音的位置,而不是與用於播放的音訊裝置轉音器的實際位置。舉例來說,空間音訊可讓使用者透過耳機聆聽多聲道音軌。使用空間音訊時,即使只有兩個換能器可播放音訊,耳機使用者仍可感受到前方對話和後方環繞效果。

頭部追蹤功能可協助使用者瞭解頭部周圍模擬空間化音訊的本質。只有在延遲時間較短的情況下,才能達到效用,而延遲時間是從使用者移動頭部到聽到虛擬揚聲器位置隨著開始移動為止所經過的時間。

Android 13 會在音訊管道中提供空間音訊處理功能,盡可能降低延遲時間,以便為空間音訊和頭部追蹤功能進行最佳化。

建築

Android 13 中經過修改的 Android 音訊架構和 API,可在整個生態系統中採用空間音訊技術。

下圖說明在 Android 13 中,音訊管道架構的空間音訊相關變更:

spatial-audio

圖 1. 含有空間處理器的音訊管道架構

在新模型中,空間化器是音訊架構的一部分,並與解碼器解耦。空間化器會接收混合音訊內容,並將立體聲串流算繪至 Audio HAL。將空間化器與解碼器分離後,原始設備製造商 (OEM) 就能為解碼器和空間化器選擇不同的供應商,並達到所需的頭部追蹤來回延遲時間。這個新模型也包含用於頭部追蹤的感應器架構掛鉤。

下圖說明空間化器和頭部追蹤效果的音訊架構系統架構:

spatial-sys-arch

圖 2. 內含空間處理器和頭部追蹤功能的系統架構

所有空間音訊 API 都會在應用程式層級的公開 Spatializer 類別中分組。音訊服務中的 SpatializerHelper 類別會與系統 UI 元件介接,根據平台和連結裝置的功能管理空間化器相關功能。音訊政策服務中的新 Spatializer 類別會根據原始設備製造商 (OEM) 表示的功能、已連結的裝置和有效用途,建立及控制多聲道混音和空間化所需的空間音訊圖表。新的混音器類別 SpatializerThread 會混合多聲道音軌,並將混合後的結果提供給後置處理 FX 引擎,以便將立體聲輸出內容轉換為 Audio HAL。針對頭部追蹤,SpatializerPoseController 類別會將與頭部追蹤相關的函式分組,以便與感應器堆疊介面,並合併及篩選提供給效果引擎的感應器信號。頭部追蹤感應器資料會透過藍牙驅動程式的 HID 通訊協定傳送。

對 Android 13 音訊管道架構所做的變更,可改善下列項目:

  • 降低空間化器和耳機之間的延遲時間。
  • 提供統合 API,為應用程式開發人員提供服務。
  • 透過系統 API 控制頭部追蹤狀態。
  • 探索頭部追蹤感應器,並將其與使用中的音訊裝置建立關聯。
  • 合併來自不同感應器的信號,並計算空間化效果引擎可使用的頭部姿勢。

您可以使用頭部追蹤公用程式庫實作偏差補償、靜止偵測和速率限制等功能。

空間音訊 API

Android 13 提供空間音訊系統和開發人員 API。

原始設備製造商 (OEM) 可根據系統 API 設定的功能可用性和啟用狀態,調整應用程式行為。應用程式也可以設定音訊屬性,停用空間音訊,以便為美觀效果或表示音訊串流已處理為空間音訊

如需瞭解開發人員專用 API,請參閱 Spatializer

原始設備製造商 (OEM) 可以使用系統 API 實作「聲音」和「藍牙」設定 UI,讓使用者控制空間音訊的狀態,以及裝置的頭部追蹤功能。使用者可以在「聲音」設定 UI 中,為揚聲器和有線耳機啟用或停用空間音訊。只有在空間化器效果實作支援穿耳模式時,才能使用喇叭的空間音訊設定。

使用者也可以在每部裝置的藍牙裝置設定中,啟用或停用空間音訊和頭部追蹤功能。只有在藍牙耳機提供頭部追蹤感應器時,才能使用頭部追蹤設定。

如果裝置支援空間音效功能,系統會一律開啟空間音效的預設設定。如需系統 API 的完整清單,請參閱 Spatializer.java

新的頭部追蹤感應器類型 Sensor.TYPE_HEAD_TRACKER 已新增至感應器架構,並由感應器 HAL 公開為藍牙或 USB 上的動態感應器。

整合空間音訊

除了導入空間化效果引擎,原始設備製造商 (OEM) 也必須設定平台音訊支援功能的平台,

需求條件

如要整合空間音效,必須符合下列條件:

  • 音訊 HAL 和音訊 DSP 必須支援空間音訊的專屬輸出路徑。
  • 如要使用頭部追蹤空間音訊,耳機必須內建頭部追蹤感應器。
  • 實作方式必須符合頭部追蹤的建議標準,透過 HID 通訊協定從藍牙耳機傳送至手機。
  • 如要支援空間音訊,必須使用 Audio HAL 7.1

請按照下列步驟整合空間音訊:

  1. device.mk 檔案中宣告空間音訊支援,如下所示:

    PRODUCT_PROPERTY_OVERRIDES += \
         ro.audio.spatializer_enabled=true
    

    這會導致 AudioService 初始化空間化器支援功能。

  2. audio_policy_configuration.xml 中宣告空間音訊組合的專屬輸出內容,如下所示:

    <audioPolicyConfiguration>
      <modules>
       <module>
         <mixPorts>
         <mixPort name="spatializer" role="source"   flags="AUDIO_OUTPUT_FLAG_SPATIALIZER">
           <profile name="sa" format="AUDIO_FORMAT_PCM_FLOAT"
             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
    
  3. audio_effects.xml 中宣告空間化效果程式庫,如下所示:

    <audio_effects_conf>
          <libraries>
             <library name="spatializer_lib" path="libMySpatializer.so"/>
              
             </libraries>
          <effects>
           <effect name="spatializer" library="spatializer_lib" uuid="myunique-uuid-formy-spatializereffect"/>
    
  4. 導入空間化器效果的供應商必須符合下列規定:

    • 基本設定和控制項與 「效果 HAL」中的其他效果相同。
    • 讓架構探索支援的功能和設定所需的特定參數,例如:

      • SPATIALIZER_PARAM_SUPPORTED_LEVELS
      • SPATIALIZER_PARAM_LEVEL
      • SPATIALIZER_PARAM_HEADTRACKING_SUPPORTED
      • SPATIALIZER_PARAM_HEADTRACKING_MODE
      • SPATIALIZER_PARAM_SUPPORTED_CHANNEL_MASKS
      • SPATIALIZER_PARAM_SUPPORTED_SPATIALIZATION_MODES
      • SPATIALIZER_PARAM_HEAD_TO_STAGE

    詳情請參閱 effect_spatializer.h

建議

建議原始設備製造商 (OEM) 在導入過程中遵循下列規範:

  • 在可用時使用低功耗音訊,以便輕鬆實現互通性和延遲目標。
  • 從感應器動作偵測到耳機接收的音訊,往返延遲時間必須小於 150 毫秒,才能提供良好的使用者體驗。
  • 如果是具備進階音訊發布設定檔 (A2DP) 的傳統藍牙 (BT),請按照下列步驟操作:
    • 使用低延遲編解碼,例如 Opus
    • Audio HAL 中實作延遲控制功能。這可在關閉頭部追蹤時啟用電力和效能最佳化功能,並在非最佳情況下停用頭部追蹤功能。

驗證

如要驗證空間音訊功能的功能,請使用 SpatializerTest.java 中提供的 CTS 測試。

如果空間化或頭部追蹤演算法實作不佳,可能無法達到最佳化建議中列出的往返延遲最佳化建議。