Android SoundTrigger架构学习
本文将个人针对Android SoundTrigger的学习做了简单总结,以方便后续查询和学习。
一、架构解析
1、Android SoundTrigger架构如下(简图)
1.1、简单介绍
1)SoundTriggerHelper
SoundTriggerHelper是一个应用辅助工具类,它是应用和服务(这里是SoundTriggerSerivice)之间的适配层,其内部封装了常用的API接口,供APP直接调用;SoundTriggerHelper与SoundTriggerService之间使用HIDL/AIDL 进行交互;
2)SoundTriggerService
它是SoundTrigger架构的服务核心,运行在system server进程下,负责SoundTrigger整个系统的调度;典型操作如下:
registerSoundModel() // 模型注册
startRecognition() // 启动识别
stopRecognition() // 停止识别
SoundTriggerService向下调用SoundTriggerModule,实现与SoundTriggerHAL的交互。
3)SoundTriggerModule
它是与与SoundTrigger HAL直接交互的层,提供了硬件能力抽象层的作用,支持模块的多实例,典型操作接口如下:
loadSoundModel() // 模型加载
unloadSoundModel() // 模型卸载
startRecognition() // 开启监听
stopRecognition() // 停止监听
getParameter() // 参数获取
4)SoundTrigger HAL
它是负责直接与硬件交互的层,向上承接SoundTriggerModule;SoundTrigger HAL的主要作用是在低功耗状态下处理声音识别,比如语音唤醒词检测;提供声学模型管理(加载或卸载),并可以与Audio HAL交互,实现语音唤醒后相关音频流的处理。
核心文件目录:
核心文件目录:
soundtrigger/
├── Android.bp # 编译配置
├── SoundTriggerHw.cpp # HAL实现主体
├── SoundTriggerHalHidl.cpp # HIDL适配层
├── SoundTriggerHalAidl.cpp # AIDL适配层 (Android 12+)
└── include/
└── SoundTriggerHal.h # 头文件
常用接口如下:
// 来自ISoundTriggerHw.hal主要接口
interface ISoundTriggerHw {
getProperties() generates (SoundTriggerProperties properties);
loadSoundModel(SoundModel soundModel) generates (int32_t ret, int32_t modelId);
startRecognition(int32_t modelId) generates (int32_t ret);
stopRecognition(int32_t modelId) generates (int32_t ret);
unloadSoundModel(int32_t modelId) generates (int32_t ret);
};
1.2、代码路径说明
(1)SoundTriggerService代码路径最新路径如下:
frameworks/base/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
(2)SoundTrigger HAL代码路径
A) HIDL接口(Android8.0+):hardware/interfaces/soundtrigger/2.3/ISoundTriggerHw.hal
不同芯片在Google原生代码基础上做了适配,这里以Qualcomm和MTK当前两个芯片生产商为例:
Qualcomm:
vendor/qcom/opensource/audio-hal/primary-hal/hal/soundtrigger/
MTK:
vendor/mediatek/proprietary/hardware/audio/soundtrigger/