空间音频和头部追踪

Android 13 引入了一种标准方式,供 OEM 提供对空间音频和头部追踪的支持,而无需供应商特定的自定义项或 SDK。

空间音频是一种用于创建环绕听众的声场的音频技术。借助空间音频,用户可以在与音频设备播放换能器的物理位置不同的位置感知声道和各个声音。例如,空间音频让用户能够通过耳机收听多声道音轨。借助空间音频,耳机用户可以感知到面前的对话以及身后的环绕效果,即使只有两个换能器用于播放也是如此。

头部追踪有助于用户了解围绕头部模拟的空间化声场的性质。只有在延迟较低时,此体验才有效;延迟是指用户移动头部到听到虚拟扬声器位置随之移动之间的时间。

Android 13 通过在音频管道中尽可能低的级别提供空间音频处理来优化空间音频和头部追踪,从而获得尽可能低的延迟。

架构

经过修改的 Android 音频框架和 Android 13 中的 API 有助于在整个生态系统中采用空间音频技术。

下图说明了 Android 13 对音频管道架构所做的与空间音频相关的更改

spatial-audio

图 1. 带有空间化器的音频管道架构

在新模型中,空间化器是音频框架的一部分,并且与解码器分离。空间化器接收混合音频内容,并将立体声流渲染到 Audio HAL。将空间化器与解码器分离后,OEM 可以为解码器和空间化器选择不同的供应商,并实现头部追踪所需的往返延迟。此新模型还包括连接到传感器框架的钩子,用于进行头部追踪。

下图说明了空间化器和头部追踪效果的音频框架的系统架构

spatial-sys-arch

图 2. 带有空间化器和头部追踪的系统架构

所有空间音频 API 都分组在应用级别的公共 Spatializer 类中。音频服务中的 SpatializerHelper 类与 System 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 控制其设备的空间音频和头部追踪功能的状态。用户可以在“声音”设置 UI 中为扬声器和有线耳机启用或停用空间音频。仅当空间化器效果实现支持双耳声模式时,扬声器的空间音频设置才可用。

用户还可以在每个设备的“蓝牙设备”设置中启用或停用空间音频和头部追踪。仅当蓝牙耳机公开头部追踪传感器时,头部追踪设置才可用。

如果支持空间音频功能,则其默认设置始终为“开启”。如需系统 API 的完整列表,请参阅 Spatializer.java

新的头部追踪传感器类型 Sensor.TYPE_HEAD_TRACKER 已添加到传感器框架,并由传感器 HAL 作为蓝牙或 USB 上的动态传感器公开。

集成空间音频

除了实现空间化器效果引擎之外,OEM 还必须配置其平台以支持空间音频。

要求

要集成空间音频,必须满足以下要求

  • Audio HAL 和音频 DSP 必须支持空间音频的专用输出路径。
  • 对于带有头部追踪的空间音频,耳机必须具有内置的头部追踪传感器。
  • 该实现必须符合针对通过 HID 协议从蓝牙耳机到手机的头部追踪而提出的标准。
  • 空间音频支持需要Audio 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 在实现期间使用以下准则

  • 在 LE 音频可用时使用它,以简化互操作性并实现延迟目标。
  • 从传感器运动检测到耳机接收到音频的往返延迟必须小于 150 毫秒,才能获得良好的用户体验。
  • 对于采用高级音频分发配置文件 (A2DP) 的蓝牙 (BT) 传统版
    • 使用低延迟编解码器,例如 Opus
    • Audio HAL 中实现延迟控制功能。这样可以在头部追踪关闭时优化功耗和性能,并在非最佳条件下停用头部追踪。

验证

要验证空间音频功能的功能,请使用 SpatializerTest.java 中提供的 CTS 测试。

空间化或头部追踪算法的糟糕实现可能会导致无法满足建议中列出的往返延迟建议。