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

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