Звуковой триггер

Функция Sound Trigger позволяет приложениям прослушивать определенные акустические события, например, горячие слова, в режиме низкого энергопотребления и с учетом конфиденциальности. Примерами использования Sound Trigger являются Assistant и Now Playing.

На этой странице представлен обзор архитектуры Sound Trigger и ее интерфейса HAL (Hardware Abstraction Layer).

Стек звукового триггера

Подсистема Sound Trigger построена по слоям, как показано на рисунке 1:

sound_trigger_stack

Рисунок 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:

sthal_state

Рисунок 2: Диаграмма состояний STHAL

Следующие шаги описывают каждое состояние более подробно:

  1. Клиент HAL загружает модель с помощью loadSoundModel() или loadPhraseSoundModel() . Предоставленный объект модели указывает, какой алгоритм обнаружения (движок) конкретной реализации использовать, а также параметры, применимые для этого алгоритма. При успешном выполнении эти методы возвращают дескриптор, который используется для ссылки на эту модель в последующих вызовах.

  2. После успешной загрузки модели клиент HAL вызывает startRecognition() для начала обнаружения. Распознавание продолжает работать в фоновом режиме до тех пор, пока не произойдет одно из следующих событий:

    1. Для этой модели был вызван метод stopRecognition() .
    2. Произошло обнаружение.
    3. Обнаружение прерывается из-за нехватки ресурсов, например, когда инициирован более приоритетный вариант использования.

    В последних двух случаях событие распознавания отправляется через интерфейс обратного вызова, который регистрируется клиентом HAL при загрузке. Во всех случаях после возникновения любого из этих событий обнаружение становится неактивным, и больше не допускаются обратные вызовы распознавания.

    Эту же модель можно запустить снова позднее, и этот процесс можно повторять столько раз, сколько необходимо.

  3. Наконец, неактивная модель, которая больше не нужна, выгружается клиентом HAL с помощью unloadModel() .

Обработка ошибок HAL

Чтобы обеспечить надежное и согласованное поведение между реализациями драйверов, в Android 11 любые коды ошибок без успеха, возвращаемые HAL, рассматриваются как ошибки программирования, восстановление после которых требует перезапуска процесса HAL. Это стратегия восстановления в качестве крайней меры, и ожидается, что такие случаи не произойдут в правильно работающей системе.