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

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

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

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

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

สถาปัตยกรรม

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

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

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

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

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

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

ระบบอาร์ค

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ข้อกำหนด

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

  • HAL เสียงและ DSP เสียงต้องรองรับเส้นทางเอาต์พุตเฉพาะสำหรับเชิงพื้นที่ เสียง
  • หูฟังต้องมีส่วนหัวในตัวสำหรับเสียงรอบทิศทางที่มีการติดตามการเคลื่อนไหวของศีรษะ เซ็นเซอร์ติดตาม
  • การใช้งานต้องสอดคล้องกับมาตรฐานที่เสนอสำหรับการติดตามการเคลื่อนไหวของศีรษะ ผ่านโปรโตคอล HID จาก ชุดหูฟังบลูทูธไปยังโทรศัพท์
  • เสียง HAL เวอร์ชัน 7.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. ประกาศไลบรารีเอฟเฟกต์เชิงพื้นที่ใน 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. ผู้ให้บริการที่ติดตั้งใช้งานเอฟเฟกต์กระจายภาพต้องปฏิบัติตามหลักเกณฑ์ต่อไปนี้

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

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

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

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