ASR Board 语音识别控制板

概 述

ASR Board 是一块基于Arduino的开源语音识别控制板,该模块只需要通过上位机软件发送指令即可设定要识别的关键词,不需要用户事先训练和录音,是一个高效的非特定人语音识别控制模块。 该模块每次识别可以设置35项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者38个字节的拼音串,可由一个系统支持多种场景。(注:关键词的条数和关键词的长度是对立的,若用户二次开发也可修改为50项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字节的拼音串)。 ASR Board不但可以语音识别还支持播放AD4音频格式的语音文件,可实现语音交互功能,模块通过串口可以和Arduino或其他单片机通讯。模块将Arduino空闲的数字口和模拟口预留出来方便进行二次开发,模块还支持xbee和APC220无线模块,可实现远程语音控制。 该产品适用于智能家居、远程语音点歌系统,远程语音机器人控制等。

注意:该产品使用时需要外接供电才能正常工作。

性能描述

ASR Board V1.1

ASR Board V2

ASR Board的使用

软件介绍

ASR_Board_1.jpg

工作模式

ASR Board有三个工作模式:循环模式,口令模式和按键模式。工作模式通过ASR Board软件进行修改:

  1. 循环模式:循环语音识别。当D14灯亮起(ASR Board V2.1为D13)为进入语音识别状态,用户可立即说出设定好的关键词给控制板识别。
  2. 口令模式:例程中以“准备”为口令触发命令,若用户想修改为别的口令可在程序中的二维数组sRecog中将“zhun bei”替换即可(为口令触发模式的效果更好,建议口令触发命令的关键词设置为长一点或者添加垃圾关键词来降低误识别率)。当口令触发后,有个提示语音来说明口令已经触发,当D14灯亮起(ASR Board V2.1为D13)为进入语音识别状态,直到识别到关键词退出语音识别状态,再继续等待口令触发命令。
  3. 按键模式:在此模式下单击ASR Board 软件上的“按键触发”按钮或者在控制板的D3端(ASR Board V2.1为D4)接上按钮模块(需要使用到程序中被屏蔽的程序段)按下按钮,当D14灯亮起(ASR Board V2.1为D13)为进入语音识别状态,直到识别到关键词退出语音识别状态,再继续等待按键触发。

:当ASR Board重新上电后和上电前使用的工作模式和波特率是相同的(当前的工作模式和波特率有语音提示,若刚上电未听到提示,可按以下控制板上“RST”的按钮), 在按键模式时,需要利用ASR Board软件 “触发模式”按钮重新设置为按键模式使触发按钮起作用,或者使用程序中被屏蔽的程序再次下载到控制板,在D3口(ASR Board V2.1为D4)接上按键模块可正常使用。 在“模拟LED”功能中只设置了循环模式。

控制板说明

标注 说明
RST MUC复位按钮
标注 说明
ON 电源状态指示
STATE 语音识别芯片工作状态
ASSOC XBee无线数传链接状态
D14 ASR Board V1.1 模拟口A0,程序中用作语音识别提示信号(亮说明正在识别中,用户可直接说出设置好的关键词。)
D13 ASR Board V2.1 数字口13,程序中用作语音识别提示信号(亮说明正在识别中,用户可直接说出设置好的关键词。)
D8 音频文件播放状态
标注 说明
J 数字端3~7口电源VCC为5V/外部电源的切换跳线端
APC220 APC220无线传输模块接口
FTDI Arduino FTDI程序下载器下载程序端口/TTL串口
PWRI 数字端3~7(4~7)口外部电源接入端
SPK 喇叭接口
MIC 麦克风
LINE OUT 线路输出,可连接功放机或耳机
MIC IN 外部麦克风输入
ASR Board V1.1 数字口D3 默认为“按键识别模式”按钮模块接入端(若使用该接口,需要使用例程中被屏蔽的程序。)
数字口D4 默认为LED模块接入端
ASR Board V2.1 数字口D4 默认为“按键识别模式”按钮模块接入端(若使用该接口,需要使用例程中被屏蔽的程序。)
数字口D5 默认为LED模块接入端

