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

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

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

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

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

สถาปัตยกรรม

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

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

spatial-audio

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

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

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

spatial-sys-arch

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

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

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

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

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

Spatial Audio API

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

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

สำหรับ API ที่มีไว้สำหรับนักพัฒนาซอฟต์แวร์ โปรดดู Spatializer

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

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

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

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

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

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

ข้อกำหนด

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

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

การตรวจสอบความถูกต้อง

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

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