跳转至

自动语音识别(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.h
  • components\asr\asr_process_callback.h
  • components\asr\asr_process_callback_decoder.h
  • components\asr\decoder\decoder_inc\asr_dealwith_result.h

引擎实现为预编译库(components\asr\decoder\ 及 libs\ 目录),源码不开放。