跳转至

SDK软件结构


1. SDK软件结构图

SDK软件结构

图1-1 SDK软件结构

2. SDK目录结构

CI14LP_SDK_ASR_Offline_V1.0.28 顶层目录如下:

--components                 // 功能组件
----asr                      // 语音识别(asr_api.h、asr_process_callback、decoder)
----alg                      // 语音前端算法(头文件+调用接口,算法实现在libasr.a中)
------denoise                // 单麦降噪(USE_DENOISE_MODULE宏控制)
------doa                    // 双麦声源定位
------dereverb               // 双麦降混响
------beamforming            // 双麦波束成形/语音增强
------aec                    // 回声消除
------alc_auto_switch        // 自动增益控制(自动开关切换)
------basic_alg              // 基础算法工具(ci_basic_alg.h/ci_doa_apply.h等)
------ci_alg_malloc.h        // 算法内存管理
----assist                   // 辅助函数
----audio_in_manage          // 音频采集实时任务(含alg_preprocess/ci_buffer_manage)
----audio_pre_rslt_iis_out   // 语音前处理结果IIS输出组件
----ci_cwsl                  // 命令词自学习(cwsl_manage.h)
----ci_nvdm                  // NVDS用户数据管理(ci_nvdata_manage)
----cmd_info                 // 固件信息解析(含prompt_player提示音播放接口)
----codec_manager            // codec管理器(含ringbuf)
----dnn                      // DNN公共模块
----fft                      // fft管理器
----flash_control            // flash管理器
----flash_encrypt            // flash加密策略
----freertos                 // 操作系统(FreeRTOS)
----freertos_no_rom          // 非ROM版FreeRTOS移植
----ipc                      // 核间通信(command_core_communication)
----led                      // 指示灯控制
----log                      // 日志打印(ci_log)
----misc                     // 杂项
----msg_com                  // 通信协议(串口G1/G2/G3、IIC协议)
----npu                      // NPU(BNPU)接口
----ota                      // OTA升级(firmware_updater/flash_update)
----player                   // 播放器(mp3lib + simple_mp3_player精简MP3播放器)
----RISCV                    // RISC-V相关
----spi_lcd                  // SPI LCD显示
----status_share             // 状态共享
----sys_monitor              // 系统监控器
----system                   // 系统相关组件
--projects                   // 应用示例代码
----offline_asr_sample       // CI14LP系列离线语音识别模板工程(src/project_file/firmware)
--driver                     // 驱动
----boards                   // 板级支持:board.c/h、CI-L0XGS01D-V10.h、CI-14LP-TEST-V10.h
----ci14lp_chip_driver       // 芯片内部驱动(inc/src)
----third_device_driver      // 外部器件驱动
--startup                    // 启动代码(ci14lp_init.c/ci14lp_startup.S/ci14lp_vtable.S)
--system                     // 系统统一头定义(sdk_default_config.h、ci_system.h等)
--Newlib_Port                // Newlib C库移植
--libs                       // 预编译库(libasr.a、libfbin1/2.a、libfft.a等)
--tools                      // 工具(ci-tool-kit、PACK_UPDATE_TOOL等)
--utils                      // 编译/调试辅助脚本(generate_makefile.lua等)

V1.0.28 目录说明

  1. 本SDK为CI14LP系列**离线语音识别SDK**(SDK_TYPE="ASR"),算法均以头文件+库形式提供:components/alg下为算法接口头文件,算法实现在 libs/libasr.a 中。
  2. 播放器为 components/player(mp3lib解码库 + simple_mp3_player精简MP3播放器),通过 AUDIO_PLAYER_ENABLE 宏控制是否启用播放功能。
  3. 通信协议位于 components/msg_com:串口协议支持 G1/G2/G3(voice_module_uart_protocol_g1/g2/g3),另支持IIC协议(i2c_protocol_module)。
  4. 音频采集任务为 audio_in_manage(含 alg_preprocess 算法预处理与 ci_buffer_manage 音频缓冲管理)。

3. SDK用户代码说明

SDK用户代码区域如下图3-1所示:

SDK用户代码区域

图3-1 SDK用户代码区域

下列文件所在目录:CI14LP_SDK_ASR_Vx.x.x\projects\offline_asr_sample\src\

文件名 描述
main.c 主函数所在文件:包含任务创建、平台初始化、系统启动代码
system_init.c/h 系统初始化(外设、时钟DVFS、IO等)
system_hook.c/h 事件钩子接口:系统启动、唤醒、退出唤醒、语音识别等事件钩子函数
system_msg_deal.c/h 系统消息处理任务(含ASR消息分发,调用用户命令词/语义处理函数)
system_run_monitor.c/h 系统运行监控
system_core_communication.c/h 系统核间/任务间通信辅助
user_config.h 用户配置宏定义.h文件(可覆盖sdk_default_config.h配置)
user_msg_deal.c/h 用户代码:串口协议、IIC协议、按键消息、命令词/语义ID处理等
dvfs.c/h 动态调频调压(DVFS)配置
ci_ssp_config.c SSP(语音前端/安全)配置

