自动语音识别(ASR)¶
1、简介¶
CI14LP 系列芯片的语音识别引擎(ASR)由前端信号处理(VAD/FE)、DNN 声学模型运算和解码器三部分组成,以预编译库形式提供,用户通过 asr_api.h 中声明的引擎接口完成模型的创建、暂停、恢复与释放。
SDK 中与识别相关的文件需要特别注意:
-
ASR 语音识别解码库文件:在 SDK 包中路径为
components\asr\decoder\,以库文件格式存在,其功能在于通过深度学习算法将声音进行识别并输出对应字符串,由启英泰伦进行更新,用户不用修改该文件; -
声学模型文件(DNN 模型):在 SDK 包中路径为
projects\offline_asr_sample\firmware\dnn\,以 bin 文件格式存在,由启英泰伦提供,用户可根据不同应用场景或语言种类选用; -
语言模型文件:包含唤醒词和命令词,在 SDK 包中路径为
projects\offline_asr_sample\firmware\asr\,以 bin 文件格式存在,需由用户通过启英泰伦语音 AI 平台生成后打包进固件。
2、API¶
引擎接口(components\asr\asr_api.h):
| 函数名 | 描述 |
|---|---|
| asrtop_asr_system_create_model | 创建/启动 ASR 引擎模型 |
| asrtop_asr_system_release | 释放 ASR 系统资源 |
| asrtop_asr_system_pause | 暂停 ASR 系统 |
| asrtop_asr_system_continue | 恢复 ASR 系统运行 |
| asrtop_sys_isbusy | 查询 ASR 系统是否忙 |
| asrtop_get_decode_pcm_finished_frame | 获取已解码帧数 |
| asrtop_asr_switch_fst | 语言模型网络索引切换 |
| asrtop_tdvad_base_energy_cfg | 配置 TDVAD 基础能量系数 |
| asrtop_tdvad_vadend_frames_cfg | 配置 VAD END 条件帧数 |
| asrtop_dynamic_confidence_mode_cfg | 识别打分模式配置 |
识别结果处理接口(components\asr\decoder\decoder_inc\asr_dealwith_result.h):
| 函数名 | 描述 |
|---|---|
| app_deal_asr_reuslt_callback | 应用层识别结果处理回调 |
| init_audio_detector | 音频检测器初始化 |
| ctr_asr_detail_result | 控制详细识别结果打印 |
| asrGetNBestResult | 获取 N-Best 结果 |
| asr_enable_or_disable_identify_word | 使能/禁用识别词 |
流程初始化接口(components\asr\asr_process_callback.h):
| 函数名 | 描述 |
|---|---|
| asr_process_init | ASR 流程初始化(含采音任务创建) |
| set_pcm_vad_mark_flag | 在 PCM 数据上打 VAD 起止标记 |
3、识别结果结构¶
引擎出结果后通过 asr_result_callback 回调(components\asr\asr_process_callback_decoder.h),结果封装为 callback_asr_result_type_t:
typedef struct
{
char* cmd_word; // 命令词字符串
cmd_handle_t cmd_handle; // 命令词信息句柄(据此查 cmd_id/semantic_id)
unsigned int asrvoice_ptr; // 本条结果的语音(干净音频)基地址
short confidence; // 置信度得分
short vocie_valid_frame_len; // 有效语音帧数
short voice_start_frame; // 语音起始帧
short start_word_confidence; // 起始词置信度
short end_word_confidence; // 结束词置信度
short lowest_confidence; // 最低置信度
char cwsl_flag; // 自学习(CWSL)结果标记
} callback_asr_result_type_t;
回调内部将结果打包为系统消息 sys_msg_asr_data_t 发送给系统消息任务:
typedef struct
{
sys_msg_asr_status_t asr_status; // 识别状态(见下表)
cmd_handle_t asr_cmd_handle; // 命令词句柄
uint32_t asr_pcm_base_addr; // 语音(干净音频)基地址
int32_t asr_score; // 置信度得分
int16_t asr_frames; // 语音帧数
} sys_msg_asr_data_t;
识别状态枚举 sys_msg_asr_status_t:
| 枚举值 | 说明 |
|---|---|
| MSG_ASR_STATUS_GOOD_RESULT | 有识别结果 |
| MSG_ASR_STATUS_NO_RESULT | 无识别结果(首帧无语音/超时) |
| MSG_ASR_STATUS_VAD_START | VAD 起始 |
| MSG_ASR_STATUS_AUDIO_PROCESS | 音频处理中 |
| MSG_ASR_STATUS_VAD_END | VAD 结束 |
| MSG_CWSL_STATUS_GOOD_RESULT | 自学习识别结果 |
注意
识别结果中不直接携带 cmd_id 与 semantic_id,需通过命令词信息表接口查询:
cmd_info_get_command_id(cmd_handle)、cmd_info_get_semantic_id(cmd_handle)。
4、示例¶
以下代码为示例工程中 ASR 引擎的标准初始化流程(projects\offline_asr_sample\src\system_init.c 的 task_init 中):
//1. 解码参数通过状态共享模块注入引擎
show_ciss_base_addr(); //状态共享区初始化
ciss_set(CI_SS_DECODER_MIN_ACTIVE, DECODER_MIN_ACTIVE); //decoder最小激活节点(默认400)
float beam = DECODER_BEAM;
ciss_set(CI_SS_DECODER_BEAM, *(uint32_t *)&beam); //decoder beam(默认8.0)
//2. ASR 流程初始化(内部获取模型地址、asrtop_asr_system_create_model 创建模型、
// 创建采音预处理任务 audio_in_preprocess_mode_task)
asr_process_init();
//3. 模型加载完成后通知核间通信模块
set_core_part_ready(MODEL_READY);
以下代码为应用层处理识别消息的典型写法(projects\offline_asr_sample\src\system_msg_deal.c):
void sys_deal_asr_msg(sys_msg_asr_data_t *asr_msg)
{
cmd_handle_t cmd_handle;
if(MSG_ASR_STATUS_GOOD_RESULT == asr_msg->asr_status)
{
cmd_handle = (cmd_handle_t)asr_msg->asr_cmd_handle;
ciss_set(CI_SS_CMD_SCORE, asr_msg->asr_score);
if(cmd_info_is_wakeup_word(cmd_handle)) //唤醒词
{
asr_sm_dispatch(ASR_EVT_WAKEUP_WORD, NULL);
}
else //命令词
{
uint32_t semantic_id = cmd_info_get_semantic_id(cmd_handle);
uint16_t cmd_id = cmd_info_get_command_id(cmd_handle);
//先按命令词ID处理,用户未处理再按语义ID处理
if (0 == deal_asr_msg_by_cmd_id(asr_msg, cmd_handle, cmd_id))
{
deal_asr_msg_by_semantic_id(asr_msg, cmd_handle, semantic_id);
}
}
if(SYS_STATE_WAKEUP == get_wakeup_state())
{
sys_asr_result_hook(cmd_handle, asr_msg->asr_score); //上报通信协议
}
}
else if (MSG_ASR_STATUS_NO_RESULT == asr_msg->asr_status)
{
//首句未识别,可进入低功耗模式
asr_sm_dispatch(ASR_EVT_NO_RESULT_FIRST, NULL);
}
}
5、解码参数配置¶
识别引擎的解码参数定义于 system\sdk_default_config.h,均可用 user_config.h 覆盖:
| 宏 | 默认值 | 说明 |
|---|---|---|
| DECODER_MIN_ACTIVE | 400 | decoder 最小激活节点,节点数小于 8000 可尝试 300,最小 200 最大 800 |
| DECODER_BEAM | 8.0f | decoder beam,最小 3.5,最大 15.5 |
| DEFAULT_CONFIDENCE | 60 | 默认置信度,Excel 未配置词条的默认值,建议 30~150 |
| DEFAULT_CNT | 6 | 默认 cnt,Excel 未配置词条的默认值,建议 4~20 |
| ADAPTIVE_CNT_ENABLE | 1 | 自适应 cnt 使能(关闭需在 Excel 手动配置短词 cnt) |
| MAX_STOP_VAD_FRM | 30 | VAD_END 最大停顿静音间隔帧数(30 帧=300ms),建议 20~50 |
| MAX_STOP_CFD_ENABLE | 0 | 打分超阈值提前结束开关(开启可提升响应速度) |
| DEFAULT_STOP_SILPROB | 0.9f | 识别结束停顿静音概率阈值,越大停顿越长 |
| RECOVER_RESULT_ENABLE | 1 | 识别结果回收(整段结束无有效结果时回溯搜索) |
6、API 参考¶
本模块接口声明于:
components\asr\asr_api.hcomponents\asr\asr_process_callback.hcomponents\asr\asr_process_callback_decoder.hcomponents\asr\decoder\decoder_inc\asr_dealwith_result.h
引擎实现为预编译库(components\asr\decoder\ 及 libs\ 目录),源码不开放。