【ChipIntelli 系列】双语切换
理论基础:声学模型和语言模型

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 )中进行生效。

语音切换 SDK 编程: 多模型分组切换¶
CI13XX系列芯片SDK增加了【模型分组】的概念,
一个分组可以是一个应用场景,也可以是一种识别模式,对应一套语音资源(声学模型,语言模型,命令词表,提示音)也就是命令词信息文件《[60000]{xxx}xxx.xls》中的一个工作表(sheet)。
生成固件时,在选择双网络的时候,一个网络为唤醒词网络(较小),另一个网络为命令词网络(较大),这样在平时只会启用唤醒词网络,因此能够降低误识别率:

另外,比如有既需要”英文识别”, 也需要”中文识别”的场合,因为中文和英文所需要的资源是不一样的,所以要切换响应的资源。
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);
}
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/

浙公网安备 33010602011771号