ASR_Board_for_Arduino__SKU_DFR0200_ - jimaobian/DFRobotWikiCn GitHub Wiki
ASR Board 是一块基于Arduino的开源语音识别控制模块,该模块只需要通过上位机软件发送指令即可设定要识别的关键词,不需要用户事先训练和录音,是一个高效的非特定人语音识别控制模块。 该模块每次识别可以设置35项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者38个字节的拼音串,可由一个系统支持多种场景。(注:关键词的条数和关键词的长度是对立的,若用户二次开发也可修改为50项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字节的拼音串)。 ASR Board不但可以语音识别还支持播放AD4音频格式的语音文件,可实现语音交互功能,模块通过串口可以和Arduino或其他单片机通讯。模块将Arduino空闲的数字口和模拟口预留出来方便进行二次开发,模块还支持xbee和APC220无线模块,可实现远程语音控制。 该产品适用于智能家居、远程语音点歌系统,远程语音机器人控制等。
- Digital I/O 数字输入/输出端3~7(支持外部电源供电)。
- Analog I/O 模拟输入4~7。
- 采用Arduino USB Serial Light Adapter程序下载器下载程序。
- 支持XBee 无线数传模块。
- 支持APC220无线数传模块。
- 支持外部麦克风输入和线路输出。
- 支持播放AD4音频格式。
- 输入电压:6~12V DC输入。
- 尺寸:长57mm× 宽47mm。
- ①区:模拟LED区域,当点击⑦区域的“模拟LED”后③区域显示“LED”则进入了模拟LED的识别。若用户说“开灯”模拟LED区域显示红色,说“关灯”显示绿色。
- ②区:模拟MP3区域,当点击⑦区域的“模拟MP3(关)”后③区域显示“MP3”则进入了模拟MP3功能。(注:此功能播放的是添加关键词后的AD4音频文件,若用户想以MP3形式播放SD卡内所有AD4音频文件请修改模拟MP3程序。)
- ③区:接收区域。
- ④区:当工作模式设置为按键模式时的“按键触发”按钮
- ⑤区:发送区域。
- ⑥区:对应⑤区域的AT命令解析区域。
- ⑦区:功能区域,点击功能键后在⑤区域显示出相应的AT命令。(“模拟LED”和“模拟MP3(关)”除外)
ASR Board有三个工作模式:循环模式,口令模式和按键模式。工作模式通过ASR Board软件进行修改:
- 循环模式:循环语音识别。当D14灯亮起为进入语音识别状态,用户可立即说出设定好的关键词给控制板识别。
- 口令模式:例程中以“准备”为口令触发命令,若用户想修改为别的口令可在程序中的二维数组sRecog中将“zhun bei”替换即可(为口令触发模式的效果更好,建议口令触发命令的关键词设置为长一点或者添加垃圾关键词来降低误识别率)。当口令触发后,有个提示语音来说明口令已经触发,当D14灯亮起为进入语音识别状态,直到识别到关键词退出语音识别状态,再继续等待口令触发命令。
- 按键模式:在此模式下单击ASR Board 软件上的“按键触发”按钮或者在控制板的D3端接上按钮模块(需要使用到程序中被屏蔽的程序段)按下按钮,当D14灯亮起为进入语音识别状态,直到识别到关键词退出语音识别状态,再继续等待按键触发。
注:当ASR Board重新上电后和上电前使用的工作模式和波特率是相同的(当前的工作模式和波特率有语音提示,若刚上电未听到提示,可按以下控制板上“RST”的按钮),在按键模式时,需要利用ASR Board软件 “触发模式”按钮重新设置为按键模式使触发按钮起作用,或者使用程序中被屏蔽的程序再次下载到控制板,在D3口接上按键模块可正常使用。 在“模拟LED”功能中只设置了循环模式。
- 按钮说明:
标注 | 说明 |
RST | MUC复位按钮 |
- LED指示灯说明:
标注 | 说明 |
ON | 电源状态指示 |
STATE | 语音识别芯片工作状态 |
ASSOC | XBee无线数传链接状态 |
D14 | 连接单片机的A0脚,程序中用作语音识别提示信号(亮说明正在识别中,用户可直接说出设置好的关键词。) |
D8 | 音频文件播放状态 |
- 接口端说明
标注 | 说明 |
J | 数字端3~7口电源VCC为5V/外部电源的切换跳线端 |
APC220 | APC220无线传输模块接口 |
FTDI | Arduino FTDI程序下载器下载程序端口/TTL串口 |
PWRI | 数字端3~7口外部电源接入端 |
SPK | 喇叭接口 |
MIC | 麦克风 |
LINE OUT | 线路输出,可连接功放机或耳机 |
MIC IN | 外部麦克风输入 |
数字口D3 | 默认为“按键识别模式”按钮模块接入端(若使用该接口,需要使用例程中被屏蔽的程序。) |
数字口D4 | 默认为LED模块接入端 |
1.添加关键词:AT+KW=001,cheng du
- 【001】:对应SD卡中语音文件的名称(注意:SD卡中的语音命名为4位的,均为十进制数),取值范围:001-254(十进制)。
- 【cheng du】:需要识别的词语或者句子,文字的拼音用空格键隔开。
- 【指令的功能】:识别到人讲的“成都”两个字时,播放SD卡中以“0001.AD4”命名的语音文件,同时从串口输出数据“cheng du”。
2.查询关键词:AT+KW?
- 【行】:第一列表示关键词的的行数。
- 【值】:第二列表示模块识别到关键词之后将播放SD卡中以此值命名的语音。
3.播放SD卡音频文件:AT+PLAY=001
- 【指令的功能】:播放SD卡中以“0001.AD4”命名的语音文件(注意:SD卡中的语音命名为4位的,均为十进制数),取值范围:000-999(十进制)。
4.波特率设置:AT+BAUD=9600
- 【9600】:模块波特率。(可用波特率有:2400,4800,9600,19200,38400,115200)
- 【指令功能】:波特率更改后立即生效,重新选择波特率后才能再次发送和接收命令。
5.查询AT命令:直接点击此按钮则显示模块的所有AT命令。 6.播放语音是否关闭麦克风输入:AT+MIC=0(1)
- 【0】:当为“0”时,语音播放过程中不允许检测。
- 【1】:当为“1”时,语音播放过程中允许检测。
7.触发模式设置:AT+TM=CT(PT,BT)
- 【CT】:当为“CT”时,为循环识别模式(当触发模式为PT或者BT时需再次用命令AT+TM=CT才可进入循环识别模式)。
- 【PT】:当为“PT”时,为口令识别模式(“准备”是口令触发的关键词)。
- 【BT】:当为“BT”时,为按键识别模式(点击“按键触发”按钮即可)。
8.麦克风灵敏度设置:AT+MS=78
- 【78】:可理解为MIC的音量,可以设置的为0-127(十进制),建议设置为64-85(十进制):值越大代表 MIC 音量越大,识别启动越敏感,但可能带来更多误识别;值越小代表 MIC音量越小,需要近距离说话才能启动识别功能,好处是对远处的干扰语音没有反应。
9.擦除所有关键词:AT+ERASE
- 【指令功能】:除原有的“kai deng”“guan deng”“zhun bei”不会擦除外,擦除所有的关键词。
10.模拟MP3:AT+MP3(软件直接点击“模拟MP3”即可)
- 【指令功能】: 发送该命令后进入模拟MP3功能
11.模拟LED:AT+LED(软件直接点击“模拟LED”即可)
- 【指令功能】: 发送该命令后进入模拟LED功能,识别到人讲的“开灯”LED变为红色,“关灯”LED变为绿色。
语音识别,识别的是“语音”。对于非特定人语音识别来说,在描述关键词语时,是用音标标注出要识别的关键词语。 对于ASR Board支持的中文识别来说,就是用拼音来描述出关键词语。 也就是说,只要是拼音可以拼出的发音,都是可以进行识别的。 因此,在某些场合需要识别一些简单的外文或者纯方言发音的时候,可以用拼音标注的方法来实现。 例如,有些场合需要识别一些简单的英文单词,可以用拼音标注:
- one → wan
- two → tu
- three → si rui
例如,有些场合需要识别一些纯方言发音的词汇,也可以用拼音标注: 上海话的“晚”发音是“ya”,那么“晚报”这个词汇,用普通话标注是“wan bao”,如果要标注成上海话发音,就是“ya bao”,这样上海话说的“晚报”也就可以被识别了。 值得注意的是:ASR Board支持的是中文普通话,有些外文或者方言发音无法用拼音描述,所以模块不一定能够完成所有需要的外文或者方言任务。
1.改变使用环境,或许在某些环境中的噪声或者回声会影响到判断说话结束。 2.说话人自己的音量,如果声音很低,也会导致判断人说话是否结束比较困难。 3.改变命令词语内容,比较好念,开口音响亮等,方便使用者连续清晰念出语音命令。 4.当LED(D14)灯亮起时ASR Board才处于识别中。 5.若D14灯一直不亮,建议检查设置的工作模式是否为“按键触发”模式,若灯亮起关键词无法识别,建议检查设置的工作模式是否为口令模式。
1.串口连接成功,发送AT命令出现“error”或者没有任何显示:建议用户重启ASR Board软件,当D14灯亮起后或者过几秒再操作。这是因为刚开启软件就发送命令会出现乱码造成的错误这是很多上位机都无法避免的。 2.串口连接成功,D14灯亮起,无法使用ASR Board软件(在模块未重启的情况下):建议将波特率修改为上次使用过的波特率。 3.在使用过程中接收区出现乱码:建议重新修改波特率。 4.当使用模拟LED和模拟MP3后,无法进行正常语音识别,这是因为程序一直停留在“模拟LED”或者“模拟MP3”功能中,要退出这些功能需要发送其他功能的AT命令。或者用户在正在播放很长的音乐且播放语音过程中设置为不允许检测语音时,用户又想停止播放但无法发送其他功能的AT命令,在此建议用户点击控制板上的“RST”按钮。 5.因波特率的原因当波特率为2400时“模拟MP3”功能可能无法使用,并非控制板的原因。
在识别精度要求高的场景中,应该采用“触发识别”模式。原因是: 1) 用户在每次按热键后,精神处于最集中的状态,此时用户说的语音命令会比较认真,清晰。避免了用户过于随意的发音导致的识别误差。 2) 每次按热键后,产品应该给以一个明显的开始信号,比如发出“当”的一声或者其他提示信号,可以给用户一个明确开始的提示,方便用户掌握说语音命令的时间。 3) 由于按键触发后,用户就会贴近麦克风并说出语音命令,避免了其他环境声音被录入模块芯片导致的误识别。 另:这种方式还是一种省电的方式,在不识别时,彻底不让芯片工作以省电。
在一些应用场合,希望识别精度高,但是又无法要求用户每次都用手按键来“触发识别”。此时,可以采用“口令触发模式”。 产品定义一句短语,作为触发口令。比如,可以定义“芝麻开门”或者“准备”等作为触发口令。 产品在等待用户触发时,启动一个“循环识别”模式,把触发口令“芝麻开门”和其他几十个用来吸收错误的词汇设置进芯片。只有当检测到识别出的结果是触发口令时,才认为是终端用户叫了这个口令。此时,给出提示音,并启动一个“触发识别模式”,并且把相应的识别列表设置进模块芯片,提示用户在提示音后几秒钟内说出要执行的操作。 在等待用户的过程时,如果识别的结果是那些用来吸收错误的词汇,则认为是误识别,或者其他的声音干扰,而不进行任何的处理(注:ASR Board的程序设置的是直到识别到结果才进入下次口令触发),直接再次进入“循环识别”模式。 这种口令触发模式,融合了其他两种模式的优点,并且结合提到的“垃圾关键词语”的方法,可以为产品提供更加方便实用的语音操作特性。
在设定好要识别的关键词语后,为了进一步降低误识别率,可以再添加一些其他的任意词汇进识别列表,用来吸收错误识别,从而达到降低误识别率的目的。可以把这些关键词语称之为“垃圾关键词语”。 比如,某个应用场景中,需要识别的关键词语是 4 条,“前进”,“后退”,“开门”,“关门”。在把这 4 个关键词语设置进芯片后,可以再另外设置 10~30 个词语进模块芯片,比如“前门”,“后门”,“阿阿阿”,“呜呜”等等。 只有识别结果是 4 个关键词语之内的,才认为识别有效。如果识别结果是“垃圾关键词语”,则说明是其他的声音导致的误识别,产品应该重新开始一次识别过程。 这样,可以非常非常有效地降低误识别率。极大地提高终端用户的主观使用体验。 “垃圾关键词语”的选取,最好可以选择一些字数和关键词语一样的词语,用来吸收可能发生的错误识别。
电磁炉/微波炉/洗衣机/智能家电操作,导航仪,MP3/MP4,数码像框,机顶盒/彩电遥控器,智能玩具/对话玩具,PMP/游戏机,自动售货机,地铁自动售票机,导游机,楼宇电视的广告点播,照明系统的声控 …
内容: ASR Board识别到关键词“开灯”或“关灯”后通过无线数传到 Arduino Duemilanove 328控制器来控制LED。 材料:
- ASR Board 一个
- Arduino Duemilanove 328 一个
- Arduino APC220 USB无线数传 一套
- Arduino红色LED发光模块 一个
- Arduino传感器扩展板V5 一个
- Arduino FTDI程序下载器 一个
ASR Board演示代码(在不同工作模式下语音控制LED):
#include <ASRB.h>
#define SUM 35//关键词的个数
int set=0, vall,res;
char sRecog[SUM][38]={"kai deng","guan deng","zhun bei"};//关键词数组
unsigned int fDigit[SUM]={252,253,254};//AD4音频文件名
void BT(int x,int y,char (*p)[38],unsigned int dd[],int set);
void PT(int x,int y,char (*p)[38],unsigned int dd[],int set);
void ASR_while(int x,int y,char (*p)[38],unsigned int dd[],int set);
void ASR_BT(int x,int y,char (*p)[38],unsigned int dd[],int set);
int button=3,led=4;
void setup()
{
ASRB.Initialise(SUM,sRecog,fDigit);
attachInterrupt(0,ExtInt0Handler,LOW);
//pinMode(button,INPUT);
pinMode(led,OUTPUT);
digitalWrite(led,HIGH);
}
void loop()
{
if(vall==111) PT(SUM,38,sRecog,fDigit,set); //口令模式
else if(vall==112) BT(SUM,38,sRecog,fDigit,set); //按键模式
else
{
while(1)
{ res=0;
res=ASRB.Asr(SUM,38,sRecog,fDigit,set);
ASR_monitor();
delay(10);
ASRB.Busy_SD();
if (Serial.available() > 0) break;
}
} //循环模式
ASRB.AT_command(SUM,38,sRecog,fDigit,set);//判断AT命令
delay(100);
}
void ExtInt0Handler ()
{
ASRB.ProcessInt0();
}
void ASR_while(int x,int y,char (*p)[38],unsigned int dd[],int set)
{
while(1)
{
res=0;
res=ASRB.Asr(x,y,p,dd,set);
ASR_monitor();
delay(10);
ASRB.Busy_SD();
if(res<255&&res>0) break;
if (Serial.available() > 0) break;
// else if(digitalRead(button)==LOW) break;
}
}
void ASR_BT(int x,int y,char (*p)[38],unsigned int dd[],int set)
{
ASRB.send_SD(260);
delay(50);
ASRB.Busy_SD();
ASR_while(x,y,p,dd,set);
}
/**************************************语音控制LED****************************/
void ASR_monitor()
{
if(res==252) digitalWrite(led,LOW);
else if(res==253) digitalWrite(led,HIGH);
}
/*******************************口令模式*************************************/
void PT(int x,int y,char (*p)[38],unsigned int dd[],int set)
{
while(1)
{
set=1;
if (Serial.available() > 0)
{
set=0;
break;
}
int h=ASRB.Asr(x,y,p,dd,set);
delay(50);
if(h==254) //识别到“准备”后进入
{
set=0;
ASRB.send_SD(260);
delay(50);
ASRB.Busy_SD();
ASR_while(x,y,p,dd,set);
}
}
}
/*******************************按键模式**************************************/
void BT(int x,int y,char (*p)[38],unsigned int dd[],int set)
{
char local[10]={0};
char DD[1][6]={"asrbt"};
while(1)
{
if (Serial.available() > 0)
{
local[0]= Serial.read();
delay(20);
if(local[0]!=0x41)
{
for(int i=1;i<8;i++)
{
local[i]= Serial.read();
if( local[i]==0x0a) //判断回车
{
if( local[i-1]==0x0d)
{
local[i]=0;
local[i-1]=0;
if(strcmp(local,DD[0])==0) //AT命令比较
{
ASR_BT(x,y,p,dd,set);
break;
}
}
}
}
}
else
break;
}
/* else if(digitalRead(button)==LOW)
{
delay(100);
if(digitalRead(button)==LOW)
{
ASR_BT(x,y,p,dd,set);
break;
}
}*/
}
}