Функция Sound Trigger позволяет приложениям прослушивать определенные акустические события, например, горячие слова, в режиме низкого энергопотребления и с учетом конфиденциальности. Примерами использования Sound Trigger являются Assistant и Now Playing.
На этой странице представлен обзор архитектуры Sound Trigger и ее интерфейса HAL (Hardware Abstraction Layer).
Стек звукового триггера
Подсистема Sound Trigger построена по слоям, как показано на рисунке 1:
Рисунок 1: Стек звукового триггера
В следующем списке каждый слой, показанный на рисунке 1, описывается более подробно:
Слой HAL (зеленый) содержит специфичный для поставщика код, реализующий интерфейс Sound Trigger HAL (STHAL).
SoundTriggerMiddleware
(желтый) находится над интерфейсом HAL. Он взаимодействует с HAL и отвечает за такие функции, как совместное использование HAL между различными клиентами, ведение журнала, обеспечение разрешений и обеспечение совместимости со старыми версиями HAL.Система
SoundTriggerService
(синяя) располагается над промежуточным программным обеспечением. Она облегчает интеграцию с другими системными функциями, такими как телефония и события батареи. Она также поддерживает базу данных звуковых моделей, индексированных по уникальным идентификаторам.Над слоем
SoundTriggerService
находится стек (коричневый), который обрабатывает функции, специфичные для Assistant и общих приложений, по отдельности.
Функция стека Sound Trigger заключается в доставке дискретных событий, которые представляют собой акустические, триггерные события. В большинстве случаев стек Sound Trigger не имеет дела со звуком. После получения событий триггера приложения получают доступ к фактическому аудиопотоку, окружающему время событий, открывая объект AudioRecord
через фреймворк Audio. API-интерфейсы Sound Trigger HAL предоставляют дескриптор сработавшего события, который используется с фреймворком Audio. Следовательно, поскольку Sound Trigger HAL и Audio HAL связаны внутри, они обычно совместно используют процесс.
Интерфейс звукового триггера 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. Это стратегия восстановления в качестве крайней меры, и ожидается, что такие случаи не произойдут в правильно работающей системе.