התכונה 'טריגר קול' מאפשרת לאפליקציות להאזין לאירועים אקוסטיים מסוימים, כמו מילות מפתח, בצורה חסכונית באנרגיה תוך שמירה על הפרטיות. תרחישים לדוגמה לשימוש בטריגר של צליל הם Assistant ו'מה מושמע עכשיו'.
בדף הזה מוצגת סקירה כללית על הארכיטקטורה של Sound Trigger ועל הממשק שלו ל-HAL (שכבת הפשטה לחומרה).
סטאק טריגר צליל
מערכת המשנה של הפעלת האודיו מורכבת משכבות, כפי שמוצג באיור 1:
איור 1: סטאק של טריגרים של צלילים
ברשימה הבאה מפורטות כל השכבות שמוצגות באיור 1:
שכבת ה-HAL (בירוק) מכילה את הקוד הספציפי לספק, שמטמיע את הממשק Sound Trigger HAL (STHAL).
SoundTriggerMiddleware
(בצהוב) נמצא מעל ממשק ה-HAL. הוא מתקשר עם ה-HAL ואחראי על פונקציות כמו שיתוף ה-HAL בין לקוחות שונים, רישום ביומן, אכיפת הרשאות וטיפול בתאימות לגרסאות HAL ישנות יותר.המערכת
SoundTriggerService
(בכחול) נמצאת מעל שכבת הביניים. הוא מאפשר שילוב עם תכונות אחרות של המערכת, כמו אירועי טלפוניה וסוללה. בנוסף, הוא שומר מסד נתונים של מודלים של צלילים, שממוינים לפי מזהי מפתח ייחודיים.מעל השכבה
SoundTriggerService
, המקבץ (חום) מטפל בנפרד בתכונות שספציפיות ל-Assistant ובאפליקציות גנריות.
הפונקציה של סטאק Sound Trigger היא לספק אירועים נפרדים שמייצגים אירועי טריגר אקוסטיים. ברוב המקרים, מקבץ הטריגרים של זיהוי צלילים לא מטפל באודיו. לאחר שהאירועים מופעלים, האפליקציות מקבלות גישה לשידור האודיו בפועל, סביב מועד האירועים, על ידי פתיחת אובייקט AudioRecord
דרך ה-framework של האודיו. ממשקי ה-API של HAL לטריגרים של צלילים מספקים אחיזה עם האירוע שהופעל, שמשמש את Audio Framework. לכן, מאחר ש-HAL של הפעלת האודיו ו-HAL של האודיו מחוברים מתחת לפני השטח, הם בדרך כלל משתפים תהליך.
ממשק HAL של Sound Trigger
ממשק ה-HAL (STHAL) של Sound Trigger הוא החלק הספציפי לספק ב-stack של Sound Trigger, והוא מטפל בזיהוי חומרה של מילות מפתח וצלילים אחרים. STHAL מספק מנוע אחד או יותר, ובכל אחד מהם פועל אלגוריתם שונה שנועד לזהות סוג מסוים של צלילים. כש-STHAL מזהה טריגר, הוא שולח אירוע למסגרת ואז מפסיק את הזיהוי.
ממשק STHAL מצוין בקטע /hardware/interfaces/soundtrigger/
.
הממשק ISoundTriggerHw
תומך באפשרות להפעיל סשן זיהוי אחד או יותר בזמן נתון ולהאזין לאירועים אקוסטיים.
קריאה ל-ISoundTriggerHw.getProperties()
מחזירה מבנה Properties
שמכיל את היכולות ואת תיאור ההטמעה.
התהליך הבסיסי להגדרת סשן מוסבר באיור 2:
איור 2: תרשים המצבים של STHAL
השלבים הבאים מתארים כל מדינה בפירוט:
לקוח HAL טוען מודל באמצעות
loadSoundModel()
אוloadPhraseSoundModel()
. אובייקט המודל שסופק מציין את אלגוריתם הזיהוי (המנוע) הספציפי להטמעה שבו צריך להשתמש, וגם את הפרמטרים הרלוונטיים לאלגוריתם הזה. אם הפעולה מסתיימת בהצלחה, השיטות האלה מחזירות טיפולן (handle) שמשמש להפניה למודל הזה בקריאות הבאות.אחרי שהמודל נטען בהצלחה, לקוח ה-HAL קורא ל-
startRecognition()
כדי להתחיל את הזיהוי. הזיהוי ממשיך לפעול ברקע עד שמתרחש אחד מהאירועים הבאים:- בוצעה קריאה ל-
stopRecognition()
במודל הזה. - התרחש זיהוי.
- הזיהוי מתבטל בגלל אילוצים של משאבים, למשל, כשמתחיל תרחיש לדוגמה בעדיפות גבוהה יותר.
בשני המקרים האחרונים, אירוע זיהוי נשלח דרך ממשק ה-callback שמירשם על ידי לקוח ה-HAL בזמן הטעינה. בכל המקרים, אחרי שמתרחש אחד מהאירועים האלה, הזיהוי הופך ללא פעיל ולא ניתן לבצע עוד קריאות חוזרות לזיהוי.
אפשר להפעיל מחדש את אותו מודל במועד מאוחר יותר, וניתן לחזור על התהליך הזה כמה פעמים שרוצים.
- בוצעה קריאה ל-
לבסוף, לקוח HAL פורק דגם לא פעיל שכבר אין צורך בו באמצעות
unloadModel()
.
טיפול בשגיאות HAL
כדי להבטיח התנהגות מהימנה ועקבית בין הטמעות של מנהלי התקנים, ב-Android 11 כל קודי השגיאה שאינם מצביעים על הצלחה שמוחזרים מ-HAL נחשבים לשגיאות תכנות, וההתאוששות מהן מחייבת הפעלה מחדש של תהליך ה-HAL. זוהי אסטרטגיה לשחזור מהמוצא האחרון, וסביר להניח שמקרים כאלה לא יתרחשו במערכת שפועלת כראוי.