AIVoice 概述
支持的芯片
概述
AIVoice 是一套由 Realtek 自主研发的离线 AI 解决方案,包含声学信号处理、唤醒、端点检测、识别等本地算法模块,可用于在 Realtek Ameba SoC 上搭建智能语音相关应用。
AIVoice 可以作为纯离线方案单独使用,也可以结合语音识别、大语言模型等云端系统实现一个离、在线混合的语音交互方案。
应用
应用方案
纯离线:AIVoice 单独使用,支持本地唤醒、识别等功能。
离在线:AIVoice 配合语音识别、大语言模型等云端系统使用,在本地唤醒后与云端语音交互。
应用产品
智能家居:如小爱音箱、天猫精灵等智能音箱,或智能语音家电。可通过语音控制灯光、温度和其他设备。
智能玩具:如 AI 故事机、教育机器人、陪伴机器人等。可通过语音与用户自然对话,回答十万个为什么、讲故事或进行双语教学。
车载系统:通过语音指令导航、拨打电话和播放音乐等,确保驾驶安全并提升驾驶体验。
穿戴产品:如智能手表、智能耳机和健康监测设备等。可以通过语音指令查看和发送消息、控制音乐播放器、接听电话等。
会议场景:实时转录会议内容,帮助与会者更好地记录和回顾讨论要点。
模块
模块 |
功能 |
|---|---|
AFE(信号处理) |
增强语音信号、降噪,包含子模块: 回声消除、波束成形、噪声抑制、自动增益控制、声源定位 |
KWS(唤醒词检测) |
检测唤醒词以激活语音助手,如 |
VAD(语音端点检测) |
检测音频中的语音段或噪声段 |
ASR(语音识别) |
检测离线语音控制命令 |
流程
为了方便用户开发,部分算法流程已在 AIVoice 中实现:
AFE+KWS+ASR(full_flow):一个完整的本地算法流程,包括 AFE、KWS 和 ASR。AFE 和 KWS 始终开启,当 KWS 检测到唤醒词时,ASR 开启并支持持续识别,超时后 ASR 退出。
AFE+KWS:流程包括 AFE 和 KWS,始终开启。
AFE+KWS+VAD:流程包括 AFE、KWS 和 VAD。AFE 和 KWS 始终开启,当 KWS 检测到唤醒词时,VAD 开启并支持持续检测语音端点,超时后 VAD 退出。
如果需要其他模块组合,如 AFE+VAD 等,或是部分模块不使用 AIVoice,可通过调用单独的模块接口实现自定义流程。
代码仓库与依赖说明
代码仓库
AIVoice 代码托管于 GitHub:ameba-aivoice。
依赖说明
AIVoice 需配合以下任一 SDK 使用:
SDK 选择取决于芯片型号与操作系统。
下载方式
自动拉取:使用
git clone --recursive或repo命令(根据 SDK 要求)拉取 SDK,将自动包含 AIVoice 子模块。手动拉取:单独克隆 ameba-aivoice,并放置于 SDK 指定路径。
芯片
操作系统
SDK
AIVoice 路径
RTL8721Dx/RTL8730E
FreeRTOS
ameba-rtos
{SDK}/component/aivoice
RTL8713E/RTL8726E
FreeRTOS
ameba-dsp
{SDK}/lib/aivoice
RTL8730E
Linux
ameba-linux
{SDK}/apps/aivoice
接口
模块接口
接口 |
模块 |
|---|---|
aivoice_iface_afe_v1 |
AFE |
aivoice_iface_vad_v1 |
VAD |
aivoice_iface_kws_v1 |
KWS |
aivoice_iface_asr_v1 |
ASR |
所有接口均支持以下函数:
create()
destroy()
reset()
feed()
详情请参考 ${aivoice_lib_dir}/include/aivoice_interface.h。
流程接口
接口 |
流程 |
|---|---|
aivoice_iface_full_flow_v1 |
AFE+KWS+ASR |
aivoice_iface_afe_kws_v1 |
AFE+KWS |
aivoice_iface_afe_kws_vad_v1 |
AFE+KWS+VAD |
所有接口均支持以下函数:
create()
destroy()
reset()
feed()
详情请参考 ${aivoice_lib_dir}/include/aivoice_interface.h。
事件及回调信息
aivoice输出事件 |
事件触发时间 |
回调信息 |
|---|---|---|
AIVOICE_EVOUT_VAD |
当VAD检测到语音段开始或结束 |
包含VAD状态,偏移的结构体 |
AIVOICE_EVOUT_WAKEUP |
当KWS检测到唤醒词 |
包含ID,唤醒词,唤醒得分的JSON字符串。示例: {"id":2,"keyword":"ni-hao-xiao-qiang","score":0.9} |
AIVOICE_EVOUT_ASR_RESULT |
当ASR检测到命令词 |
包含FST类型,命令词,ID的JSON字符串。 示例: {"type":0,"commands":[{"rec":"打开空调","id":14}]} |
AIVOICE_EVOUT_AFE |
AFE收到输入的每一帧 |
包含AFE输出数据,通道数等的结构体 |
AIVOICE_EVOUT_ASR_REC_TIMEOUT |
ASR/VAD超时 |
NULL |
AFE 事件定义
struct aivoice_evout_afe {
int ch_num; /* 输出音频信号的通道数,默认值:1 */
short* data; /* 增强后的音频信号 */
char* out_others_json; /* 保留用于其他输出数据(例如标志位),key: value 形式 */
};
VAD 事件定义
struct aivoice_evout_vad {
int status; /* 0: VAD 从语音变为静音,表示语音段的结束点
1: VAD 从静音变为语音,表示语音段的起始点 */
unsigned int offset_ms; /* 相对于重置点的时间偏移量 */
};
通用配置
AIVoice 可配参数:
- timeout:
在 full flow 中,如果在此持续时间内未检测到命令词,则 ASR 退出。在 AFE+KWS+VAD 流程中,唤醒后 VAD 仅在此持续时间内工作。
- memory_alloc_mode:
默认使用 SDK 默认堆。SRAM 模式使用 SDK 默认堆,同时还从 SRAM 分配空间用于内存关键数据。 SRAM 模式目前仅适用于 RTL8713E 和 RTL8726E DSP。
详情请参考 ${aivoice_lib_dir}/include/aivoice_sdk_config.h。
非通用配置参数请见算法模块章节。
示例
AIVoice 离线示例:使用预录音频运行全流程
该例子通过一条提前录制的三通道音频演示如何使用 AIVoice 的全流程,在开发板启动后仅运行一次。 未整合录音、播放等音频功能。
示例代码在 aivoice/examples/full_flow_offline 目录下。
AIVoice 使用步骤
选择需要的 aivoice 流程或模块。
/* 步骤 1: * 选择需要的 aivoice 流程. * 参考 aivoice_interface.h 文件末尾查看支持的流程 */ const struct rtk_aivoice_iface *aivoice = &aivoice_iface_full_flow_v1;
准备配置参数。
/* 步骤 2: * 按需修改默认配置。 * 您可以修改 afe/vad/kws/...的 0 个或多个配置项 */ struct aivoice_config config; memset(&config, 0, sizeof(config)); /* * 这里使用 afe_res_2mic50mm 作为示例。 * 可以根据实际使用的 afe 资源修改这些配置。 * 详情请参考 aivoce_afe_config.h; * * afe_config.mic_array 必须与您链接的 afe 资源匹配 */ struct afe_config afe_param = AFE_CONFIG_ASR_DEFAULT_2MIC50MM; // 根据链接的 afe 资源修改此项 config.afe = &afe_param; /* * 仅在完全理解参数含义时修改这些设置。 * 如果不了解这些参数的含义, * 建议使用默认配置 */ struct vad_config vad_param = VAD_CONFIG_DEFAULT(); vad_param.left_margin = 300; // 可根据需要修改配置 config.vad = &vad_param; // 可设置为 NULL struct kws_config kws_param = KWS_CONFIG_DEFAULT(); config.kws = &kws_param; // 可设置为 NULL struct asr_config asr_param = ASR_CONFIG_DEFAULT(); config.asr = &asr_param; // 可设置为 NULL struct aivoice_sdk_config aivoice_param = AIVOICE_SDK_CONFIG_DEFAULT(); aivoice_param.timeout = 10; config.common = &aivoice_param; // 可设置为 NULL
使用
create()和指定配置来创建并初始化 aivoice 实例。/* 步骤 3: * 创建 aivoice 实例 */ void *handle = aivoice->create(&config); if (!handle) { return; }
注册回调函数。
/* 步骤 4: * 注册一个回调函数。 * 在本示例中,您可能只会接收到部分 aivoice_out_event_type 事件类型, * 具体取决于您使用的流程。 * */ rtk_aivoice_register_callback(handle, aivoice_callback_process, NULL);
回调函数可以按实际使用需求进行修改:
static int aivoice_callback_process(void *userdata, enum aivoice_out_event_type event_type, const void *msg, int len) { (void)userdata; struct aivoice_evout_vad *vad_out; struct aivoice_evout_afe *afe_out; switch (event_type) { case AIVOICE_EVOUT_VAD: vad_out = (struct aivoice_evout_vad *)msg; printf("[user] vad. status = %d, offset = %d\n", vad_out->status, vad_out->offset_ms); break; case AIVOICE_EVOUT_WAKEUP: printf("[user] wakeup. %.*s\n", len, (char *)msg); break; case AIVOICE_EVOUT_ASR_RESULT: printf("[user] asr. %.*s\n", len, (char *)msg); break; case AIVOICE_EVOUT_ASR_REC_TIMEOUT: printf("[user] asr timeout\n"); break; case AIVOICE_EVOUT_AFE: afe_out = (struct aivoice_evout_afe *)msg; // afe 每帧都会输出音频 // 本示例中,为了让日志清晰仅打印一次 static int afe_out_printed = false; if (!afe_out_printed) { afe_out_printed = true; printf("[user] afe output %d channels raw audio, others: %s\n", afe_out->ch_num, afe_out->out_others_json ? afe_out->out_others_json : "null"); } // 按需处理 afe 输出的音频 break; default: break; } return 0; }
使用
feed()给 aivoice 输入音频数据。/* 在芯片上运行时,通常使用麦克风采集的实时音频流, * 本示例中使用一条固定音频 * */ const char *audio = (const char *)get_test_wav(); int len = get_test_wav_len(); int audio_offset = 44; int mics_num = 2; int afe_frame_bytes = (mics_num + afe_param.ref_num) * afe_param.frame_size * sizeof(short); while (audio_offset <= len - afe_frame_bytes) { /* step 5: * Feed the audio to the aivoice instance. * */ aivoice->feed(handle, (char *)audio + audio_offset, afe_frame_bytes); audio_offset += afe_frame_bytes; }
(可选) 如果需要重置状态,使用
reset()。如果不再需要 aivoice,使用
destroy()销毁实例。/* 步骤 6: * 销毁 aivoice 实例 */ aivoice->destroy(handle);
编译示例
替换音频文件
修改
CmakeLists.txt,使用platform/ameba_rtos/testwav_1c.wav作为测试音频文件通过下述代码将音频数据放入 flash region
__attribute__((section(".audio.data")))
并修改链接文件
{SDK}/amebadplus_gcc_project/project_km4/asdk/ld/ameba_img2_all.ld, 在.xip_image2.text中加入:.xip_image2.text : { __flash_text_start__ = .; *(.audio.data*) *(.non.dram.text*) __flash_text_end__ = .; } > KM4_IMG2_XIP
修改
example_full_flow_offline.c中下述宏以运行 afe_kws_vad 流程#define AIVOICE_TARGET_AMEBADPLUS (1)切换到 SDK 的 GCC 项目目录
cd {SDK}/amebadplus_gcc_project
运行
menuconfig.py进入配置界面./menuconfig.py
导航至以下菜单路径开启 TFLM 库和 AIVoice
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... AI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice
编译固件
./build.py -a full_flow_offline
使用 Xplorer 图形界面编译
编译 DSP 的 TFLM 库, 请参考 编译 TFLM。
也可使用
{DSPSDK}/lib/aivoice/prebuilts/lib/ameba_dsp目录下预编译好的 TFLM 库。在 Xtensa Xplorer 中导入
{DSPSDK}/lib/aivoice/examples/full_flow_offline源.{DSPSDK}/lib/aivoice/examples/full_flow_offline/platform目录下仅需导入ameba_dsp/进行软件相关配置,按需修改链接的库如 AFE 资源、KWS 资源等。
添加包含路径(-I)
${workspace_loc}/../lib/aivoice/include添加库搜索路径(-L)
${workspace_loc}/../lib/aivoice/prebuilts/lib/ameba_dsp/$(TARGET_CONFIG) ${workspace_loc}/../lib/xa_nnlib/v2.3.0/bin/$(TARGET_CONFIG)/Release ${workspace_loc}/../lib/lib_hifi5/v3.1.0/bin/$(TARGET_CONFIG) ${workspace_loc}/../lib/tflite_micro/ameba_dsp-out/$(TARGET_CONFIG)添加库(-l)
如果使用 lib 资源:
-laivoice -lafe_kernel -lkernel -lafe_res_2mic50mm -lvad_v7_200K -lkws_xiaoqiangxiaoqiang_nihaoxiaoqiang_v4_300K -lasr_cn_v8_2M -lfst_cn_cmd_ac40 -lcJSON -ltomlc99 -ltflite_micro -lxa_nnlib -lhifi5_dsp -laivoice_hal
如果使用 bin 资源:
-laivoice -lafe_kernel -lkernel -lcJSON -ltomlc99 -ltflite_micro -lxa_nnlib -lhifi5_dsp -laivoice_hal
编译固件,请参考 DSP 编译 中的步骤。
使用命令行编译
编译 DSP 的 TFLM 库, 请参考 编译 TFLM。
也可使用
{DSPSDK}/lib/aivoice/prebuilts/lib/ameba_dsp目录下预编译好的 TFLM 库。将所有 aivoice 示例依赖和链接资源添加到项目中
如果使用 lib 资源:
cd {DSPSDK}/lib/aivoice/examples/build_utils/ameba_dsp ./add_all_settings_to_project.sh {DSPSDK}/project/project_dsp/ full_flow_offline
如果使用 bin 资源:
cd {DSPSDK}/lib/aivoice/examples/build_utils/ameba_dsp ./add_all_settings_to_project.sh {DSPSDK}/project/project_dsp/ full_flow_offline --no_lib_resources
这会将所有必要的依赖和链接资源插入到项目的 makefile 中。
编译
dsp_all.bincd dsp/source/project/auto_build/ ./auto_build.sh
dsp_all.bin会生成在{DSPSDK}/source/project/image/目录下。默认的 xtensa 配置是
HIFI5_PROD_1123_asic_wUPG.如果想更改 xtensa 配置,请修改
{DSPSDK}/source/project/image/dsp_batch.xml中的configName。
打包 binary 资源
如果您选择使用 bin 资源,可以通过以下方式指定资源并打包成一个 aivoice_models.bin 文件:
切换到 SDK 的 amebalite GCC 项目目录
cd {SDK}/amebalite_gcc_project
运行
menuconfig.py进入配置界面./menuconfig.py
导航至以下菜单路径,选择所需的 AFE 和 NN 资源
--------MENUCONFIG FOR General--------- CONFIG DSP Enable ---> ... CONFIG APPLICATION ---> Graphics Libraries Configuration ---> ... AI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice [*] Select AFE Resource AFE (afe_res_2mic50mm) ---> [*] Select VAD Resource VAD (vad_v7_200K) ---> [*] Select KWS Resource KWS (kws_xiaoqiangxiaoqiang_nihaoxiaoqiang_v4_300K) ---> [*] Select ASR Resource ASR (asr_cn_v8_2M) ---> [*] Select FST Resource FST (fst_cn_cmd_ac40) --->
使用
{SDK}/component/aivoice下的资源打包工具进行资源打包该脚本会根据
{SDK}/amebalite_gcc_project/menuconfig/.config配置文件自动选择资源文件。下载资源固件到设备
将生成的
aivoice_models.bin文件下载到设备上。
使用 Xplorer 图形界面编译
编译 DSP 的 TFLM 库, 请参考 编译 TFLM。
也可使用
{DSPSDK}/lib/aivoice/prebuilts/lib/ameba_dsp目录下预编译好的 TFLM 库。在 Xtensa Xplorer 中导入
{DSPSDK}/lib/aivoice/examples/full_flow_offline源.{DSPSDK}/lib/aivoice/examples/full_flow_offline/platform目录下仅需导入ameba_dsp/进行软件相关配置,按需修改链接的库如 AFE 资源、KWS 资源等。
添加包含路径(-I)
${workspace_loc}/../lib/aivoice/include添加库搜索路径(-L)
${workspace_loc}/../lib/aivoice/prebuilts/lib/ameba_dsp/$(TARGET_CONFIG) ${workspace_loc}/../lib/xa_nnlib/v2.3.0/bin/$(TARGET_CONFIG)/Release ${workspace_loc}/../lib/lib_hifi5/v3.1.0/bin/$(TARGET_CONFIG) ${workspace_loc}/../lib/tflite_micro/ameba_dsp-out/$(TARGET_CONFIG)添加库(-l)
如果使用 lib 资源:
-laivoice -lafe_kernel -lkernel -lafe_res_2mic50mm -lvad_v7_200K -lkws_xiaoqiangxiaoqiang_nihaoxiaoqiang_v4_300K -lasr_cn_v8_2M -lfst_cn_cmd_ac40 -lcJSON -ltomlc99 -ltflite_micro -lxa_nnlib -lhifi5_dsp -laivoice_hal
如果使用 bin 资源:
-laivoice -lafe_kernel -lkernel -lcJSON -ltomlc99 -ltflite_micro -lxa_nnlib -lhifi5_dsp -laivoice_hal
编译固件,请参考 DSP 编译 中的步骤。
使用命令行编译
编译 DSP 的 TFLM 库, 请参考 编译 TFLM。
也可使用
{DSPSDK}/lib/aivoice/prebuilts/lib/ameba_dsp目录下预编译好的 TFLM 库。将所有 aivoice 示例依赖和链接资源添加到项目中
如果使用 lib 资源:
cd {DSPSDK}/lib/aivoice/examples/build_utils/ameba_dsp ./add_all_settings_to_project.sh {DSPSDK}/project/project_dsp/ full_flow_offline
如果使用 bin 资源:
cd {DSPSDK}/lib/aivoice/examples/build_utils/ameba_dsp ./add_all_settings_to_project.sh {DSPSDK}/project/project_dsp/ full_flow_offline --no_lib_resources
这会将所有必要的依赖和链接资源插入到项目的 makefile 中。
编译
dsp_all.bincd dsp/source/project/auto_build/ ./auto_build.sh
dsp_all.bin会生成在{DSPSDK}/source/project/image/目录下。默认的 xtensa 配置是
HIFI5_PROD_1123_asic_wUPG.如果想更改 xtensa 配置,请修改
{DSPSDK}/source/project/image/dsp_batch.xml中的configName。
打包 binary 资源
如果您选择使用 bin 资源,可以通过以下方式指定资源并打包成一个 aivoice_models.bin 文件:
切换到 SDK 的 amebalite GCC 项目目录
cd {SDK}/amebalite_gcc_project
运行
menuconfig.py进入配置界面./menuconfig.py
导航至以下菜单路径,选择所需的 AFE 和 NN 资源
--------MENUCONFIG FOR General--------- CONFIG DSP Enable ---> ... CONFIG APPLICATION ---> Graphics Libraries Configuration ---> ... AI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice [*] Select AFE Resource AFE (afe_res_2mic50mm) ---> [*] Select VAD Resource VAD (vad_v7_200K) ---> [*] Select KWS Resource KWS (kws_xiaoqiangxiaoqiang_nihaoxiaoqiang_v4_300K) ---> [*] Select ASR Resource ASR (asr_cn_v8_2M) ---> [*] Select FST Resource FST (fst_cn_cmd_ac40) --->
使用
{SDK}/component/aivoice下的资源打包工具进行资源打包该脚本会根据
{SDK}/amebalite_gcc_project/menuconfig/.config配置文件自动选择资源文件。下载资源固件到设备
将生成的
aivoice_models.bin文件下载到设备上。
FreeRTOS
切换到 SDK 的 GCC 项目目录
cd {SDK}/amebasmart_gcc_project
运行
menuconfig.py进入配置界面./menuconfig.py
导航至以下菜单路径开启 TFLM 库和 AIVoice
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... AI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice
根据硬件选择相应的 AFE 资源,默认
afe_res_2mic50mmAI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice Select AFE Resource ( ) afe_res_1mic ( ) afe_res_2mic30mm (X) afe_res_2mic50mm ( ) afe_res_2mic70mm
选择 KWS 资源,默认固定唤醒词
小强小强、你好小强AI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice Select AFE Resource Select KWS Resource (X) kws_res_xqxq ( ) kws_res_custom
编译固件
./build.py -a full_flow_offline
Linux
(可选) 如果需要更换 AFE 资源或 KWS 资源,修改 yocto recipe
{LINUXSDK}/yocto/meta-realtek/meta-sdk/recipes-rtk/aivoice/rtk-aivoice-algo.bb里的库。通过 bitbake 编译 aivoice 可执行文件:
bitbake rtk-aivoice-algo
预期结果
在开发板上烧录固件,运行后,日志会打印算法结果如下:
[AFE] multi-kws-beam = 0, 1, 2
---------------------SPEECH COMMANDS---------------------
Command ID1, 打开空调
Command ID2, 关闭空调
Command ID3, 制冷模式
Command ID4, 制热模式
Command ID5, 加热模式
Command ID6, 送风模式
Command ID7, 除湿模式
Command ID8, 调到十六度
Command ID9, 调到十七度
Command ID10, 调到十八度
Command ID11, 调到十九度
Command ID12, 调到二十度
Command ID13, 调到二十一度
Command ID14, 调到二十二度
Command ID15, 调到二十三度
Command ID16, 调到二十四度
Command ID17, 调到二十五度
Command ID18, 调到二十六度
Command ID19, 调到二十七度
Command ID20, 调到二十八度
Command ID21, 调到二十九度
Command ID22, 调到三十度
Command ID23, 开高一度
Command ID24, 开低一度
Command ID25, 高速风
Command ID26, 中速风
Command ID27, 低速风
Command ID28, 增大风速
Command ID29, 减小风速
Command ID30, 自动风
Command ID31, 最大风量
Command ID32, 中等风量
Command ID33, 最小风量
Command ID34, 自动风量
Command ID35, 左右摆风
Command ID36, 上下摆风
Command ID37, 播放音乐
Command ID38, 暂停播放
Command ID39, 接听电话
Command ID40, 挂断电话
---------------------------------------------------------
[AIVOICE] rtk_aivoice version: v1.6.0#S87db3f2#N89da3ed#Ad90cdbe
[AIVOICE] rtk_aivoice_model afe version: afe_2mic_asr_v1.5_AfePara_2mic50_v2.0_bf_v0.0_20250401
[AIVOICE] rtk_aivoice_model vad version: vad_v7_opt
[AIVOICE] rtk_aivoice_model kws version: kws_xqxq_v4.1_opt
[AIVOICE] rtk_aivoice_model asr version: asr_cn_v8_opt
[AIVOICE] rtk_aivoice_log_format version: v2
[user] afe output 1 channels raw audio, others: {"abnormal_flag":0,"ssl_angle":-10}
[AIVOICE] [KWS] result: {"id":2,"keyword":"ni-hao-xiao-qiang","score":0.766761064529419}
[user] wakeup. {"id":2,"keyword":"ni-hao-xiao-qiang","score":0.766761064529419}
[user] voice angle 90.0
[user] vad. status = 1, offset = 425
[user] vad. status = 0, offset = 1865
[AIVOICE] [ASR] result: {"type":0,"commands":[{"rec":"打开空调","id":1}]}
[user] asr. {"type":0,"commands":[{"rec":"打开空调","id":1}]}
[user] voice angle 90.0
[user] vad. status = 1, offset = 525
[AIVOICE] [KWS] result: {"id":2,"keyword":"ni-hao-xiao-qiang","score":0.81332826614379883}
[user] wakeup. {"id":2,"keyword":"ni-hao-xiao-qiang","score":0.81332826614379883}
[user] voice angle 90.0
[user] vad. status = 1, offset = 445
[user] vad. status = 0, offset = 1765
[AIVOICE] [ASR] result: {"type":0,"commands":[{"rec":"播放音乐","id":37}]}
[user] asr. {"type":0,"commands":[{"rec":"播放音乐","id":37}]}
[user] voice angle 90.0
SpeechMind 实时示例:麦克风音频流输入
SpeechMind 是一个集成了 AIVoice 算法、音频采集、播放器等功能的智能语音助手框架,该例子演示如何利用 SpeechMind 框架进行实时的语音唤醒和识别。
更多信息
介绍及接口: SpeechMind
Github 仓库: speechmind
硬件准备
开发板要求:
间距为 50mm 的两个麦克风
一路回采信号
外接扬声器
注意
请务必确保设置的麦克风与开发板匹配,否则可能导致算法无法工作或性能下降。设置见 speechmind/src/audio_capture.c
编译示例
本示例使用 AIVoice 仓库中提供的预编译 DSP 固件 + AIVoice 资源固件的形式。如果需要自行编译 DSP 固件,请参考 示例 中的离线示例以及 aivoice/examples/speechmind_demo 代码。
将回复音目录打包为虚拟文件系统固件
tts.bin。更多信息可参考 虚拟文件系统cd {SDK}/amebalite_gcc_project ../tools/image_scripts/vfs.py -t LITTLEFS -dir ../component/application/speechmind/res/tts -out tts.bin
根据
tts.bin的大小和aivoice_models.bin的起始地址(预编译 DSP 固件中为 0x08A00000)修改文件{SDK}/component/soc/usrcfg/amebalite/ameba_flashcfg.c中的 Flash 布局。更多信息可参考 Flash 布局与配置#ifdef CONFIG_SOC_SOLO #else FlashLayoutInfo_TypeDef Flash_Layout[] = { /* Region_Type, [StartAddr, EndAddr] */ {IMG_BOOT, 0x08000000, 0x08013FFF}, //Boot Manifest(4K) + KM4 Bootloader(76K) //Users should modify below according to their own memory {IMG_APP_OTA1, 0x08014000, 0x081FFFFF}, //Certificate(4K) + Manifest(4K) + KR4 & KM4 Application OTA1 + RDP IMG OTA1 {IMG_BOOT_OTA2, 0x08200000, 0x08213FFF}, //Boot Manifest(4K) + KM4 Bootloader(76K) OTA {IMG_APP_OTA2, 0x08214000, 0x083DCFFF}, //Certificate(4K) + Manifest(4K) + KR4 & KM4 Application OTA2 + RDP IMG OTA2 {FTL, 0x083DD000, 0x083DFFFF}, //FTL for BT(>=12K), The start offset of flash pages which is allocated to FTL physical map. {VFS1, 0x083E0000, 0x084C9FFF}, //VFS region 1 (936K) {IMG_DSP, 0x084CA000, 0x086FFFFF}, //Manifest(4K) + DSP IMG, only one DSP region in layout {VFS2, 0xFFFFFFFF, 0xFFFFFFFF}, //VFS region 2 {USER, 0x08A00000, 0xFFFFFFFF}, //reserve for user /* End */ {0xFF, 0xFFFFFFFF, 0xFFFFFFFF}, };
备注
本示例中
tts.bin为 936 K,因此 VFS1 结束地址修改为 0x083E0000 + 936K = 0x084C9FFF不同固件地址不能交叠,因此 IMG_DSP 起始地址修改为 0x084C9FFF + 1 = 0x084CA000
编辑
{SDK}/amebalite_gcc_project/project_km4/asdk/make/image2/CMakeLists.txt,编译项目中增加 SpeechMindameba_add_subdirectory_if_exist(${c_CMPT_APP_DIR}/speechmind)切换到 SDK 的 GCC 项目目录,并运行
menuconfig.py进入配置界面cd {SDK}/amebalite_gcc_project ./menuconfig.py
导航至以下菜单路径开启 DSP
--------MENUCONFIG FOR General--------- CONFIG DSP Enable ---> [*] Enable DSP
导航至以下菜单路径选择 PSRAM
--------MENUCONFIG FOR General--------- CONFIG Link Option ---> IMG2 Data and Heap in SRAM or PSRAM? ---> ( ) SRAM (X) PSRAM
开启 Audio 和 Media 框架
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> ... Audio Config ---> [*] Enable Audio Framework Select Audio Interfaces ---> (X) Mixer ( ) PassThrough [*] Enable Media Framework Demux: [*] Demux WAV [*] Demux MP3 Codec: [*] Codec PCM [*] Codec MP3
开启 IPC 用于 KM4 和 DSP 通信
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... IPC Message Queue Config ---> [*] Enable IPC Message Queue [*] Enable RPC [ ] Enable IPC Message Queue Test
开启 AIVoice,算法版本可按需选择
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... AI Config ---> [ ] Enable TFLITE MICRO [*] Enable AIVoice
编译 KM4 和 KR4 固件
./build.py
准备 AIVoice 资源固件
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
使用 Flash 烧写工具 烧录以下固件:
本示例使用 AIVoice 仓库中提供的预编译 DSP 固件 + AIVoice 资源固件的形式。如果需要自行编译 DSP 固件,请参考 示例 中的离线示例以及 aivoice/examples/speechmind_demo 代码。
将回复音目录打包为虚拟文件系统固件
tts.bin。更多信息可参考 虚拟文件系统cd {SDK}/amebalite_gcc_project ../tools/image_scripts/vfs.py -t LITTLEFS -dir ../component/application/speechmind/res/tts -out tts.bin
根据
tts.bin的大小和aivoice_models.bin的起始地址(预编译 DSP 固件中为 0x08A00000)修改文件{SDK}/component/soc/usrcfg/amebalite/ameba_flashcfg.c中的 Flash 布局。更多信息可参考 Flash 布局与配置#ifdef CONFIG_SOC_SOLO #else FlashLayoutInfo_TypeDef Flash_Layout[] = { /* Region_Type, [StartAddr, EndAddr] */ {IMG_BOOT, 0x08000000, 0x08013FFF}, //Boot Manifest(4K) + KM4 Bootloader(76K) //Users should modify below according to their own memory {IMG_APP_OTA1, 0x08014000, 0x081FFFFF}, //Certificate(4K) + Manifest(4K) + KR4 & KM4 Application OTA1 + RDP IMG OTA1 {IMG_BOOT_OTA2, 0x08200000, 0x08213FFF}, //Boot Manifest(4K) + KM4 Bootloader(76K) OTA {IMG_APP_OTA2, 0x08214000, 0x083DCFFF}, //Certificate(4K) + Manifest(4K) + KR4 & KM4 Application OTA2 + RDP IMG OTA2 {FTL, 0x083DD000, 0x083DFFFF}, //FTL for BT(>=12K), The start offset of flash pages which is allocated to FTL physical map. {VFS1, 0x083E0000, 0x084C9FFF}, //VFS region 1 (936K) {IMG_DSP, 0x084CA000, 0x086FFFFF}, //Manifest(4K) + DSP IMG, only one DSP region in layout {VFS2, 0xFFFFFFFF, 0xFFFFFFFF}, //VFS region 2 {USER, 0x08A00000, 0xFFFFFFFF}, //reserve for user /* End */ {0xFF, 0xFFFFFFFF, 0xFFFFFFFF}, };
备注
本示例中
tts.bin为 936 K,因此 VFS1 结束地址修改为 0x083E0000 + 936K = 0x084C9FFF不同固件地址不能交叠,因此 IMG_DSP 起始地址修改为 0x084C9FFF + 1 = 0x084CA000
编辑
{SDK}/amebalite_gcc_project/project_km4/asdk/make/image2/CMakeLists.txt,编译项目中增加 SpeechMindameba_add_subdirectory_if_exist(${c_CMPT_APP_DIR}/speechmind)切换到 SDK 的 GCC 项目目录,并运行
menuconfig.py进入配置界面cd {SDK}/amebalite_gcc_project ./menuconfig.py
导航至以下菜单路径开启 DSP
--------MENUCONFIG FOR General--------- CONFIG DSP Enable ---> [*] Enable DSP
导航至以下菜单路径选择 PSRAM
--------MENUCONFIG FOR General--------- CONFIG Link Option ---> IMG2 Data and Heap in SRAM or PSRAM? ---> ( ) SRAM (X) PSRAM
开启 Audio 和 Media 框架
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> ... Audio Config ---> [*] Enable Audio Framework Select Audio Interfaces ---> (X) Mixer ( ) PassThrough [*] Enable Media Framework Demux: [*] Demux WAV [*] Demux MP3 Codec: [*] Codec PCM [*] Codec MP3
开启 IPC 用于 KM4 和 DSP 通信
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... IPC Message Queue Config ---> [*] Enable IPC Message Queue [*] Enable RPC [ ] Enable IPC Message Queue Test
开启 AIVoice,算法版本可按需选择
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... AI Config ---> [ ] Enable TFLITE MICRO [*] Enable AIVoice
编译 KM4 和 KR4 固件
./build.py
准备 AIVoice 资源固件
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
使用 Flash 烧写工具 烧录以下固件:
FreeRTOS
将回复音目录打包为虚拟文件系统固件
tts.bin。更多信息可参考 虚拟文件系统cd {SDK}/amebasmart_gcc_project ../tools/image_scripts/vfs.py -t LITTLEFS -dir ../component/application/speechmind/res/tts -out tts.bin
根据
tts.bin的大小修改文件{SDK}/component/soc/usrcfg/amebasmart/ameba_flashcfg.c中的 Flash 布局。更多信息可参考 Flash 布局与配置FlashLayoutInfo_TypeDef Flash_Layout[] = { /* Region_Type, [StartAddr, EndAddr] */ {IMG_BOOT, 0x08000000, 0x0801FFFF}, //Boot Manifest(4K) + KM4 Bootloader(124K) //Users should modify below according to their own memory {IMG_APP_OTA1, 0x08020000, 0x082FFFFF}, //Certificate(4K) + Manifest(4K) + KM0 & KM4 & CA32 Application OTA1 + RDP IMG OTA1 // + AP IMG OTA1 {IMG_BOOT_OTA2, 0x08300000, 0x0833FFFF}, //Boot Manifest(4K) + KM4 Bootloader(252K) OTA {IMG_APP_OTA2, 0x08340000, 0x0861FFFF}, //Certificate(4K) + Manifest(4K) + KM0 & KM4 & CA32 Application OTA2 + RDP IMG OTA2 // + AP IMG OTA2 {FTL, 0x08620000, 0x08622FFF}, //FTL for BT(>=12K), The start offset of flash pages which is allocated to FTL physical map. {VFS1, 0x08623000, 0x0870CFFF}, //VFS region 1 (936K) {VFS2, 0xFFFFFFFF, 0xFFFFFFFF}, //VFS region 2 {USER, 0xFFFFFFFF, 0xFFFFFFFF}, //reserve for user /* End */ {0xFF, 0xFFFFFFFF, 0xFFFFFFFF}, };
备注
本示例中
tts.bin为 936 K,因此 VFS1 结束地址修改为 0x08623000 + 936K = 0x0870CFFF
编辑
{SDK}/amebasmart_gcc_project/project_ap/asdk/make/image2/CMakeLists.txt,编译项目中增加 SpeechMindameba_add_subdirectory_if_exist(${c_CMPT_APP_DIR}/speechmind)切换到 SDK 的 GCC 项目目录,并运行
menuconfig.py进入配置界面cd {SDK}/amebasmart_gcc_project ./menuconfig.py
导航至以下菜单路径选择在 Flash 上跑应用
--------MENUCONFIG FOR General--------- CONFIG Link Option ---> IMG2(Application) running on PSRAM or FLASH? ---> ( ) PSRAM (X) FLASH
开启 Audio 和 Media 框架
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> ... Audio Config ---> [*] Enable Audio Framework Select Audio Interfaces ---> (X) Mixer ( ) PassThrough [*] Enable Media Framework Demux: [*] Demux WAV [*] Demux MP3 Codec: [*] Codec PCM [*] Codec MP3
开启 TFLM 库和 AIVoice,算法版本可按需选择
--------MENUCONFIG FOR General--------- CONFIG TrustZone ---> ... CONFIG APPLICATION ---> GUI Config ---> ... AI Config ---> [*] Enable TFLITE MICRO [*] Enable AIVoice
编译固件
./build.py
使用 Flash 烧写工具 烧录以下固件:
km4_boot_all.bin:默认地址
km0_km4_ca32_app.bin:地址 0x08020000, 0x08600000
tts.bin:与步骤 2 中的 VFS1 地址对应
功能说明
在开发板上烧录固件后,可体验以下语音交互功能:
语音唤醒
通过说
小强小强或你好小强进行唤醒,如果成功唤醒,会打印日志并播放回复音主人我在。超时
唤醒后一段时间内没有交互,会播报语音
主人我先退下了, 有需要请再唤醒我,后续交互需要重新唤醒。超时的时长可以在speech_mind.c代码中通过以下参数调整:aivoice_param.timeout = 10;
命令词识别
唤醒后,可以通过
打开空调、关闭空调等语音指令进行连续交互,如果成功识别,会打印日志并播放对应的回复音。支持的命令词列表见开机后的日志。打断唤醒(回声消除)
先唤醒,再说
播放音乐,此时开始播放歌曲,播放同时可以说唤醒词或命令词进行打断。如果成功识别,会打印日志并暂停当前的音乐播放,改为播放回复音。声源定位
当声源定位功能开启时,每次唤醒后,都会检测说话人所在角度。唤醒后日志会打印角度并播放回复音
xx 度。声源定位功能可以在speech_mind.c代码中通过以下宏开关:#define ENABLE_SSL_DOA 1
术语
- AEC
AEC (Acoustic Echo Cancellation),声学回声消除,或回声消除,是指消除输入信号中的回声信号。回声信号是指麦克风采集到的设备自身扬声器播放的音频。
- AFE
AFE (Audio Front End),音频前端,或信号处理,是指用于原始音频信号预处理的一些模块的组合。通常在进行语音交互前执行以增强信号质量,包含多种语音增强算法。
- AGC
AGC (Automatic Gain Control),自动增益控制,用于动态调节信号的增益,自动调整信号幅值,以保持最佳信号强度。
- ASR
ASR (Automatic Speech Recognition),语音识别,是指把音频中的语音识别为文本。它可用于搭建语音用户界面,实现人类与人工智能设备的语音交互。
- BF
BF (BeamForming),波束形成,是指一种为麦克风阵列设计的空间滤波器,用于增强来自特定方向的信号同时衰减其他方向的信号。
- KWS
KWS (Keyword Spotting),关键词检测,或唤醒词检测、语音唤醒,是指从音频中识别特定的唤醒词。通常是语音交互的第一步,设备检测到唤醒词后,会进入等待语音指令状态。
- NN
NN (Neural Network),神经网络,是一种用于人工智能各类任务的机器学习模型。神经网络依靠训练数据学习并提升准确性。
- NS
NS (Noise Suppression),噪声抑制,或降噪,是指抑制信号中的环境噪声以增强语音信号,尤其是稳态噪声。
- RES
RES (Residual Echo Suppression),残余回声抑制,是指抑制 AEC 处理后的残余回声信号。是 AEC 的后置滤波器。
- SSL
SSL (Sound Source Localization),声源定位,是指利用麦克风阵列估计声源的空间方位。
- TTS
TTS (Text-To-Speech),语音合成,是一种将文本转换为语音的技术。它可用于各种需要将文本转换为人声的语音应用中。
- VAD
VAD (Voice Activity Detection),语音活性检测,或语音端点检测,是指从音频中检测有无语音信号。它被广泛用于语音增强、语音识别等系统中,也可用于去除音频会话中的非语音片段以减少计算、带宽等。