空间音频和头部跟踪

Android 13 引入了一种标准方式,让原始设备制造商 (OEM) 能够支持空间音频和头部跟踪,而无需供应商专用的自定义或 SDK。

空间音频是一种技术,用于营造环绕听众的声场。借助空间音频功能,用户能够以与播放所用的音频设备变频器的实际位置不同的位置来感知声道和单个声音。例如,借助空间音频功能,用户能够通过头戴式耳机聆听多声道音轨。使用空间音频功能时,尽管头戴式耳机只有两个变频器用于播放音频,但用户可以感知自己面前的对话,以及身后的环绕效果。

头部跟踪功能可以帮助用户理解围绕其头部模拟的空间化声场的性质。这种体验只有在延迟时间较短时才有效,延迟时间以用户转动头部以及听到虚拟扬声器位置进行相应移动之间的时间差来衡量。

Android 13 针对空间音频和头部跟踪进行了优化,具体方法是在音频管道中提供最低限度的空间音频处理,以尽可能缩短延迟时间。

架构

Android 13 对 Android 音频框架和 API 进行了修改,以促进空间音频技术在整个生态系统中得到采用。

下图展示了 Android 13 对音频管道架构进行的与空间音频相关的更改:

spatial-audio

图 1. 包含空间化程序的音频管道架构

在新模型中,空间化程序是音频框架的一部分,并已从解码器中分离出来。空间化程序接收混合音频内容,并将立体声流呈现到音频 HAL。将空间化程序与解码器分离后,OEM 能够为解码器和空间化程序选择不同的供应商,并实现进行头部跟踪所需的理想往返延迟时间。这一新模型还包含头部跟踪功能所需的指向传感器框架的钩子。

下图展示了空间化程序和头部跟踪效果所需的音频框架的系统架构:

spatial-sys-arch

图 2. 包含空间化程序和头部跟踪功能的系统架构

所有空间音频 API 均归入应用级的公共 Spatializer 类。音频服务中的 SpatializerHelper 类会与系统界面组件进行交互,从而根据平台以及已连接设备的功能来管理与空间化程序相关的功能。音频政策服务中新增的 Spatializer 类会根据 OEM 表示的功能、已连接的设备和有效用例来创建和管理进行多声道混音和空间化所需的空间音频图。新的混音器类 SpatializerThread 会对多声道音轨进行混音,并将生成的混音传递给后处理 FX 引擎,该引擎会将立体声输出呈现到音频 HAL。对于头部跟踪,SpatializerPoseController 会对与头部跟踪相关的函数进行分组,以与传感器堆栈进行交互,以及合并和过滤传递到效果引擎的传感器信号。头部跟踪传感器数据通过蓝牙驱动程序中的 HID 协议进行传输。

对 Android 13 音频管道架构的更改实现了以下几方面的改进:

  • 缩短了空间化程序和头戴式耳机之间的延迟时间。
  • 提供统一的 API 为应用开发者提供服务。
  • 通过系统 API 控制头部跟踪状态。
  • 发现头部跟踪传感器,并将其与活跃音频设备相关联。
  • 合并来自各种传感器的信号并计算头部姿势,以供空间化程序效果引擎使用。

您可以使用头部跟踪实用程序库来实现偏差补偿、静止检测和速率限制等功能。

空间音频 API

Android 13 提供空间音频系统和开发者 API。

OEM 可以根据功能可用性和启用状态(由系统 API 设置)调整应用行为。应用还可以配置音频属性,以便为了美观而停用空间音频,或指出音频串流已经过空间音频处理

如需了解面向开发者的 API,请参阅 Spatializer

OEM 可以使用系统 API 来实现“声音设置”和“蓝牙设置”界面,让用户能够控制空间音频的状态和设备的头部跟踪功能。用户可以在“声音设置”界面中为音响设备和有线耳机启用或停用空间音频。只有在空间化程序效果实现支持双耳模式时,扬声器的空间音频设置才可用。

用户还可以在每台设备的蓝牙设备设置中启用或停用空间音频和头部跟踪功能。只有当蓝牙耳机包含头部跟踪传感器时,头部跟踪设置才可用。

空间音频的默认设置始终开启(如果支持此功能)。如需查看系统 API 的完整列表,请参阅 Spatializer.java

新的头部跟踪传感器类型 Sensor.TYPE_HEAD_TRACKER 已添加到传感器框架中,并且传感器 HAL 会通过蓝牙或 USB 将其公开为动态传感器。

集成空间音频

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

要求

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

  • 音频 HAL 和音频 DSP 必须支持空间音频的专用输出路径。
  • 耳机必须包含内置头部跟踪器传感器,才能收听头部跟踪空间音频。
  • 此实现必须符合通过从蓝牙耳机到手机的 HID 协议进行头部跟踪的相关拟定标准。
  • 若要实现空间音频支持,您需要使用音频 HAV 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. 实现空间化程序效果的供应商必须符合以下要求:

    • 提供与效果 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
    • 音频 HAL 处实现延迟控制功能。 这样一来,即可在头部跟踪功能处于关闭状态时实现功耗和性能优化,并在不理想条件下停用头部跟踪功能。

验证

如需验证空间音频功能能否正常运行,请使用 SpatializerTest.java 中提供的 CTS 测试。

空间化或头部跟踪算法实现不当可能会导致实际延迟时间与建议中列出的往返延迟时间的建议值不符。