เสียงรอบทิศทางและการติดตามการเคลื่อนไหวของศีรษะ

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

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

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

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

สถาปัตยกรรม

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

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

spatial-audio

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

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

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

spatial-sys-arch

รูปที่ 2 สถาปัตยกรรมระบบพร้อมตัวสร้างเสียงรอบทิศทางและการติดตามการเคลื่อนไหวของศีรษะ

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

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

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

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

API เสียงรอบทิศทาง

Android 13 มี API ระบบและ API สำหรับนักพัฒนาแอปสำหรับเสียงรอบทิศทาง

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

ดู API ที่นักพัฒนาแอปใช้ได้ที่ Spatializer

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

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

การตั้งค่าเริ่มต้นสำหรับเสียงรอบทิศทางจะเปิดอยู่เสมอหากระบบรองรับฟีเจอร์นี้ ดูรายการ API ของระบบทั้งหมดได้ที่ Spatializer.java

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

ผสานรวมเสียงรอบทิศทาง

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

ข้อกำหนด

คุณต้องมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้จึงจะผสานรวมเสียงรอบทิศทางได้

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

การตรวจสอบ

หากต้องการตรวจสอบฟังก์ชันการทำงานของฟีเจอร์เสียงรอบทิศทาง ให้ใช้การทดสอบ CTS ที่มีอยู่ใน SpatializerTest.java

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