声音触发功能使应用程序能够以低功耗和隐私敏感的方式侦听某些声音事件,例如启动指令。声音触发器的示例用例是助手和正在播放。
本页概述了声音触发架构及其 HAL(硬件抽象层)接口。
声音触发器堆栈
Sound Trigger 子系统按层构建,如图 1 所示:
图 1:声音触发堆栈
以下列表更详细地描述了图 1 中所示的每一层:
HAL 层(绿色)包含实现声音触发 HAL (STHAL) 接口的供应商特定代码。
SoundTriggerMiddleware
(黄色)位于 HAL 接口之上。它与 HAL 通信并负责在不同客户端之间共享 HAL、记录、强制执行权限以及处理与旧 HAL 版本的兼容性等功能。SoundTriggerService
(蓝色)系统位于中间件之上。它有助于与其他系统功能集成,例如电话和电池事件。它还维护一个由唯一 ID 索引的声音模型数据库。在
SoundTriggerService
层之上,堆栈(棕色)分别处理特定于 Assistant 和通用应用程序的功能。
声音触发堆栈的功能是提供代表声学触发事件的离散事件。在大多数情况下,声音触发器堆栈不处理音频。收到触发事件后,应用程序可以通过音频框架打开AudioRecord
对象来访问事件发生时间周围的实际音频流。声音触发器 HAL API 提供了一个与音频框架一起使用的触发事件的句柄。因此,由于 Sound Trigger HAL 和 Audio HAL 在引擎盖下连接,它们通常共享一个进程。
声音触发 HAL 接口
Sound Trigger HAL (STHAL) 接口是 Sound Trigger 堆栈的供应商特定部分,它处理启动指令和其他声音的硬件识别。 STHAL 提供一个或多个引擎,每个引擎运行不同的算法,旨在检测特定类别的声音。当 STHAL 检测到触发器时,它会向框架发送一个事件,然后停止检测。
STHAL 接口在/hardware/interfaces/soundtrigger/
下指定。
ISoundTriggerHw
接口支持在给定时间运行一个或多个检测会话并侦听声学事件的能力。对ISoundTriggerHw.getProperties()
的调用会返回一个包含实现描述和功能的Properties
结构。
建立会话的基本流程如图2所示:
图 2: STHAL 状态图
以下步骤更详细地描述了每个状态:
HAL 客户端使用
loadSoundModel()
或loadPhraseSoundModel()
加载模型。提供的模型对象指示要使用哪个特定于实现的检测算法(引擎),以及适用于该算法的参数。成功后,这些方法返回一个句柄,用于在后续调用中引用此模型。成功加载模型后,HAL 客户端调用
startRecognition()
开始检测。识别继续在后台运行,直到发生以下事件之一:- 已在此模型上调用了
stopRecognition()
。 - 发生了检测。
- 检测由于资源限制而中止,例如,当启动了更高优先级的用例时。
在后两种情况下,通过 HAL 客户端在加载时注册的回调接口发送识别事件。在所有情况下,在任何这些事件发生后,检测将变为非活动状态,并且不允许再进行识别回调。
稍后可以再次启动相同的模型,并且可以根据需要多次重复此过程。
- 已在此模型上调用了
最后,HAL 客户端通过
unloadModel()
卸载不再需要的非活动模型。
HAL 错误的处理
为了确保驱动程序实现之间的行为可靠且一致,在 Android 11 中,从 HAL 返回的任何不成功的错误代码都将被视为编程错误,需要重新启动 HAL 进程才能从中恢复。这是最后的恢复策略,并且期望这种情况不会在正常工作的系统中发生。