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

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

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

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

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

สถาปัตยกรรม

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

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

spatial-audio

รูปที่ 1 สถาปัตยกรรมไปป์ไลน์เสียงที่มีโปรแกรมจำลองเสียงรอบทิศทาง

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

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

spatial-sys-arch

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

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

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

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

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

Spatial audio API

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

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

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

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

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

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

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

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

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

ข้อกำหนด

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

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

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

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

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