เสียงเชิงพื้นที่และการติดตามศีรษะ

Android 13 แนะนำวิธีมาตรฐานสำหรับ OEM เพื่อรองรับเสียงเชิงพื้นที่และการติดตามศีรษะโดยไม่จำเป็นต้องปรับแต่งหรือ SDK เฉพาะผู้จำหน่าย

เสียงเชิงพื้นที่ เป็นเทคโนโลยีที่ใช้ในการสร้างสนามเสียงที่อยู่รอบตัวผู้ฟัง เสียงเชิงพื้นที่ช่วยให้ผู้ใช้รับรู้ช่องและเสียงแต่ละรายการในตำแหน่งที่แตกต่างจากตำแหน่งทางกายภาพของทรานสดิวเซอร์ของอุปกรณ์เสียงที่ใช้ในการเล่น ตัวอย่างเช่น เสียงเชิงพื้นที่ทำให้ผู้ใช้สามารถฟังเพลงซาวด์แทร็กแบบหลายช่องสัญญาณผ่านหูฟังได้ การใช้เสียงเชิงพื้นที่ ผู้ใช้หูฟังสามารถรับรู้บทสนทนาที่อยู่ตรงหน้า และเอฟเฟ็กต์เซอร์ราวด์ที่อยู่ด้านหลัง แม้ว่าจะมีทรานสดิวเซอร์เพียงสองตัวสำหรับการเล่นก็ตาม

การติดตามศีรษะ ช่วยให้ผู้ใช้เข้าใจธรรมชาติของเวทีเสียงเชิงพื้นที่ที่ถูกจำลองขึ้นรอบๆ ศีรษะ ประสบการณ์นี้จะมีผลก็ต่อเมื่อเวลาแฝงต่ำ โดยเวลาแฝงจะวัดเป็นเวลาระหว่างเวลาที่ผู้ใช้ขยับศีรษะกับเวลาที่ได้ยินตำแหน่งลำโพงเสมือนเคลื่อนไหวตามนั้น

Android 13 ปรับให้เหมาะสมสำหรับเสียงเชิงพื้นที่และการติดตามศีรษะโดยเสนอการประมวลผลเสียงเชิงพื้นที่ในระดับต่ำสุดที่เป็นไปได้ในไปป์ไลน์เสียงเพื่อให้ได้เวลาแฝงที่ต่ำที่สุดเท่าที่จะเป็นไปได้

สถาปัตยกรรม

เฟรมเวิร์กเสียงและ API ของ Android ที่ได้รับการปรับเปลี่ยนใน Android 13 ช่วยให้การนำเทคโนโลยีเสียงเชิงพื้นที่มาใช้ทั่วทั้งระบบนิเวศ

รูปต่อไปนี้แสดงการเปลี่ยนแปลงที่เกี่ยวข้องกับเสียงเชิงพื้นที่ที่เกิดขึ้นกับสถาปัตยกรรมไปป์ไลน์เสียงด้วย Android 13:

spatial-audio

รูปที่ 1 สถาปัตยกรรมไปป์ไลน์เสียงพร้อม Spatializer

ในโมเดลใหม่ Spatializer เป็นส่วนหนึ่งของเฟรมเวิร์กเสียงและแยกออกจากตัวถอดรหัส Spatializer รับเนื้อหาเสียงแบบผสมและเรนเดอร์สตรีมสเตอริโอไปยัง Audio HAL การแยกตัวถอดรหัสเชิงพื้นที่ออกจากตัวถอดรหัสช่วยให้ OEM สามารถเลือกผู้จำหน่ายที่แตกต่างกันสำหรับตัวถอดรหัสและตัวถอดรหัสและเพื่อให้ได้เวลาแฝงไปกลับที่ต้องการสำหรับการติดตามส่วนหัว รุ่นใหม่นี้ยังรวมตะขอเข้ากับกรอบเซ็นเซอร์สำหรับการติดตามศีรษะอีกด้วย

รูปภาพต่อไปนี้แสดงสถาปัตยกรรมระบบของเฟรมเวิร์กเสียงสำหรับเอฟเฟกต์การกำหนดตำแหน่งและการติดตามส่วนหัว:

spatial-sys-arch

รูปที่ 2 สถาปัตยกรรมระบบพร้อม Spatializer และการติดตามส่วนหัว