ASR Board的指令集详解

1.添加关键词:AT+KW=001,cheng du

2.查询关键词:AT+KW?

3.播放SD卡音频文件:AT+PLAY=001

4.波特率设置:AT+BAUD=9600

5.查询AT命令:直接点击此按钮则显示模块的所有AT命令。

6.播放语音是否关闭麦克风输入:AT+MIC=0(1)

7.触发模式设置:AT+TM=CT(PT,BT)

8.麦克风灵敏度设置:AT+MS=78

9.擦除所有关键词:AT+ERASE

10.模拟MP3:AT+MP3(软件直接点击“模拟MP3”即可)

11.模拟LED:AT+LED(软件直接点击“模拟LED”即可)

ASR Board关键词的识别

语音识别,识别的是“语音”。对于非特定人语音识别来说,在描述关键词语时,是用音标标注出要识别的关键词语。 对于ASR Board支持的中文识别来说,就是用拼音来描述出关键词语。 也就是说,只要是拼音可以拼出的发音,都是可以进行识别的。 因此,在某些场合需要识别一些简单的外文或者纯方言发音的时候,可以用拼音标注的方法来实现。 例如,有些场合需要识别一些简单的英文单词,可以用拼音标注:

例如,有些场合需要识别一些纯方言发音的词汇,也可以用拼音标注: 上海话的“晚”发音是“ya”,那么“晚报”这个词汇,用普通话标注是“wan bao”,如果要标注成上海话发音,就是“ya bao”,这样上海话说的“晚报”也就可以被识别了。 值得注意的是:ASR Board支持的是中文普通话,有些外文或者方言发音无法用拼音描述,所以模块不一定能够完成所有需要的外文或者方言任务。

ASR Board控制器在识别中的常见问题

1.改变使用环境,或许在某些环境中的噪声或者回声会影响到判断说话结束。 2.说话人自己的音量,如果声音很低,也会导致判断人说话是否结束比较困难。 3.改变命令词语内容,比较好念,开口音响亮等,方便使用者连续清晰念出语音命令。 4.当D14灯亮起(ASR Board V2.1为D13)时ASR Board才处于识别中。 5.若D14灯(ASR Board V2.1为D13)一直不亮,建议检查设置的工作模式是否为“按键触发”模式,若灯亮起关键词无法识别,建议检查设置的工作模式是否为口令模式。

ASR Board使用中的常见问题

1.串口连接成功,发送AT命令出现“error”或者没有任何显示:建议用户重启ASR Board软件,当D14灯亮起后(ASR Board V2.1为D13)或者过几秒再操作。这是因为刚开启软件就发送命令会出现乱码造成的错误这是很多上位机都无法避免的。 2.串口连接成功,D14灯亮起(ASR Board V2.1为D13),无法使用ASR Board软件(在模块未重启的情况下):建议将波特率修改为上次使用过的波特率。 3.在使用过程中接收区出现乱码:建议重新修改波特率。 4.当使用模拟LED和模拟MP3后,无法进行正常语音识别,这是因为程序一直停留在“模拟LED”或者“模拟MP3”功能中,要退出这些功能需要发送其他功能的AT命令。或者用户在正在播放很长的音乐且播放语音过程中设置为不允许检测语音时,用户又想停止播放但无法发送其他功能的AT命令,在此建议用户点击控制板上的“RST”按钮。 5.因波特率的原因当波特率为2400时“模拟MP3”功能可能无法使用,并非控制板的原因。

ASR Board的语音识别场景

在识别精度要求高的场景中,使用“触发识别”模式

在识别精度要求高的场景中,应该采用“触发识别”模式。原因是: 1) 用户在每次按热键后,精神处于最集中的状态,此时用户说的语音命令会比较认真,清晰。避免了用户过于随意的发音导致的识别误差。 2) 每次按热键后,产品应该给以一个明显的开始信号,比如发出“当”的一声或者其他提示信号,可以给用户一个明确开始的提示,方便用户掌握说语音命令的时间。 3) 由于按键触发后,用户就会贴近麦克风并说出语音命令,避免了其他环境声音被录入模块芯片导致的误识别。 另:这种方式还是一种省电的方式,在不识别时,彻底不让芯片工作以省电。

