空間音訊和頭部追蹤

Android 13 推出標準方式,讓原始設備製造商支援空間音訊和頭部追蹤功能,不必使用廠商專屬的自訂項目或 SDK。

空間音訊技術可為聽眾打造環繞音場,空間音訊可讓使用者在不同位置感知聲道和個別聲音,這些位置與用於播放音訊的裝置轉換器實體位置不同。舉例來說,空間音訊可讓使用者透過耳機聆聽多聲道原聲帶。使用空間音訊時,耳機使用者可以感覺到對話來自前方,環繞效果來自後方,但實際上只有兩個感應器用於播放。

頭部追蹤功能可協助使用者瞭解頭部周圍模擬的空間音場性質。只有在延遲時間較短時,這項功能才能發揮效果。延遲時間是指使用者移動頭部到聽到虛擬音箱位置隨之移動的間隔時間。

Android 13 會在音訊管道中盡可能降低空間音效處理層級,以盡量縮短延遲時間,進而最佳化空間音效和頭部追蹤功能。

建築

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

下圖說明 Android 13 對音訊管道架構進行的空間音訊相關變更:

spatial-audio

圖 1. 音訊管道架構 (含空間化器)

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

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

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

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

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

如果裝置支援空間音訊,這項功能預設為開啟。如需系統 API 的完整清單,請參閱 Spatializer.java

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

整合空間音訊

除了實作空間音效引擎,原始設備製造商也必須設定平台,才能支援空間音訊。

需求條件

如要整合空間音效,必須符合下列規定:

  • 音訊 HAL 和音訊 DSP 必須支援空間音訊的專屬輸出路徑。
  • 如要使用頭部追蹤空間音訊,耳機必須內建頭部追蹤感應器。
  • 實作時必須遵守建議的標準,透過 HID 協定,將頭部追蹤資料從藍牙耳機傳輸到手機。
  • 音訊 HAL v7.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. 實作空間音效的供應商必須遵守下列規定:

    • 基本設定和控制項與 Effect 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):
    • 使用低延遲編解碼器,例如 Opus
    • Audio HAL 中實作延遲控制函式。 這樣一來,系統就能在頭部追蹤功能關閉時最佳化電力和效能,並在非最佳狀態下停用頭部追蹤功能。

驗證

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

如果空間化或頭部追蹤演算法的實作方式不當,可能會導致無法達到「建議」中列出的來回延遲建議。