LD3320语音识别模块:LDV7模块使用详解
扫描二维码
随时随地手机看文章
LD3320是非特定人(不用针对指定人)语音识别芯片,即语音声控芯片。最多可以识别50条预先内置的指令。
工作模式:
LD3320(LDV7)语音模块可以工作在以下三种模式:普通模式:直接说话,模块直接识别;按键模式:按键触发开始ASR进程;口令模式:需要一级唤醒词(口令);推荐使用口令模式,这样避免嘈杂环境下误动作。
应用场景:
家居智能控制
智能小车DIY设计
毕业设计创新功能
个人DIY设计
语音控制嵌入式产品设计
我购买的LDV7语音识别模块,内置单片机,LD3320语音识别芯片的驱动是靠模块上自带的STC11L08单片机驱动的,我们可以修改模块自带工程的Demo程序,修改里面的关键词,然后将识别的结果通过串口打印出来,我们使用另外一个MCU与该模块进行串口通信,解析收到的串口指令,进而做响应的指令动作。
例如
我们说口令:当前时间(dang qian shi jian)
》》 模块识别之后,串口输出:PrintCom("{\"VoiceCommandCode\":2}");
》》 MCU接收串口信息之后,对该串口指令进行解析(可以使用cJSON解析此字符串);
》》 然后通过TTS文字转语音模块播放当前时间,即完成本次语音识别控制过程。
识别原理:
就是你说一句话,然后模块用拼音去和你的发音做比较,在关键词中找出哪些预设值的词语与发音的接近程度大于多少的(假定50%),然后再从一堆大于(50% )里面输出一个最接近的。
这里就会造成一个问题,容易造成误识别太多。
如果你只有一个关键词:时间
然后你说了一句:‘时刻’,他识别到‘时’这个发音,所以有50% 以上的相似,但是候选词中没有‘时刻’这个比他更接近的关键词,所以他就会输出‘时间’的结果。这样子他就是错误了。
如果你设置一些拟声词,有可能随随便便就触发了。
解决方案:
在设定好要识别的关键词语后,为了进一步降低误识别率,可以再添加一些其他的任意词汇进识别列表,用来吸收错误识别,从而达到降低误识别率的目的。我们把这样一些关键词语称之为“垃圾关键词语”。
比如,某个应用场景中,需要识别的关键词语是 4 条,“前进”,“后 退”,“开门”,“关门”。在把这 4 个关键词语设置进 LD3320 后,可以再另外设置10~30个词语进LD3320,比如“前门”,“后门”,“阿阿阿”,“呜 呜”等等。所以最好把一些拟声词或者容易混淆的词语设置为垃圾关键词,即,识别后不进行输出。
只有识别结果是 4 个关键词语之内的,才认为识别有效。如果识别结果是 “垃圾关键词语”,则说明是其他的声音导致的误识别,产品应该重新开始一 次识别过程。这样,可以非常有效地降低误识别率。极大地提高终端用户的主观使用体验。
移植过程:
1、向LD模块中添加关键词
2、用户执行函数User_handle(nAsrRes); 处理语音识别结果
3、根据不同结果,串口打印不同的指令
PrintCom("{\"VoiceCommandCode\":1}");
4、MCU根据指令不同,执行不同的动作
以JSON格式发送数据至串口,与语音识别模块相连的MCU接收此结果,然后对此字符串进行解析,进而得到当前识别的命令是什么,进而做相应的动作。
//LD3320
if(USART5_RX_STA&0x8000)
{
uart5Len=USART5_RX_STA&0x3f; //得到此次接收到的数据长度
receive_json = cJSON_Parse(USART5_RX_BUF); //创建JSON解析对象,返回JSON格式是否正确
if (!receive_json)
{
printf("JSON格式错误:%s \r\n", cJSON_GetErrorPtr()); //输出json格式错误信息
}
else
{
printf("JSON格式正确:%s \r\n",cJSON_Print(receive_json) );
item_obj = receive_json->child; //获取name键对应的值的信息
while(item_obj)
{
char * string = item_obj->string;
if(!strcmp(string,"VoiceCommandCode"))
{
if(item_obj->valueint==0)
{
printf("收到一级口令 智能报时 ... \r\n");
}
else if(item_obj->valueint==1)
{
printf("“现在几点了”命令识别成功 \r\n");
m_nCurrentVoicePlayTimes++;
while(U5152_BSY){}
if(m_nCurrentVoicePlayTimes%2==0)
{
sprintf((char*)dtbuf,"[v5][s5][m3]当前时间为%02d时%02d分%02d秒 \r\n",NowHour,NowMinute,NowSecond);
}
else
{
sprintf((char*)dtbuf,"[v5][s5][m51]当前时间为%02d时%02d分%02d秒 \r\n",NowHour,NowMinute,NowSecond);
}
printf((char*)dtbuf);
XFS_FrameInfo((char*)dtbuf) ;
delay_ms(10);while(U5152_BSY){delay_ms(500);printf("while(U5152_BSY) \r\n");}
}
}
item_obj = item_obj->next;
printf("while(item_obj) \r\n");
}
}
cJSON_Delete(receive_json);
USART5_RX_STA=0;
memset(USART5_RX_BUF, 0, sizeof(USART5_RX_BUF)); //清空数组
}
LDV7模块固件下载:
1、打开编译后的.hex文件
2、选对串口号,芯片型号后,选择“下载/编程”按钮,然后给STC单片机上电或者复位。
3、发出语音,测试语音识别结果
然后其他与LDV7模块相连的MCU只要解析接收到的串口数据即可。
喜欢请关注微信公众号:程序员小哈
有啥想玩的模块,留言给我,咱们一起玩
如果有其他的问题可以评论区指出,有问必答,知无不言。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!