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

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

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

Звуковой триггерный стек

Подсистема 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-интерфейсы HAL Sound Trigger предоставляют дескриптор инициируемого события, который используется с Audio Framework. Следовательно, поскольку 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. Это стратегия восстановления в крайнем случае, и ожидается, что такие случаи не возникнут в правильно работающей системе.