API เสียงเชิงพื้นที่ ทั้งหมดจัดกลุ่มไว้ในคลาส Spatializer สาธารณะที่ระดับแอป คลาส SpatializerHelper ในอินเทอร์เฟซบริการเสียงพร้อมส่วนประกอบ System UI เพื่อจัดการฟังก์ชันการทำงานที่เกี่ยวข้องกับ Spatializer ตามแพลตฟอร์มและความสามารถของอุปกรณ์ที่เชื่อมต่อ คลาส Spatializer ใหม่ในบริการนโยบายเสียงจะสร้างและควบคุมกราฟเสียงเชิงพื้นที่ที่จำเป็นสำหรับการผสมหลายช่องสัญญาณและการกำหนดตำแหน่งตาม ความสามารถที่แสดงโดย OEM อุปกรณ์ที่เชื่อมต่อ และกรณีการใช้งานที่ใช้งานอยู่ SpatializerThread คลาสมิกเซอร์ใหม่จะผสมแทร็กหลายช่องสัญญาณและฟีดมิกซ์ผลลัพธ์ไปยังกลไก FX หลังการประมวลผลที่เรนเดอร์เอาต์พุตสเตอริโอไปยัง Audio HAL สำหรับการติดตามศีรษะ กลุ่มคลาส SpatializerPoseController จะทำหน้าที่ที่เกี่ยวข้องกับการติดตามศีรษะ เพื่อเชื่อมต่อกับกลุ่มเซ็นเซอร์ และเพื่อรวมและกรองสัญญาณเซ็นเซอร์ที่ป้อนไปยังเอฟเฟกต์เอ็นจิ้น ข้อมูลเซ็นเซอร์ติดตามศีรษะจะถูกส่งผ่าน โปรโตคอล HID จากไดรเวอร์ Bluetooth

การเปลี่ยนแปลงสถาปัตยกรรมไปป์ไลน์เสียงของ Android 13 ได้รับการปรับปรุงดังต่อไปนี้:

  • ลดเวลาแฝงระหว่าง Spatializer และหูฟัง
  • จัดหา API แบบรวมเพื่อให้บริการนักพัฒนาแอป
  • การควบคุมสถานะการติดตามส่วนหัวผ่าน API ของระบบ
  • การค้นพบเซ็นเซอร์ติดตามศีรษะและเชื่อมโยงกับอุปกรณ์เสียงที่ใช้งานอยู่
  • การรวมสัญญาณจากเซ็นเซอร์ต่างๆ และคำนวณท่าโพสของศีรษะที่เอ็นจิ้นเอฟเฟกต์เชิงพื้นที่สามารถใช้ได้

สามารถใช้ฟังก์ชันต่างๆ เช่น การชดเชยอคติ การตรวจจับความนิ่ง และการจำกัดอัตราได้โดยใช้ ไลบรารียูทิลิตี้การติดตามศีรษะ

API เสียงเชิงพื้นที่

Android 13 นำเสนอระบบเสียงเชิงพื้นที่และ API สำหรับนักพัฒนา

OEM สามารถปรับพฤติกรรมของแอปตามความพร้อมใช้งานของฟีเจอร์และสถานะการเปิดใช้งาน ซึ่งกำหนดโดย API ของระบบ แอปยังสามารถกำหนดค่าคุณลักษณะเสียงเพื่อ ปิดใช้งานเสียงเชิงพื้นที่ เพื่อความสวยงาม หรือเพื่อระบุว่าสตรีมเสียงได้ รับการประมวลผลสำหรับเสียงเชิงพื้นที่แล้ว

สำหรับ API สำหรับนักพัฒนา โปรดดูที่ Spatializer

OEM สามารถใช้ API ของระบบเพื่อใช้ UI การตั้งค่าเสียงและบลูทูธ ซึ่งช่วยให้ผู้ใช้สามารถควบคุมสถานะของเสียงเชิงพื้นที่และคุณลักษณะการติดตามศีรษะสำหรับอุปกรณ์ของตนได้ ผู้ใช้สามารถเปิดหรือปิดเสียงเชิงพื้นที่สำหรับลำโพงและหูฟังแบบมีสายได้ใน UI การตั้งค่าเสียง การตั้งค่าเสียงเชิงพื้นที่สำหรับลำโพงจะใช้งานได้เฉพาะในกรณีที่การใช้เอฟเฟกต์ Spatializer รองรับโหมด Transaural