4. 添加代码示例

(1)针对唤醒词添加协议等处理代码,找到CI14LP_SDK_ASR_Vx.x.x\projects\offline_asr_sample\src,

  • 先在user_msg_deal.h里添加处理接口声明,例如:
void wake_up_xxx_deal(void);
  • 然后在user_msg_deal.c里添加处理接口定义,例如:
void wake_up_xxx_deal(void)
{
    /*处理接口逻辑代码*/
}
  • 最后在system_hook.c里调用接口,例如:
__WEAK void sys_weakup_hook(void)
{
    #if MSG_COM_USE_UART_EN
    vmup_send_notify(VMUP_MSG_DATA_NOTIFY_WAKEUPENTER);
    #endif

    /*此处添加处理接口调用*/
    wake_up_xxx_deal();
}

注意

系统其他状态(系统启动、系统退出唤醒、语音识别),也可参照上述方式添加代码,但需在对应的事件钩子函数中调用。

(2)根据命令词ID添加处理代码,找到CI14LP_SDK_ASR_Vx.x.x\projects\offline_asr_sample\src\user_msg_deal.c的deal_asr_msg_by_cmd_id函数。

命令词ID的对应命令词,由CI14LP_SDK_ASR_Vx.x.x\projects\offline_asr_sample\firmware\user_file\cmd_info\[60000]{xxx}V2.xlsx指定:

uint32_t deal_asr_msg_by_cmd_id(sys_msg_asr_data_t *asr_msg, cmd_handle_t cmd_handle, uint16_t cmd_id)
{
    uint32_t ret = 1;
    int select_index = -1;
    switch(cmd_id)
    {
        case 2://"打开空调"
        {
            /*此处根据命令词ID添加处理代码*/
            break;
        }
        /*自行添加case处理命令词ID*/
        /*省略部分代码*/
        default:
            ret = 0;
            break;
    }
    /*省略部分代码*/
}

(3)根据语义ID添加处理代码,找到CI14LP_SDK_ASR_Vx.x.x\projects\offline_asr_sample\src\user_msg_deal.c的deal_asr_msg_by_semantic_id函数。

更多语义ID信息可以访问 ☞《CI14LP系列芯片语义ID说明文档》页面

uint32_t deal_asr_msg_by_semantic_id(sys_msg_asr_data_t *asr_msg, cmd_handle_t cmd_handle, uint32_t semantic_id)
{
    uint32_t ret = 1;
    if (PRODUCT_GENERAL == get_product_id_from_semantic_id(semantic_id))
    {
        uint8_t vol;
        int select_index = -1;
        switch(get_function_id_from_semantic_id(semantic_id))
        {
        case VOLUME_UP:        //增大音量
            vol = vol_set(vol_get() + 1);
            select_index = (vol == VOLUME_MAX) ? 1:0;
            break;
        case XXX_XXX:
            /*此处根据语义ID添加处理代码*/
            break;
        /*自行添加case处理语义ID*/
        /*省略部分代码*/
        default:
            ret = 0;
            break;
        }
        /*省略部分代码*/
    }
    /*省略部分代码*/
}

5. SDK代码逻辑分析

由于语音识别的系统的特定需要,因此SDK中程序已经包含了大量初始化工作,为了帮助用户更快的熟悉代码结构流程,现将程序启动流程和工作状态做以简单说明。

SDK程序启动流程和工作状态

图5-1 SDK程序启动流程和工作状态

如上图所示,系统上电启动后进入main函数初始化相关硬件,然后创建一个vTaskCreate线程后启动FreeRTOS系统,vTaskCreate线程中会创建识别和播报的相关线程,之后系统进入sleep状态并采集语音输入。

当正确的语音输入给识别线程后,识别线程将通过消息队列的机制将消息发送到用户线程中进行处理,在SDK的用户线程中,已经完成了一部分操作比如播放对应的播报语音,切换系统状态,发送串口协议等工作,用户增加代码时一般只需在用户线程中增加代码,因此理解用户线程的中的消息处理机制就可以轻松扩展功能。

当外部通讯串口发送串口协议控制语音板时,将在通讯串口中断中解析串口协议,成功解析后将在中断中调用vmup_port_send_packet_rev_msg函数发送串口消息给用户线程,用户线程收到该消息后将在依次调用deal_userdef_msg >> userapp_deal_com_msg >> userapp_deal_cmd最终在此处同步或异步(大多数为同步执行,但播放播报词为异步请求)执行功能,完成后发回ACK到通讯串口。