空間音訊和頭部追蹤

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 已新增至 Sensor 架構,並由 Sensor HAL 公開為透過藍牙或 USB 的動態感應器。

整合空間音訊

除了實作空間化效果引擎外,原始設備製造商 (OEM) 還必須設定平台,以便支援空間音訊。

需求條件

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

  • Audio 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. 實作空間化效果的供應商必須遵循下列規定:

    • 基本設定和控制項與 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

建議

我們建議原始設備製造商在導入時遵循下列指南:

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

驗證

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

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