【ChipIntelli 系列】双语切换

理论基础:声学模型和语言模型

image

DNN ID 和 ASR ID 的关联

dnn id 和 asr id 是和之前的声学模型名(形如[0]G3-YJ-EN-S-V00916.fefixbin3599)和语言模型名(形如 [0]lm_english_CI1303_V00916.dat)前中括号的序号,

其能填在模型表( {60000}{cmd_info}.xlsx )中进行生效。

image

 

语音切换 SDK 编程:  多模型分组切换

CI13XX系列芯片SDK增加了【模型分组】的概念,

一个分组可以是一个应用场景,也可以是一种识别模式,对应一套语音资源(声学模型,语言模型,命令词表,提示音)也就是命令词信息文件《[60000]{xxx}xxx.xls》中的一个工作表(sheet)。

生成固件时,在选择双网络的时候,一个网络为唤醒词网络(较小),另一个网络为命令词网络(较大),这样在平时只会启用唤醒词网络,因此能够降低误识别率:

image

另外,比如有既需要”英文识别”, 也需要”中文识别”的场合,因为中文和英文所需要的资源是不一样的,所以要切换响应的资源。

 

SDK 中如何切换

切换模型分组函数:cmd_info_change_cur_model_group

uint32_t cmd_info_change_cur_model_group(uint8_t model_group_id);

在用户自定义文件  user_msg_deal.c 中,只有一处uint32_t deal_asr_msg_by_cmd_id_for_usr(cmd_handle_t cmd_handle) 用到了该函数:

    #if (UART_PROTOCOL_VER == 255)
    if(MULTI_WAKE_UP_NET_SWITCH)
    {
        set_wake_up_net_by_asr(cmd_id);
        if(cmd_info_is_wakeup_word(cmd_handle))
        {
            if(get_wakeup_net_by_cmd_id(cmd_id) != get_wakeup_net())
            {
                return ret;
            }
            else
            {
                cmd_info_change_cur_model_group(0);
            }
        }
    }
    #endif

其中,set_wake_up_net_by_asr() 函数如下:

void set_wake_up_net_by_asr(uint16_t cmd_id)
{
    uint8_t wakeup_net;
    uint16_t real_len;
    //
    if((cmd_id != SWITCH_WAKEWORD_ID) && (!check_change_cmd_id(cmd_id)))
    {
        return;
    }
    if (CINV_OPER_SUCCESS != cinv_item_read(NVDATA_ID_USER_WAKEUP_NET, sizeof(wakeup_net), &wakeup_net, &real_len))
    {
        wakeup_net = 1;
        cinv_item_init(NVDATA_ID_USER_WAKEUP_NET, sizeof(wakeup_net), &wakeup_net);
    }
    else
    {
        if(cmd_id == SWITCH_WAKEWORD_ID)
        {
            wakeup_net += 1;
            if(wakeup_net > WAKE_UP_NET_TOTAL)
            {
                wakeup_net = 1;
            }
        }
        else
        {
            wakeup_net = get_wakeup_net_by_cmd_id(cmd_id);
        }
    }
    set_wakeup_net(wakeup_net);
    // 
    int play_id = wakeup_net + PLAY_ID_OFFSET_SWITCH;
    pause_voice_in();
    prompt_play_by_cmd_id(play_id, -1, default_play_done_callback,true);
}
get_wakeup_net_by_cmd_id 代码如下:
uint8_t get_wakeup_net_by_cmd_id(uint16_t cmd_id)
{
    int i = 0;
    int net_num = 1;
    int wakeup_num = sizeof(wakeup_lst) / sizeof(wakeup_data);
    for(; i < wakeup_num; i++)
    {
        if(wakeup_lst[i].wakeup_cmd_id == cmd_id)
        {
            net_num = wakeup_lst[i].wakeup_net;
            break;
        }
    }
    return net_num;
}

wakeup_lst 定义如下:

typedef struct
{
    uint16_t wakeup_cmd_id;            /* 唤醒词的命令词id  */
    uint8_t wakeup_net;                /* 唤醒网络         */
}wakeup_data;

// {"cmd_id","wakeup_net"},
wakeup_data wakeup_lst[] = {
///tag-insert-multi-wake-up-net-switch-wakeup-lst-pos-13
//multi_wake_up_net_switch_wakeup_lst_function
    {1,1}, //小仕小仕


};

 

 

参考资料:

1. 软件篇13:中英双语模型切换方法

https://document.chipintelli.com/%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E7%AF%87/%E8%BD%AF%E4%BB%B6%E7%AF%8713%EF%BC%9A%E5%9F%BA%E4%BA%8ESDK%E5%BC%80%E5%8F%91%E5%9B%BA%E4%BB%B6%EF%BC%88%E7%AC%AC%E4%BA%8C%E8%AE%B2%EF%BC%9A%E4%B8%AD%E8%8B%B1%E5%8F%8C%E8%AF%AD%E6%A8%A1%E5%9E%8B%E5%88%87%E6%8D%A2%E6%96%B9%E6%B3%95%EF%BC%89/

 

2. 命令词信息管理模块(command_info)

https://document.chipintelli.com/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/SDK/CI13XX%E8%8A%AF%E7%89%87SDK/CI-SDK-Offline/CI13XX_SDK_ASR_Offline_V2.2.0/API%E6%8C%87%E5%8D%97/SDK%E7%BB%84%E4%BB%B6/%E5%91%BD%E4%BB%A4%E8%AF%8D%E4%BF%A1%E6%81%AF%E8%A1%A8/

 

posted @ 2026-03-23 22:20  FBshark  阅读(57)  评论(0)    收藏  举报