Audio espacial y seguimiento de cabeza

Android 13 presenta una forma estándar para que los OEM admitan audio espacial y seguimiento de la cabeza sin necesidad de personalizaciones o SDKs específicos del proveedor.

El audio espacial es una tecnología que se usa para crear un campo de sonido que rodea al usuario. El audio espacial permite que los usuarios perciban canales y sonidos individuales en posiciones que difieren de las posiciones físicas de los transductores del dispositivo de audio que se usa para la reproducción. Por ejemplo, el audio espacial ofrece al usuario la capacidad de escuchar una banda sonora multicanal con auriculares. Con el audio espacial, los usuarios de auriculares pueden percibir el diálogo frente a ellos y los efectos envolventes detrás de ellos, a pesar de tener solo dos transductores para la reproducción.

El seguimiento de la cabeza ayuda al usuario a comprender la naturaleza del escenario de sonido espacializado que se simula alrededor de su cabeza. Esta experiencia solo es eficaz cuando la latencia es baja, y esta se mide como el tiempo que transcurre entre el momento en que el usuario mueve la cabeza y el momento en que escucha la posición del altavoz virtual moverse según corresponda.

Android 13 ofrece procesamiento de audio espacial en el nivel más bajo posible en el embudo de audio para obtener la latencia más baja posible, lo que optimiza el audio espacial y el seguimiento de la cabeza.

Arquitectura

El framework y la API de audio de Android modificados en Android 13 facilitan la adopción de la tecnología de audio espacial en todo el ecosistema.

En la siguiente imagen, se ilustran los cambios relacionados con el audio espacial que se realizaron en la arquitectura de la canalización de audio con Android 13:

spatial-audio

Figura 1: Arquitectura de canalización de audio con espacializador

En el nuevo modelo, el espacializador forma parte del framework de audio y está desvinculado del decodificador. El espacializador recibe contenido de audio mixto y renderiza una transmisión estéreo a la HAL de audio. La desvinculación del espacializador del decoder permite a los OEMs elegir diferentes proveedores para el decoder y el espacializador, y lograr la latencia de ida y vuelta deseada para el seguimiento de la cabeza. Este nuevo modelo también incluye hooks al framework del sensor para el seguimiento de la cabeza.

En la siguiente figura, se ilustra la arquitectura del sistema del framework de audio para el efecto espacializador y seguimiento de cabeza:

spatial-sys-arch

Figura 2: Arquitectura de sistemas con espacializador y seguimiento de cabeza

Todas las APIs de audio espacial se agrupan en la clase pública Spatializer a nivel de la app. La clase SpatializerHelper en el servicio de audio interactúa con los componentes de la IU del sistema para administrar la funcionalidad relacionada con el espacializador según la plataforma y las capacidades del dispositivo conectado. La nueva clase Spatializer en el servicio de política de audio crea y controla el grafo de audio espacial necesario para la mezcla y la espacialización multicanal en función de las funciones que expresa el OEM, los dispositivos conectados y los casos de uso activos. Una nueva clase de mezclador SpatializerThread mezcla pistas multicanal y envía la combinación resultante a un motor de efectos de posprocesamiento que renderiza una salida estéreo en el HAL de audio. Para el seguimiento de la cabeza, la clase SpatializerPoseController agrupa funciones relacionadas con el seguimiento de la cabeza, para interactuar con la pila de sensores y para combinar y filtrar los indicadores de los sensores que se alimentan al motor de efectos. Los datos del sensor de seguimiento de cabeza se transmiten a través del protocolo HID desde el controlador Bluetooth.

Los cambios en la arquitectura de la canalización de audio de Android 13 mejoran lo siguiente:

  • Se reducirá la latencia entre el espacializador y los auriculares.
  • Proporcionar APIs unificadas para los desarrolladores de apps
  • Controla el estado del seguimiento de la cabeza a través de las APIs del sistema.
  • Detecta sensores de seguimiento de la cabeza y asócialos con dispositivos de audio activos.
  • Combinar indicadores de varios sensores y calcular la postura de la cabeza que puede consumir el motor de efectos de espacialización

Las funciones como la compensación de sesgo, la detección de inactividad y la limitación de frecuencia se pueden implementar con la biblioteca de utilidad de seguimiento de cabeza.

APIs de audio espacial

