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

ฟีเจอร์ทริกเกอร์เสียงช่วยให้แอปสามารถฟังเหตุการณ์เสียงบางอย่าง เช่น คีย์เวิร์ด โดยใช้พลังงานต่ำและคำนึงถึงความเป็นส่วนตัว ตัวอย่าง Use Case ของทริกเกอร์เสียง ได้แก่ 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 ผ่านเฟรมเวิร์กเสียง Sound Trigger HAL API มีตัวแฮนเดิลที่มีเหตุการณ์ที่ทริกเกอร์ซึ่งใช้กับเฟรมเวิร์กเสียง ดังนั้น HAL ของทริกเกอร์เสียงและ HAL ของเสียงจึงมักจะใช้กระบวนการเดียวกันเนื่องจากเชื่อมต่อกันอยู่เบื้องหลัง

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

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

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

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

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

sthal_state

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

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

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

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

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

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

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

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

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

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