ผู้ใช้ยังสามารถเปิดหรือปิดใช้งานเสียงเชิงพื้นที่และการติดตามศีรษะในการตั้งค่าอุปกรณ์ Bluetooth สำหรับแต่ละอุปกรณ์ การตั้งค่าการติดตามศีรษะจะใช้งานได้ก็ต่อเมื่อชุดหูฟัง Bluetooth เปิดเผยเซ็นเซอร์ติดตามศีรษะ

การตั้งค่าเริ่มต้นสำหรับเสียงเชิงพื้นที่จะเปิดอยู่เสมอหากคุณสมบัตินี้รองรับ ดู Spatializer.java สำหรับรายการ API ระบบทั้งหมด

เซ็นเซอร์ประเภทเซ็นเซอร์ติดตามศีรษะใหม่ Sensor.TYPE_HEAD_TRACKER ถูกเพิ่มในกรอบงานเซ็นเซอร์และเปิดเผยโดยเซ็นเซอร์ HAL เป็นเซ็นเซอร์แบบไดนามิกผ่าน Bluetooth หรือ USB

บูรณาการเสียงเชิงพื้นที่

นอกเหนือจากการใช้เอ็นจิ้นเอฟเฟกต์ Spatializer แล้ว OEM จะต้องกำหนดค่าแพลตฟอร์มของตนเพื่อรองรับเสียงเชิงพื้นที่

ความต้องการ

ต้องเป็นไปตามข้อกำหนดต่อไปนี้เพื่อรวมเสียงเชิงพื้นที่:

  • Audio HAL และ audio DSP ต้องรองรับเส้นทางเอาต์พุตเฉพาะสำหรับเสียงเชิงพื้นที่
  • สำหรับเสียงเชิงพื้นที่ที่มีการติดตามศีรษะ หูฟังต้องมีเซ็นเซอร์ติดตามศีรษะในตัว
  • การใช้งานจะต้องเป็นไปตามมาตรฐานที่เสนอสำหรับการติดตามศีรษะผ่านโปรโตคอล HID จากชุดหูฟังบลูทูธไปยังโทรศัพท์
  • จำเป็นต้องใช้ Audio HAL v7.1 สำหรับการรองรับเสียงเชิงพื้นที่

บูรณาการเสียงเชิงพื้นที่โดยใช้ขั้นตอนต่อไปนี้:

  1. ประกาศการรองรับเสียงเชิงพื้นที่ในไฟล์ device.mk ของคุณดังต่อไปนี้:

    PRODUCT_PROPERTY_OVERRIDES += \
         ro.audio.spatializer_enabled=true
    

    ซึ่งทำให้ AudioService เริ่มต้นการสนับสนุน spatializer

  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. ประกาศไลบรารีเอฟเฟกต์ spatializer ใน 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. ผู้ขายที่ใช้เอฟเฟกต์ Spatializer จะต้องปฏิบัติตามสิ่งต่อไปนี้:

    • การกำหนดค่าและการควบคุมพื้นฐานเหมือนกับเอฟเฟกต์อื่นๆ ใน 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 ms สำหรับ UX ที่ดี
  • สำหรับ Bluetooth (BT) Classic ที่มีโปรไฟล์การกระจายเสียงขั้นสูง (A2DP):
    • ใช้ตัวแปลงสัญญาณที่มีความหน่วงต่ำ เช่น Opus
    • ใช้ฟังก์ชันควบคุมเวลาในการตอบสนองที่ Audio HAL ซึ่งช่วยให้สามารถเพิ่มประสิทธิภาพด้านพลังงานและประสิทธิภาพได้เมื่อปิดการติดตามศีรษะ และปิดใช้งานการติดตามศีรษะในระหว่างสภาวะที่ไม่เหมาะสม

การตรวจสอบ

หากต้องการตรวจสอบฟังก์ชันการทำงานของคุณลักษณะเสียงเชิงพื้นที่ ให้ใช้การทดสอบ CTS ที่มีอยู่ใน SpatializerTest.java

การใช้งานอัลกอริธึมการกำหนดพื้นที่หรือการติดตามส่วนหัวที่ไม่ดีอาจทำให้เกิดความล้มเหลวในการตอบสนองข้อเสนอแนะเวลาในการตอบสนองแบบไปกลับตามที่ระบุไว้ใน คำแนะนำ