ทริกเกอร์เสียง

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

หน้านี้แสดงภาพรวมของสถาปัตยกรรมทริกเกอร์เสียงและอินเทอร์เฟซ HAL (Hardware Abstraction Layer)

สแต็กทริกเกอร์เสียง

โดยระบบย่อยทริกเกอร์เสียงจะสร้างขึ้นเป็นเลเยอร์ดังที่แสดงในรูปที่ 1

sound_trigger_stack

รูปที่ 1: สแต็กทริกเกอร์เสียง

รายการต่อไปนี้จะอธิบายแต่ละเลเยอร์ที่แสดงในรูปที่ 1 โดยละเอียด

  • เลเยอร์ HAL (สีเขียว) มีโค้ดเฉพาะของผู้ให้บริการซึ่ง ใช้การอินเทอร์เฟซ Sound Trigger HAL (STHAL)

  • SoundTriggerMiddleware (สีเหลือง) อยู่เหนืออินเทอร์เฟซ HAL โดยจะสื่อสารกับ HAL และรับผิดชอบฟังก์ชันการทำงานต่างๆ เช่น การแชร์ HAL ระหว่างไคลเอ็นต์ต่างๆ การบันทึก การบังคับใช้ สิทธิ์ และการจัดการความเข้ากันได้กับ HAL เวอร์ชันเก่า

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

  • ที่ด้านบนของเลเยอร์ SoundTriggerService สแต็ก (สีน้ำตาล) จะจัดการฟีเจอร์ ที่เฉพาะเจาะจงสำหรับ Assistant และแอปทั่วไปแยกกัน

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

อินเทอร์เฟซ HAL ของทริกเกอร์เสียง

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

อินเทอร์เฟซ STHAL มีการระบุไว้ในส่วน /hardware/interfaces/soundtrigger/

ISoundTriggerHw อินเทอร์เฟซรองรับความสามารถในการมีเซสชันการตรวจหาอย่างน้อย 1 รายการ ที่ทำงานในเวลาที่กำหนด และฟังเหตุการณ์เสียง การเรียกใช้ ISoundTriggerHw.getProperties() จะแสดงผลProperties Structure ซึ่งมีคำอธิบายการใช้งานและความสามารถ

ขั้นตอนพื้นฐานในการตั้งค่าเซสชันอธิบายได้ดังนี้ในรูปที่ 2

sthal_state

รูปที่ 2: แผนภาพสถานะ STHAL

ขั้นตอนต่อไปนี้จะอธิบายแต่ละสถานะโดยละเอียด

  1. ไคลเอ็นต์ HAL โหลดโมเดลโดยใช้ loadSoundModel() หรือ loadPhraseSoundModel() ออบเจ็กต์โมเดลที่ระบุจะบ่งบอกถึงอัลกอริทึมการตรวจจับ (เครื่องมือ) ที่เฉพาะเจาะจงในการใช้งานที่จะใช้ รวมถึงพารามิเตอร์ที่ใช้ได้กับอัลกอริทึมนี้ เมื่อสำเร็จแล้ว เมธอดเหล่านี้จะส่งคืนแฮนเดิลซึ่งใช้เพื่ออ้างอิงโมเดลนี้ในการเรียกใช้ครั้งต่อๆ ไป

  2. เมื่อโหลดโมเดลเรียบร้อยแล้ว ไคลเอ็นต์ HAL จะเรียกใช้ startRecognition() เพื่อเริ่มการตรวจหา การจดจำจะทำงานต่อไปใน เบื้องหลังจนกว่าจะเกิดเหตุการณ์ต่อไปนี้

    1. มีการเรียกใช้ stopRecognition() ในโมเดลนี้
    2. มีการตรวจพบ
    3. ระบบจะยกเลิกการตรวจหาเนื่องจากข้อจำกัดด้านทรัพยากร เช่น เมื่อมีการเริ่ม Use Case ที่มีลำดับความสำคัญสูงกว่า

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

    คุณเริ่มโมเดลเดิมอีกครั้งได้ในภายหลัง และทำกระบวนการนี้ซ้ำได้หลายครั้งตามต้องการ

  3. สุดท้ายนี้ HAL client จะยกเลิกการโหลดโมเดลที่ไม่ได้ใช้งานซึ่งไม่จำเป็นอีกต่อไปผ่าน unloadModel()

จัดการข้อผิดพลาดของ HAL

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