AIVoice 开发指南
支持的芯片
概述
AIVoice 是一套由 Realtek 自主研发的离线 AI 解决方案,包含声学信号处理、唤醒、端点检测、识别等本地算法模块,可用于在 Realtek Ameba SoC 上搭建智能语音相关应用。
AIVoice 可以作为纯离线方案单独使用,也可以结合语音识别、大语言模型等云端系统实现一个离、在线混合的语音交互方案。
应用
应用方案
纯离线:AIVoice 单独使用,支持本地唤醒、识别等功能。
离在线:AIVoice 配合语音识别、大语言模型等云端系统使用,在本地唤醒后与云端语音交互。
应用产品
智能家居:如小爱音箱、天猫精灵等智能音箱,或智能语音家电。可通过语音控制灯光、温度和其他设备。
智能玩具:如 AI 故事机、教育机器人、陪伴机器人等。可通过语音与用户自然对话,回答十万个为什么、讲故事或进行双语教学。
车载系统:通过语音指令导航、拨打电话和播放音乐等,确保驾驶安全并提升驾驶体验。
穿戴产品:如智能手表、智能耳机和健康监测设备等。可以通过语音指令查看和发送消息、控制音乐播放器、接听电话等。
会议场景:实时转录会议内容,帮助与会者更好地记录和回顾讨论要点。
模块
模块 |
功能 |
|---|---|
增强语音信号、降噪,包含子模块: 回声消除、波束成形、噪声抑制、自动增益控制、声源定位 |
|
检测唤醒词以激活语音助手,如 |
|
检测音频中的语音段或噪声段 |
|
检测离线语音控制命令 |
流程
为了方便用户开发,部分算法流程已在 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。
SDK 依赖
AIVoice 需配合以下任一 SDK 使用:
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 |
下载方式
组件 |
Github 仓库 |
SDK 路径 |
|---|---|---|
tflite_micro |
{SDK}/component/tflite_micro |
|
aivoice |
{SDK}/component/aivoice |
下载 ameba-dsp (用于编译 DSP 固件)
自动拉取(推荐):通过以下命令下载 ameba-dsp 同时拉取子仓:
git clone --recursive https://github.com/Ameba-AIoT/ameba-dsp
手动拉取:单独克隆以下子仓库,并放置于 ameba-dsp 的指定路径:
组件 |
Github 仓库 |
SDK 路径 |
|---|---|---|
tflite_micro |
{SDK}/lib/tflite_micro |
|
aivoice |
{SDK}/lib/aivoice |
下载 ameba-rtos (用于编译 KM4、KR4 固件)
自动拉取(推荐):参考 SDK 下载 中的扩展 XDK 下载方法。
手动拉取:单独克隆 ameba-aivoice 仓库,并放置于 SDK 下载 中的基础 SDK 的路径
{SDK}/component/aivoice。
下载 ameba-dsp (用于编译 DSP 固件)
自动拉取(推荐):通过以下命令下载 ameba-dsp 同时拉取子仓:
git clone --recursive https://github.com/Ameba-AIoT/ameba-dsp
手动拉取:单独克隆以下子仓库,并放置于 ameba-dsp 的指定路径:
组件 |
Github 仓库 |
SDK 路径 |
|---|---|---|
tflite_micro |
{SDK}/lib/tflite_micro |
|
aivoice |
{SDK}/lib/aivoice |
下载 ameba-rtos (用于编译 KM4、KR4 固件)
自动拉取(推荐):参考 SDK 下载 中的扩展 XDK 下载方法。
手动拉取:单独克隆 ameba-aivoice 仓库,并放置于 SDK 下载 中的基础 SDK 的路径
{SDK}/component/aivoice。
组件 |
Github 仓库 |
SDK 路径 |
|---|---|---|
tflite_micro |
{SDK}/component/tflite_micro |
|
aivoice |
{SDK}/component/aivoice |
下载 Linux SDK: 参考 SDK 下载 。
下载 AIVoice:单独克隆 ameba-aivoice 仓库并放置于路径
{SDK}/apps/aivoice。
文件说明
AIVoice 仓库目录结构如下,算法及模型等资源均以预编译库的方式提供,路径 prebuilts/lib/ameba_rtos/rtl8721dx_km4:
├── examples
│ ├── build_utils 编译示例用的工具、配置文件等
│ ├── full_flow_offline 示例一:AIVoice 离线示例(使用预录音频)
│ └── speechmind_demo 示例二:SpeechMind 实时示例(使用麦克风输入)
├── include
│ ├── aivoice_afe_config.h AFE 配置头文件
│ ├── aivoice_asr_config.h ASR 配置头文件
│ ├── aivoice_interface.h AIVoice 接口头文件
│ ├── aivoice_kws_config.h KWS 配置头文件
│ ├── aivoice_sdk_config.h 通用配置头文件
│ └── aivoice_vad_config.h VAD 配置头文件
├── prebuilts
│ ├── bin 二进制格式资源
│ ├── image 预编译固件
│ │ └── ameba_dsp
│ └── lib 预编译库
│ ├── ameba_dsp RTL8713E/RTL8726E 库
│ ├── ameba_linux RTL8730E 库(Linux)
│ └── ameba_rtos
│ ├── rtl8721dx_km4 RTL8721Dx 库
│ └── rtl8730e_ca32_freertos RTL8730E 库(RTOS)
└── tools
└── pack_resources 二进制格式资源打包工具
此外,AIVoice 依赖的
TensorFlowLite-Micro
未提供预编译库,编译固件时需要在工程配置中打开 TFLITE MICRO
AIVoice 仓库目录结构如下:
├── examples
│ ├── build_utils 编译示例用的工具、配置文件等
│ ├── full_flow_offline 示例一:AIVoice 离线示例(使用预录音频)
│ └── speechmind_demo 示例二:SpeechMind 实时示例(使用麦克风输入)
├── include
│ ├── aivoice_afe_config.h AFE 配置头文件
│ ├── aivoice_asr_config.h ASR 配置头文件
│ ├── aivoice_interface.h AIVoice 接口头文件
│ ├── aivoice_kws_config.h KWS 配置头文件
│ ├── aivoice_sdk_config.h 通用配置头文件
│ └── aivoice_vad_config.h VAD 配置头文件
├── prebuilts
│ ├── bin 二进制格式资源
│ ├── image 预编译固件
│ │ └── ameba_dsp
│ └── lib 预编译库
│ ├── ameba_dsp RTL8713E/RTL8726E 库
│ ├── ameba_linux RTL8730E 库(Linux)
│ └── ameba_rtos
│ ├── rtl8721dx_km4 RTL8721Dx 库
│ └── rtl8730e_ca32_freertos RTL8730E 库(RTOS)
└── tools
└── pack_resources 二进制格式资源打包工具
其中算法资源(模型、AFE 参数、FST 等)提供库和二进制两种格式,适用于不同开发需求:
资源格式 |
库 |
二进制文件 |
|---|---|---|
资源路径 |
prebuilts/lib/ameba_dsp |
prebuilts/bin |
预编译固件路径 |
无 |
prebuilts/image/ameba_dsp |
所需SDK |
ameba-rtos + ameba-dsp |
ameba-rtos |
固件组成 |
km4_boot_all.bin kr4_km4_app.bin dsp_all.bin |
km4_boot_all.bin kr4_km4_app.bin aivoice_models.bin dsp_all.bin |
资源切换方法 |
在ameba-dsp下更换链接的库文件,重新编译DSP项目 |
在ameba-rtos下通过menuconfig选择版本,重新打包aivoice_models.bin |
技术门槛 |
需掌握DSP开发 |
无需DSP开发 |
灵活性 |
高(可自定义DSP逻辑) |
低(使用预编译DSP固件) |
适用场景 |
有定制化DSP需求 |
快速集成、避免DSP开发 |
AIVoice 仓库目录结构如下:
├── examples
│ ├── build_utils 编译示例用的工具、配置文件等
│ ├── full_flow_offline 示例一:AIVoice 离线示例(使用预录音频)
│ └── speechmind_demo 示例二:SpeechMind 实时示例(使用麦克风输入)
├── include
│ ├── aivoice_afe_config.h AFE 配置头文件
│ ├── aivoice_asr_config.h ASR 配置头文件
│ ├── aivoice_interface.h AIVoice 接口头文件
│ ├── aivoice_kws_config.h KWS 配置头文件
│ ├── aivoice_sdk_config.h 通用配置头文件
│ └── aivoice_vad_config.h VAD 配置头文件
├── prebuilts
│ ├── bin 二进制格式资源
│ ├── image 预编译固件
│ │ └── ameba_dsp
│ └── lib 预编译库
│ ├── ameba_dsp RTL8713E/RTL8726E 库
│ ├── ameba_linux RTL8730E 库(Linux)
│ └── ameba_rtos
│ ├── rtl8721dx_km4 RTL8721Dx 库
│ └── rtl8730e_ca32_freertos RTL8730E 库(RTOS)
└── tools
└── pack_resources 二进制格式资源打包工具
其中算法资源(模型、AFE 参数、FST 等)提供库和二进制两种格式,适用于不同开发需求:
资源格式 |
库 |
二进制文件 |
|---|---|---|
资源路径 |
prebuilts/lib/ameba_dsp |
prebuilts/bin |
预编译固件路径 |
无 |
prebuilts/image/ameba_dsp |
所需SDK |
ameba-rtos + ameba-dsp |
ameba-rtos |
固件组成 |
km4_boot_all.bin kr4_km4_app.bin dsp_all.bin |
km4_boot_all.bin kr4_km4_app.bin aivoice_models.bin dsp_all.bin |
资源切换方法 |
在ameba-dsp下更换链接的库文件,重新编译DSP项目 |
在ameba-rtos下通过menuconfig选择版本,重新打包aivoice_models.bin |
技术门槛 |
需掌握DSP开发 |
无需DSP开发 |
灵活性 |
高(可自定义DSP逻辑) |
低(使用预编译DSP固件) |
适用场景 |
有定制化DSP需求 |
快速集成、避免DSP开发 |
AIVoice 仓库目录结构如下,算法及模型等资源均以预编译库的方式提供,路径 prebuilts/lib/ameba_rtos/rtl8730e_ca32_freertos:
├── examples
│ ├── build_utils 编译示例用的工具、配置文件等
│ ├── full_flow_offline 示例一:AIVoice 离线示例(使用预录音频)
│ └── speechmind_demo 示例二:SpeechMind 实时示例(使用麦克风输入)
├── include
│ ├── aivoice_afe_config.h AFE 配置头文件
│ ├── aivoice_asr_config.h ASR 配置头文件
│ ├── aivoice_interface.h AIVoice 接口头文件
│ ├── aivoice_kws_config.h KWS 配置头文件
│ ├── aivoice_sdk_config.h 通用配置头文件
│ └── aivoice_vad_config.h VAD 配置头文件
├── prebuilts
│ ├── bin 二进制格式资源
│ ├── image 预编译固件
│ │ └── ameba_dsp
│ └── lib 预编译库
│ ├── ameba_dsp RTL8713E/RTL8726E 库
│ ├── ameba_linux RTL8730E 库(Linux)
│ └── ameba_rtos
│ ├── rtl8721dx_km4 RTL8721Dx 库
│ └── rtl8730e_ca32_freertos RTL8730E 库(RTOS)
└── tools
└── pack_resources 二进制格式资源打包工具
此外,AIVoice 依赖的
TensorFlowLite-Micro
未提供预编译库,编译固件时需要在工程配置中打开 TFLITE MICRO
AIVoice 仓库目录结构如下,AIVoice 依赖的 TensorFlowLite、算法及模型等资源均以预编译库的方式提供,路径 prebuilts/lib/ameba_linux:
├── examples
│ ├── build_utils 编译示例用的工具、配置文件等
│ ├── full_flow_offline 示例一:AIVoice 离线示例(使用预录音频)
│ └── speechmind_demo 示例二:SpeechMind 实时示例(使用麦克风输入)
├── include
│ ├── aivoice_afe_config.h AFE 配置头文件
│ ├── aivoice_asr_config.h ASR 配置头文件
│ ├── aivoice_interface.h AIVoice 接口头文件
│ ├── aivoice_kws_config.h KWS 配置头文件
│ ├── aivoice_sdk_config.h 通用配置头文件
│ └── aivoice_vad_config.h VAD 配置头文件
├── prebuilts
│ ├── bin 二进制格式资源
│ ├── image 预编译固件
│ │ └── ameba_dsp
│ └── lib 预编译库
│ ├── ameba_dsp RTL8713E/RTL8726E 库
│ ├── ameba_linux RTL8730E 库(Linux)
│ └── ameba_rtos
│ ├── rtl8721dx_km4 RTL8721Dx 库
│ └── rtl8730e_ca32_freertos RTL8730E 库(RTOS)
└── tools
└── pack_resources 二进制格式资源打包工具
备注
examples/speechmind_demo 为 RTL8713E/RTL8726E 的 DSP 工程代码,RTL8713E/RTL8726E 的 MCU 代码以及其他芯片的示例二代码请参考 speechmind
接口
模块接口
接口 |
模块 |
|---|---|
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 流程或模块。
/* 步骤 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);
示例一:AIVoice 离线示例(使用预录音频)
该例子通过一条提前录制的三通道音频演示如何使用 AIVoice 的全流程,在开发板启动后仅运行一次。 未整合录音、播放等音频功能。
示例代码在 aivoice/examples/full_flow_offline 目录下。
编译示例
切换到 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
将所有 aivoice 示例依赖和链接资源添加到项目中
使用库资源:
cd {DSPSDK}/lib/aivoice/examples/build_utils/ameba_dsp
./add_all_settings_to_project.sh {DSPSDK}/project/project_dsp/ full_flow_offline
使用二进制资源:
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 固件
dsp_all.bin,输出目录{DSPSDK}/source/project/image/。
cd dsp/source/project/auto_build/
./auto_build.sh
备注
默认的 xtensa 配置是 HIFI5_PROD_1123_asic_wUPG,可通过 {DSPSDK}/source/project/image/dsp_batch.xml 中的 configName 修改。
编译 MCU 固件,请参考 DSP 编译 中的 MCU 工程编译步骤。
打包 AIVoice 二进制资源
如果使用 AIVoice 二进制资源,需要额外执行以下操作准备 aivoice_models.bin 文件:
切换到 ameba-rtos 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下的资源打包工具进行资源打包
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
该脚本会根据 {SDK}/amebalite_gcc_project/menuconfig/.config 配置文件自动选择资源文件。
将生成的
aivoice_models.bin文件下载到设备上。
在 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)
使用库资源:
-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
使用二进制资源:
-laivoice -lafe_kernel -lkernel
-lcJSON -ltomlc99 -ltflite_micro
-lxa_nnlib -lhifi5_dsp -laivoice_hal
注意
由于库之间有依赖关系,请确保添加库的顺序与本文档一致。
打包 AIVoice 二进制资源
如果使用 AIVoice 二进制资源,需要额外执行以下操作准备 aivoice_models.bin 文件:
切换到 ameba-rtos 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下的资源打包工具进行资源打包
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
该脚本会根据 {SDK}/amebalite_gcc_project/menuconfig/.config 配置文件自动选择资源文件。
将生成的
aivoice_models.bin文件下载到设备上。
将所有 aivoice 示例依赖和链接资源添加到项目中
使用库资源:
cd {DSPSDK}/lib/aivoice/examples/build_utils/ameba_dsp
./add_all_settings_to_project.sh {DSPSDK}/project/project_dsp/ full_flow_offline
使用二进制资源:
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 固件
dsp_all.bin,输出目录{DSPSDK}/source/project/image/。
cd dsp/source/project/auto_build/
./auto_build.sh
备注
默认的 xtensa 配置是 HIFI5_PROD_1123_asic_wUPG,可通过 {DSPSDK}/source/project/image/dsp_batch.xml 中的 configName 修改。
编译 MCU 固件,请参考 DSP 编译 中的 MCU 工程编译步骤。
打包 AIVoice 二进制资源
如果使用 AIVoice 二进制资源,需要额外执行以下操作准备 aivoice_models.bin 文件:
切换到 ameba-rtos 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下的资源打包工具进行资源打包
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
该脚本会根据 {SDK}/amebalite_gcc_project/menuconfig/.config 配置文件自动选择资源文件。
将生成的
aivoice_models.bin文件下载到设备上。
在 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)
使用库资源:
-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
使用二进制资源:
-laivoice -lafe_kernel -lkernel
-lcJSON -ltomlc99 -ltflite_micro
-lxa_nnlib -lhifi5_dsp -laivoice_hal
注意
由于库之间有依赖关系,请确保添加库的顺序与本文档一致。
打包 AIVoice 二进制资源
如果使用 AIVoice 二进制资源,需要额外执行以下操作准备 aivoice_models.bin 文件:
切换到 ameba-rtos 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下的资源打包工具进行资源打包
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
该脚本会根据 {SDK}/amebalite_gcc_project/menuconfig/.config 配置文件自动选择资源文件。
将生成的
aivoice_models.bin文件下载到设备上。
切换到 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_2mic50mm
AI 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
(可选) 如果需要更换 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 的 GCC 项目目录,并运行
menuconfig.py进入配置界面
cd {SDK}/amebalite_gcc_project
./menuconfig.py
导航至以下菜单路径开启 DSP
--------MENUCONFIG FOR General---------
CONFIG DSP Enable --->
[*] Enable DSP
导航至以下菜单路径配置 Link
Master 分支:
--------MENUCONFIG FOR General---------
CONFIG Link Option --->
IMG2(Application) running on FLASH or PSRAM?
(X) FLASH
( ) PSRAM
IMG2 Data and Heap in SRAM or PSRAM? --->
( ) SRAM
(X) PSRAM
v1.1 分支:
--------MENUCONFIG FOR General---------
CONFIG Link Option --->
IMG2(Application) running on FLASH or PSRAM?
(X) CodeInXip_DataHeapInPsram
( ) CodeInPsram_DataHeapInSram
( ) CodeInPsram_DataHeapInPsram
( ) CodeInXip_DataHeapInSram
开启 VFS LITTLEFS
--------MENUCONFIG FOR General---------
CONFIG VFS --->
[*] Enable VFS LITTLEFS
开启 AIVoice,算法版本可按需选择
--------MENUCONFIG FOR General---------
CONFIG TrustZone --->
...
CONFIG APPLICATION --->
GUI Config --->
...
AI Config --->
[ ] Enable TFLITE MICRO
[*] Enable AIVoice
开启 SpeechMind
--------MENUCONFIG FOR General---------
CONFIG TrustZone --->
...
CONFIG APPLICATION --->
GUI Config --->
...
AI Config --->
[ ] Enable TFLITE MICRO
[*] Enable AIVoice
[*] Enable SpeechMind
编译 KM4 和 KR4 固件
./build.py
准备 AIVoice 资源固件
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
使用 Flash 烧写工具 烧录以下固件:
km4_boot_all.bin:默认地址
kr4_km4_app.bin:默认地址
tts.bin:与步骤 2 中的 VFS1 地址对应
dsp_all.bin:使用
aivoice/prebuilts/image/ameba_dsp/${TARGET}/dsp_all.bin,TARGET 可按需选择。与步骤 2 中的 IMG_DSP 地址对应aivoice_models.bin:与步骤 2 中的 USER 地址对应
本示例使用 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 的 GCC 项目目录,并运行
menuconfig.py进入配置界面
cd {SDK}/amebalite_gcc_project
./menuconfig.py
导航至以下菜单路径开启 DSP
--------MENUCONFIG FOR General---------
CONFIG DSP Enable --->
[*] Enable DSP
导航至以下菜单路径配置 Link
Master 分支:
--------MENUCONFIG FOR General---------
CONFIG Link Option --->
IMG2(Application) running on FLASH or PSRAM?
(X) FLASH
( ) PSRAM
IMG2 Data and Heap in SRAM or PSRAM? --->
( ) SRAM
(X) PSRAM
v1.1 分支:
--------MENUCONFIG FOR General---------
CONFIG Link Option --->
IMG2(Application) running on FLASH or PSRAM?
(X) CodeInXip_DataHeapInPsram
( ) CodeInPsram_DataHeapInSram
( ) CodeInPsram_DataHeapInPsram
( ) CodeInXip_DataHeapInSram
开启 VFS LITTLEFS
--------MENUCONFIG FOR General---------
CONFIG VFS --->
[*] Enable VFS LITTLEFS
开启 AIVoice,算法版本可按需选择
--------MENUCONFIG FOR General---------
CONFIG TrustZone --->
...
CONFIG APPLICATION --->
GUI Config --->
...
AI Config --->
[ ] Enable TFLITE MICRO
[*] Enable AIVoice
开启 SpeechMind
--------MENUCONFIG FOR General---------
CONFIG TrustZone --->
...
CONFIG APPLICATION --->
GUI Config --->
...
AI Config --->
[ ] Enable TFLITE MICRO
[*] Enable AIVoice
[*] Enable SpeechMind
编译 KM4 和 KR4 固件
./build.py
准备 AIVoice 资源固件
../component/aivoice/tools/pack_resources/pack_resources_for_dsp.sh
使用 Flash 烧写工具 烧录以下固件:
km4_boot_all.bin:默认地址
kr4_km4_app.bin:默认地址
tts.bin:与步骤 2 中的 VFS1 地址对应
dsp_all.bin:使用
aivoice/prebuilts/image/ameba_dsp/${TARGET}/dsp_all.bin,TARGET 可按需选择。与步骤 2 中的 IMG_DSP 地址对应aivoice_models.bin:与步骤 2 中的 USER 地址对应
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 的 GCC 项目目录,并运行
menuconfig.py进入配置界面
cd {SDK}/amebasmart_gcc_project
./menuconfig.py
导航至以下菜单路径选择在 Flash 上跑应用
Master 分支:
--------MENUCONFIG FOR General---------
CONFIG Link Option --->
IMG2(Application) running on PSRAM or FLASH? --->
( ) PSRAM
(X) FLASH
v1.1 分支:
--------MENUCONFIG FOR General---------
CONFIG BOOT OPTION --->
[*] XIP_FLASH
开启 VFS LITTLEFS
--------MENUCONFIG FOR General---------
CONFIG VFS --->
[*] Enable VFS LITTLEFS
开启 AIVoice,算法版本可按需选择
--------MENUCONFIG FOR General---------
CONFIG TrustZone --->
...
CONFIG APPLICATION --->
GUI Config --->
...
AI Config --->
[ ] Enable TFLITE MICRO
[*] Enable AIVoice
开启 SpeechMind
--------MENUCONFIG FOR General---------
CONFIG TrustZone --->
...
CONFIG APPLICATION --->
GUI Config --->
...
AI Config --->
[ ] Enable TFLITE MICRO
[*] Enable AIVoice
[*] Enable SpeechMind
选择单核
MENUCONFIG FOR CA32 CONFIG --->
...
CONFIG SMP --->
Select Core Num --->
( ) DUAL
(X) SINGLE
编译固件
./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),语音活性检测,或语音端点检测,是指从音频中检测有无语音信号。它被广泛用于语音增强、语音识别等系统中,也可用于去除音频会话中的非语音片段以减少计算、带宽等。