声音触发器

声音触发器功能为应用提供了以低功耗和注重隐私的方式监听特定声音事件(如热词)的功能。声音触发器的用例示例包括 Assistant 和 Now Playing。

本页面概述了声音触发器架构及其 HAL(硬件抽象层)接口。

声音触发器堆栈

声音触发器子系统分层构建,如图 1 所示

sound_trigger_stack

图 1:声音触发器堆栈

以下列表更详细地描述了图 1 中显示的每一层

  • HAL 层(绿色部分)包含供应商特定的代码,用于实现 声音触发器 HAL (STHAL) 接口。

  • SoundTriggerMiddleware(黄色部分)位于 HAL 接口之上。它与 HAL 通信,并负责在不同客户端之间共享 HAL、日志记录、强制执行权限以及处理与旧版 HAL 版本的兼容性等功能。

  • SoundTriggerService(蓝色部分)系统位于中间件之上。它有助于与其他系统功能(例如电话和电池事件)集成。它还维护声音模型数据库,该数据库按唯一 ID 编制索引。

  • SoundTriggerService 层之上,堆栈(棕色部分)分别处理 Assistant 和通用应用特有的功能。

声音触发器堆栈的功能是传递代表声音触发事件的离散事件。在大多数情况下,声音触发器堆栈不处理音频。收到触发事件后,应用通过音频框架打开 AudioRecord 对象,从而可以访问事件发生时间周围的实际音频流。声音触发器 HAL API 提供了一个句柄,其中包含与音频框架一起使用的触发事件。因此,由于声音触发器 HAL 和音频 HAL 在底层是连接的,因此它们通常共享一个进程。

声音触发器 HAL 接口

声音触发器 HAL (STHAL) 接口是声音触发器堆栈的供应商特定部分,它处理热词和其他声音的硬件识别。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 进程。这是一种最后的恢复策略,并且期望在正常工作的系统中不会发生这种情况。