口令触发模式

在一些应用场合,希望识别精度高,但是又无法要求用户每次都用手按键来“触发识别”。此时,可以采用“口令触发模式”。 产品定义一句短语,作为触发口令。比如,可以定义“芝麻开门”或者“准备”等作为触发口令。 产品在等待用户触发时,启动一个“循环识别”模式,把触发口令“芝麻开门”和其他几十个用来吸收错误的词汇设置进芯片。只有当检测到识别出的结果是触发口令时,才认为是终端用户叫了这个口令。此时,给出提示音,并启动一个“触发识别模式”,并且把相应的识别列表设置进模块芯片,提示用户在提示音后几秒钟内说出要执行的操作。 在等待用户的过程时,如果识别的结果是那些用来吸收错误的词汇,则认为是误识别,或者其他的声音干扰,而不进行任何的处理(注:ASR Board的程序设置的是直到识别到结果才进入下次口令触发),直接再次进入“循环识别”模式。 这种口令触发模式,融合了其他两种模式的优点,并且结合提到的“垃圾关键词语”的方法,可以为产品提供更加方便实用的语音操作特性。

增添 “垃圾关键词语”——吸收错误识别

在设定好要识别的关键词语后,为了进一步降低误识别率,可以再添加一些其他的任意词汇进识别列表,用来吸收错误识别,从而达到降低误识别率的目的。可以把这些关键词语称之为“垃圾关键词语”。 比如,某个应用场景中,需要识别的关键词语是 4 条,“前进”,“后退”,“开门”,“关门”。在把这 4 个关键词语设置进芯片后,可以再另外设置 10~30 个词语进模块芯片,比如“前门”,“后门”,“阿阿阿”,“呜呜”等等。 只有识别结果是 4 个关键词语之内的,才认为识别有效。如果识别结果是“垃圾关键词语”,则说明是其他的声音导致的误识别,产品应该重新开始一次识别过程。 这样,可以非常非常有效地降低误识别率。极大地提高终端用户的主观使用体验。 “垃圾关键词语”的选取,最好可以选择一些字数和关键词语一样的词语,用来吸收可能发生的错误识别。

应用场景

电磁炉/微波炉/洗衣机/智能家电操作,导航仪,MP3/MP4,数码像框,机顶盒/彩电遥控器,智能玩具/对话玩具,PMP/游戏机,自动售货机,地铁自动售票机,导游机,楼宇电视的广告点播,照明系统的声控 …

ASR Board与Arduino的应用

内容: ASR Board识别到关键词“开灯”或“关灯”后通过无线数传到 Arduino Duemilanove 328控制器来控制LED。 材料:

ASR_Board_2.jpg

ASR Board演示代码(在不同工作模式下语音控制LED): 运行样例程序前,请先安装ASRBArduino库

#include <EEPROM.h>
#include <SPI.h>
#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);

//ASR Board V1.1
int button=3,led=4;

//ASR Board V2.1
//int button=4,led=5;

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;
             }
       }*/
  }
}

小技巧

如何提高“语音识别shield”的响应速度

在语音识别中,或许感觉响应速度慢,解决方法:

ASR Board识别到关键词后,串口输出特定“值”的修改方法

在不同的场合,ASR Board识别到关键词后串口输出的“值”如果不符合我们的需求,该怎么修改呢?


if(n>=0)

{
Serial.println(dd[n]);  //打印音频文件名
t=dd[n];
send_SD(t);//播放音频文件的内容
return t;
 }

相关资料

ASR Board原理图

Arduino库

资料合集下载(包含调试软件、例程等)

<File:nextredirectltr.png>购买 ASR Board for Arduino语音识别控制器 (SKU:DFR0189)