Триггер звука

Функция Sound Trigger позволяет приложениям распознавать определенные звуковые события, например ключевые слова, в режиме низкого энергопотребления и с соблюдением конфиденциальности. Примеры использования триггера звука – Ассистент и "Что сейчас играет".

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

Стек Sound Trigger

Подсистема Sound Trigger состоит из нескольких слоев, как показано на рисунке 1.

sound_trigger_stack

Рисунок 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 показана базовая схема настройки сеанса.

sthal_state

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

Ниже описаны все этапы.

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

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

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

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

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

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

Как устранять ошибки HAL

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