Android 13 ofrece un sistema de audio espacial y APIs para desarrolladores.

Los OEMs pueden adaptar el comportamiento de la app según la disponibilidad de funciones y el estado habilitado, que establecen las APIs del sistema. Las apps también pueden configurar atributos de audio para inhabilitar el audio espacial por razones estéticas o para indicar que la transmisión de audio ya se procesó para el sonido espacial.

Para ver las APIs para desarrolladores, consulta Spatializer.

Los OEMs pueden usar las APIs del sistema para implementar la IU de configuración de sonidos y Bluetooth, lo que permite al usuario controlar el estado del audio espacial y la función de seguimiento de la cabeza para su dispositivo. El usuario puede habilitar o inhabilitar el audio espacial para la bocina y los auriculares con cable en la IU de la configuración de sonidos. La configuración de audio espacial para la bocina solo está disponible si la implementación del efecto de espacializador admite el modo transaural.

El usuario también puede habilitar o inhabilitar el audio espacial y el seguimiento de la cabeza en la configuración del dispositivo Bluetooth de cada dispositivo. La configuración del seguimiento de cabeza solo está disponible si los auriculares Bluetooth exponen un sensor de seguimiento de cabeza.

La configuración predeterminada del audio espacial siempre está ACTIVADA si la función es compatible. Consulta Spatializer.java para obtener una lista completa de las APIs del sistema.

El nuevo tipo de sensor de seguimiento de cabeza Sensor.TYPE_HEAD_TRACKER se agrega al framework de sensores y el HAL de sensores lo expone como un sensor dinámico a través de Bluetooth o USB.

Cómo integrar el audio espacial

Además de implementar el motor de efectos de espacialización, los OEMs deben configurar su plataforma para admitir el audio espacial.

Requisitos

Para integrar el audio espacial, se deben cumplir los siguientes requisitos:

  • El HAL de audio y el DSP de audio deben admitir una ruta de salida dedicada para el audio espacial.
  • En el caso del audio espacial con seguimiento de cabeza, los auriculares deben tener sensores de seguimiento de cabeza integrados.
  • La implementación debe cumplir con el estándar propuesto para el seguimiento de la cabeza a través del protocolo HID desde auriculares Bluetooth a un teléfono.
  • Se necesita Audio HAL v7.1 para admitir el audio espacial.

Sigue estos pasos para integrar el audio espacial:

  1. Declara la compatibilidad con el audio espacial en tu archivo device.mk de la siguiente manera:

    PRODUCT_PROPERTY_OVERRIDES += \
         ro.audio.spatializer_enabled=true
    

    Esto hace que AudioService inicialice la compatibilidad con el espacializador.

  2. Declara una salida dedicada para la mezcla de audio espacial en audio_policy_configuration.xml, de la siguiente manera:

    <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. Declara la biblioteca de efectos de espacialización en audio_effects.xml de la siguiente manera:

    <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. Los proveedores que implementen el efecto de espacializador deben cumplir con lo siguiente:

    • Configuración y control básicos idénticos a otros efectos en el HAL de efectos.
    • Parámetros específicos necesarios para que el framework descubra las capacidades y la configuración compatibles, como los siguientes:

      • 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

    Consulta effect_spatializer.h para obtener más información.

Recomendaciones

Recomendamos que los OEMs usen los siguientes lineamientos durante la implementación:

  • Usa audio LE cuando esté disponible para facilitar la interoperabilidad y lograr los objetivos de latencia.
  • La latencia de ida y vuelta, desde la detección de movimiento del sensor hasta el audio que reciben los auriculares, debe ser inferior a 150 ms para lograr una buena UX.
  • Para Bluetooth (BT) clásico con perfil de distribución de audio avanzada (A2DP):
    • Usa un códec de latencia baja, como Opus.
    • Implementa funciones de control de latencia en la HAL de audio. Esto habilita la optimización de la energía y el rendimiento cuando el seguimiento de cabeza está desactivado, así como la inhabilitación del seguimiento en condiciones no óptimas.

Validación

Para validar la funcionalidad de la función de audio espacial, usa las pruebas de CTS disponibles en SpatializerTest.java.

Una implementación deficiente de los algoritmos de espacialización o seguimiento de la cabeza puede provocar que no se cumpla la recomendación de latencia de ida y vuelta que se indica en las Recomendaciones.