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

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

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

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

ระบบย่อย Sound Trigger ถูกสร้างขึ้นเป็นชั้นๆ ดังแสดงในรูปที่ 1:

sound_trigger_stack

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

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

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

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

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

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

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

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

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

อินเทอร์เฟซ STHAL ถูกระบุภายใต้ /hardware/interfaces/soundtrigger/

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

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

sthal_state

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

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

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

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

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

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

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

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

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

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