(SKU:DFR0177)中文语音识别模块Voice Recognition
目录 |
概 述
Voice Recognition语音识别模块是一款只需要在主控MCU的程序中设定好要识别的关键词语列表,并动态地把这些关键词语以字符的形式传送到芯片内部,就可以对用户说出的关键词语进行识别,不需要用户事先训练和录音的非特定人语音识别模块。该模块可以设置50项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字母的拼音串,可由一个系统支持多种场景。
Voice Recognition语音识别模块采用叠层设计,可以直接插接到Arduino控制器上,用户使用Arduino便可以快速设计产品原型,例如电磁炉/微波炉/洗衣机/智能家电操作,导航仪,MP3/MP4,数码像框,机顶盒/彩电遥控器,智能玩具/对话玩具,PMP/游戏机,自动售货机,地铁自动售票机,导游机,楼宇电视的广告点播,照明系统的声控等等。
性能描述
1.工作电压:5V
2.兼容Arduino和Arduino MEGA控制板
3.具有板载MIC,支持单声道输入
4.具有DFRuino Player模块接口
5.具有DFRuino Player模块UART/I2C接口切换开关(MEGA只能使用UART接口)
6.尺寸:长54mm× 宽47mm
Voice Recognition的使用
Voice Recognition模块说明
开关按钮说明
LED指示灯说明
接口端说明
占用Arduino端口说明
Voice Recognition模块语音识别
语音识别,识别的是“语音”。对于非特定人语音识别来说,在描述关键词语时,是用音标标注出要识别的关键词语。
对于Voice Recognition模块支持的中文识别来说,就是用拼音来描述出关键词语。
也就是说,只要是拼音可以拼出的发音,都是可以进行识别的。
因此,在某些场合需要识别一些简单的外文或者纯方言发音的时候,可以用拼音标注的方法来实现。
例如,有些场合需要识别一些简单的英文单词,可以用拼音标注:
one → wan
two → tu
three → si rui
例如,有些场合需要识别一些纯方言发音的词汇,也可以用拼音标注:
上海话的“晚”发音是“ya”,那么“晚报”这个词汇,用普通话标注是“wan bao”,如果要标注成上海话发音,就是“ya bao”,这样上海话说的“晚报”也就可以被识别了。
值得注意的是:模块支持的是中文普通话,有些外文或者方言发音无法用拼音描述,所以模块不一定能够完成所有需要的外文或者方言任务。
Voice Recognition模块识别中的常见问题
1)改变使用环境,或许在某些环境中的噪声或者回声会影响到判断说话结束。
2)说话人自己的音量,如果声音很低,也会导致判断人说话是否结束比较困难。
3)改变命令词语内容,比较好念,开口音响亮等,方便使用者连续清晰念出语音命令。
Voice Recognition模块语音识别应用场景
1.在识别精度要求高的场景中,使用“触发识别”模式
在识别精度要求高的场景中,应该采用“触发识别”模式。原因是:
1) 用户在每次按热键后,精神处于最集中的状态,此时用户说的语音命令会比较认真,清晰。避免了用户过于随意的发音导致的识别误差。
2) 每次按热键后,产品应该给以一个明显的开始信号,比如发出“当”的一声或者其他提示信号,可以给用户一个明确开始的提示,方便用户掌握说语音命令的时间。
3) 由于按键触发后,用户就会贴近麦克风并说出语音命令,避免了其他环境声音被录入模块芯片导致的误识别。
另:这种方式还是一种省电的方式,在不识别时,彻底不让芯片工作以省电。
2.增添 “垃圾关键词语”——吸收错误识别
在设定好要识别的关键词语后,为了进一步降低误识别率,可以再添加一些其他的任意词汇进识别列表,用来吸收错误识别,从而达到降低误识别率的目的。
可以把这些关键词语称之为“垃圾关键词语”。
比如,某个应用场景中,需要识别的关键词语是 4 条,“前进”,“后退”,“开门”,“关门”。在把这 4 个关键词语设置进芯片后,可以再另外设置 10~30 个词语进模块芯片,比如“前门”,“后门”,“阿阿阿”,“呜呜”等等。
只有识别结果是 4 个关键词语之内的,才认为识别有效。如果识别结果是“垃圾关键词语”,则说明是其他的声音导致的误识别,产品应该重新开始一次识别过程。
这样,可以非常非常有效地降低误识别率。极大地提高终端用户的主观使用体验。
“垃圾关键词语”的选取,最好可以选择一些字数和关键词语一样的词语,用来吸收可能发生的错误识别。
3.口令触发模式
在一些应用场合,希望识别精度高,但是又无法要求用户每次都用手按键来“触发识别”。此时,可以采用“口令触发模式”。
产品定义一句短语,作为触发口令。比如,可以定义“芝麻开门”作为触发口令。
产品在等待用户触发时,启动一个“循环识别”模式,把触发口令“芝麻开门”和其他几十个用来吸收错误的词汇设置进芯片。只有当检测到识别出的结果是触发口令时,才认为是终端用户叫了这个口令。此时,给出提示音,
并启动一个“触发识别模式”,并且把相应的识别列表设置进模块芯片,提示用户在提示音后几秒钟内说出要执行的操作。
在等待用户的过程时,如果识别的结果是那些用来吸收错误的词汇,则认为是误识别,或者其他的声音干扰,而不进行任何的处理,直接再次进入“循环识别”模式。
这种口令触发模式,融合了其他两种模式的优点,并且结合提到的“垃圾关键词语”的方法,可以为产品提供更加方便实用的语音操作特性。
4.应用场景
电磁炉/微波炉/洗衣机/智能家电操作,导航仪,MP3/MP4,数码像框,机顶盒/彩电遥控器,智能玩具/对话玩具,PMP/游戏机,自动售货机,地铁自动售票机,导游机,楼宇电视的广告点播,照明系统的声控等等。
5. 应用实例
用语音控制开灯关灯,并具有语音提示,实现人机互动操作。需要器材有:Arduino控制器,Arduino扩展板,语音识别模块,MP3模块,喇叭,LED灯,电源适配器,USB电缆。
如果没有LLed模块,可以用直接通过串口观察。打开串口,设置好波特率,等到串口提示ASR_RUNING.....的时候,请用用标准的普通话说开~~灯~~,PS:不要把嘴巴凑在话筒上..ԅ(¯ㅂ¯ԅ)
Arduino语音控制LED演示代码
#include <Voice.h> #define SUM 2 //SUM识别关键词的个数,最大不超过50个 uint8 nAsrStatus=0; char sRecog[SUM][80] = {"kai deng", "guan deng"};//每个关键词拼音字母个数不超过79个,用户可以自行修改 ? int state=7; //状态指示灯 int led=8; //受控制数字口 void finally (unsigned char n) { switch(n) //n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0; { case 0: Serial.println( "kai deng"); Serial.println( " "); digitalWrite(led,LOW); break; case 1: Serial.println( "guan deng"); digitalWrite(led,HIGH); break; default: Serial.println( "error"); Serial.println( " "); break; } } void ExtInt0Handler () { Voice.ProcessInt0(); //芯片送出中断信号 } void setup() { Serial.begin(9600); Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield //VoiceRecognitionV2 is VoiceRecognitionV2.1 module attachInterrupt(0,ExtInt0Handler,LOW); pinMode(led,OUTPUT); pinMode(state,OUTPUT); digitalWrite(state,HIGH); digitalWrite(led,HIGH); } void loop() { uint8 nAsrRes; nAsrStatus = LD_ASR_NONE; while(1) { switch(nAsrStatus) { case LD_ASR_RUNING: case LD_ASR_ERROR: break; case LD_ASR_NONE: { nAsrStatus=LD_ASR_RUNING; if (Voice.RunASR(SUM,80,sRecog)==0) //识别不正确 { nAsrStatus= LD_ASR_ERROR; Serial.println( "ASR_ERROR"); } digitalWrite(state,LOW); Serial.println( "ASR_RUNING....."); break; } case LD_ASR_FOUNDOK: { digitalWrite(state,HIGH); nAsrRes =Voice. LD_GetResult();//一次ASR识别流程结束,去取ASR识别结果 finally(nAsrRes); nAsrStatus = LD_ASR_NONE; break; } case LD_ASR_FOUNDZERO: default: { nAsrStatus = LD_ASR_NONE; break; } }// switch delay(500); }// while }
Arduino语音控制MP3模块演示代码
#include <Wire.h> #include <Voice.h> #define ArduinoPlayer_address 0x35 //定义ArduinoPlayer 语音播放模块I2C地址 #define SUM 4 //SUM识别关键词的个数,最大不超过50个 uint8 nAsrStatus=0; char sRecog[SUM][80] = {"kai deng", "guan deng", "yin yue", "ting zhi"};//每个关键词拼音字母个数不超过79个,用户可以自行修改 int state=7; //状态指示灯 int led=8; //受控制数字口 void TwiSend(const char *cmd) //I2C发送命令函数 { char len = 0; len = strlen(cmd); Wire.beginTransmission(ArduinoPlayer_address); while(len--) { Wire.write(*(cmd++)); } Wire.endTransmission(); } void finally (unsigned char n) { switch(n) //n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0; { case 0: Serial.println( "kai deng"); Serial.println( " "); TwiSend("\\:v 250\r\n"); TwiSend("\\kaideng\r\n"); //指定文件名播放语音 delay(2000); digitalWrite(led,LOW); break; case 1: Serial.println( "guan deng"); Serial.println( " "); TwiSend("\\:v 250\r\n"); TwiSend("\\guandeng\r\n"); delay(2000); digitalWrite(led,HIGH); break; case 2: Serial.println( "muisc ok!"); Serial.println( " "); TwiSend("\\:v 250\r\n"); TwiSend("\\:n\r\n"); break; case 3: Serial.println( "muisc stop!"); Serial.println( " "); TwiSend("\\:v 250\r\n"); TwiSend("\\:p\r\n"); break; default: Serial.println( "error"); Serial.println( " "); break; } } void ExtInt0Handler () { Voice.ProcessInt0(); //芯片送出中断信号 } void setup() { Wire.begin(); Serial.begin(9600); Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield //VoiceRecognitionV2 is VoiceRecognitionV2.1 module attachInterrupt(0,ExtInt0Handler,LOW); pinMode(led,OUTPUT); pinMode(state,OUTPUT); digitalWrite(state,HIGH); digitalWrite(led,HIGH); } void loop() { uint8 nAsrRes; nAsrStatus = LD_ASR_NONE; while(1) { switch(nAsrStatus) { case LD_ASR_RUNING: case LD_ASR_ERROR: break; case LD_ASR_NONE: { nAsrStatus=LD_ASR_RUNING; if (Voice.RunASR(SUM,80,sRecog)==0) //识别不正确 { nAsrStatus= LD_ASR_ERROR; Serial.println( "ASR_ERROR"); } digitalWrite(state,LOW); Serial.println( "ASR_RUNING....."); break; } case LD_ASR_FOUNDOK: { digitalWrite(state,HIGH); nAsrRes =Voice. LD_GetResult();//一次ASR识别流程结束,去取ASR识别结果 finally(nAsrRes); nAsrStatus = LD_ASR_NONE; break; } case LD_ASR_FOUNDZERO: default: { nAsrStatus = LD_ASR_NONE; break; } }// switch delay(500); }// while }