Функция Sound Trigger позволяет приложениям распознавать определенные звуковые события, например ключевые слова, в режиме низкого энергопотребления и с соблюдением конфиденциальности. Примеры использования триггера звука – Ассистент и "Что сейчас играет".
На этой странице представлен обзор архитектуры Sound Trigger и ее интерфейса HAL (уровень аппаратных абстракций).
Стек Sound Trigger
Подсистема Sound Trigger состоит из нескольких слоев, как показано на рисунке 1.
Рисунок 1. Стек Sound Trigger
Ниже приведено подробное описание каждого уровня, показанного на рисунке 1.
Уровень HAL (выделен зеленым) содержит код поставщика, который реализует интерфейс Sound Trigger HAL (STHAL).
SoundTriggerMiddleware(желтый) находится над интерфейсом HAL. Он взаимодействует с HAL и отвечает за такие функции, как предоставление доступа к HAL разным клиентам, ведение журналов, применение разрешений и обеспечение совместимости со старыми версиями HAL.Система
SoundTriggerService(синего цвета) находится над промежуточным ПО. Он обеспечивает интеграцию с другими функциями системы, такими как телефония и события батареи. Кроме того, в нем хранится база данных моделей звуков, проиндексированных по уникальным идентификаторам.Над уровнем
SoundTriggerServiceстек (коричневый) обрабатывает функции, относящиеся к Ассистенту и обычным приложениям, по отдельности.
Функция стека Sound Trigger заключается в том, чтобы доставлять отдельные события, представляющие собой акустические триггерные события. В большинстве случаев стек Sound Trigger не работает с аудио. После получения триггерных событий приложения получают доступ к фактическому аудиопотоку, окружающему время событий, открывая объект AudioRecord через фреймворк Audio. API Sound Trigger HAL предоставляют дескриптор для активированного события, который используется с Audio Framework. Поскольку HAL триггера звука и HAL аудио связаны, они обычно используют один и тот же процесс.
Интерфейс Sound Trigger HAL
Интерфейс Sound Trigger HAL (STHAL) – это часть стека Sound Trigger, относящаяся к поставщику. Он отвечает за аппаратное распознавание ключевых слов и других звуков. STHAL предоставляет один или несколько движков, каждый из которых работает по отдельному алгоритму, предназначенному для обнаружения определенного класса звуков. Когда STHAL обнаруживает триггер, он отправляет событие в фреймворк и прекращает обнаружение.
Интерфейс STHAL указан в /hardware/interfaces/soundtrigger/.
Интерфейс ISoundTriggerHw позволяет одновременно запускать один или несколько сеансов обнаружения и прослушивать акустические события.
Вызов ISoundTriggerHw.getProperties() возвращает структуру Properties, содержащую описание реализации и возможностей.
На рисунке 2 показана базовая схема настройки сеанса.
Рисунок 2. Диаграмма состояний STHAL
Ниже описаны все этапы.
Клиент HAL загружает модель с помощью
loadSoundModel()илиloadPhraseSoundModel(). Объект модели указывает, какой алгоритм обнаружения (механизм), относящийся к определенной реализации, следует использовать, а также параметры, применимые к этому алгоритму. В случае успеха эти методы возвращают дескриптор, который используется для ссылки на эту модель в последующих вызовах.После успешной загрузки модели клиент HAL вызывает
startRecognition(), чтобы начать распознавание. Модель может быть выгружена с помощью . Распознавание будет выполняться в фоновом режиме, пока не произойдет одно из следующих событий:- Для этой модели был вызван метод
stopRecognition(). - Обнаружено нарушение.
- Распознавание прервано из-за нехватки ресурсов, например когда был запущен более приоритетный процесс.
В двух последних случаях событие распознавания отправляется через интерфейс обратного вызова, зарегистрированный клиентом HAL при загрузке. Во всех случаях после любого из этих событий обнаружение становится неактивным и больше не допускаются обратные вызовы распознавания.
Одну и ту же модель можно запустить снова в другое время. Это можно делать столько раз, сколько потребуется.
- Для этой модели был вызван метод
Наконец, неактивная модель, которая больше не нужна, выгружается клиентом HAL с помощью
unloadModel().
Как устранять ошибки HAL
Чтобы обеспечить надежность и согласованность работы драйверов, в Android 11 любые коды ошибок, возвращаемые HAL, кроме кодов успешного выполнения, считаются ошибками программирования, для устранения которых требуется перезапустить процесс HAL. Это крайняя мера, и мы ожидаем, что в правильно работающей системе такие случаи не будут происходить.