ASR语音识别控制板

概 述

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

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

性能描述

ASR Board V3

  • 硬件选择:Arduino Leonardo
  • Digital I/O 数字输入/输出端4~7(支持外部电源供电)。
  • Analog 模拟输入0~3。
  • 采用USB接口直接下载程序。
  • 支持XBee无线数传模块。
  • 支持外部麦克风输入和线路输出。
  • 支持SD卡存放语音文件。
  • 支持USB接口给SD卡更新语音文件。
  • 支持播放MP3音频格式。
  • 输入电压:6~12V DC,推荐使用7.5V电源适配器或7.4V锂电池。
  • 尺寸:长57mm× 宽47mm。

ASR Board V2

  • 硬件选择:Arduino Leonardo
  • Digital I/O 数字输入/输出端4~7(支持外部电源供电)。
  • Analog 模拟输入0~3。
  • 采用USB线直接下载程序。
  • 支持XBee无线数传模块。
  • 支持APC220无线数传模块。
  • 支持外部麦克风输入和线路输出。
  • 支持SD卡存放语音文件。
  • 支持播放AD4/MP4音频格式。
  • 输入电压:6~12V DC,推荐使用7.5V电源适配器或7.4V锂电池。
  • 尺寸:长57mm× 宽47mm。

ASR Board V1.1

  • 硬件选择:Arduino UNO
  • Digital I/O 数字输入/输出端3~7(支持外部电源供电)。
  • Analog 模拟输入4~7。
  • 采用Arduino USB Serial Light Adapter程序下载器下载程序。
  • 支持XBee无线数传模块。
  • 支持APC220无线数传模块。
  • 支持外部麦克风输入和线路输出。
  • 支持SD卡存放语音文件。
  • 支持播放AD4/MP3音频格式。
  • 输入电压:6~12V DC,推荐使用7.5V电源适配器或7.4V锂电池。
  • 尺寸:长57mm× 宽47mm

引脚说明

ASR Board如何使用

A.ASR Board AT指令集

注意:需要烧录出厂程序(库文件里面的样例程序example——>ASRBled)才能使用AT命令,使用AT命令的设置会保存在EEPROM中,掉电不会丢失。
1.添加关键词:AT+KW=001,cheng du

  • 【001】:AT指令为3位数,取值范围:001-254(十进制),对应SD卡中语音文件的名称(注意:SD卡中的文件命名必须为4位数,取值范围:0001-0254)。
  • 【cheng du】:需要识别的词语或者句子,文字的拼音用空格键隔开。
  • 【指令的功能】:识别到人讲的“成都”两个字时,播放SD卡中以“0001.AD4”(V3版为“0001.MP3”)命名的语音文件,同时从串口输出数据“cheng du”。

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

  • 【行】:第一列表示关键词的的行数。
  • 【值】:第二列表示模块识别到关键词之后将播放SD卡中以此值命名的语音。
  • 【关键词】:第三列需要识别的词语或者句子,文字的拼音用空格键隔开。

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

  • 【指令的功能】:播放SD卡中以“0001.AD4”(V3版为“0001.MP3”)命名的语音文件(注意:SD卡中的语音命名为4位的,均为十进制数),取值范围:000-999(十进制)。

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

  • 【9600】:模块波特率。(可用波特率有:2400,4800,9600,19200,38400,115200)
  • 【指令功能】:波特率更改后立即生效,重新选择波特率后才能再次发送和接收命令。

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

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

  • 【0】:当为“0”时,语音播放过程中不允许检测。
  • 【1】:当为“1”时,语音播放过程中允许检测。

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

  • 【CT】:当为“CT”时,为循环识别模式(当触发模式为PT或者BT时需再次用命令AT+TM=CT才可进入循环识别模式)。
  • 【PT】:当为“PT”时,为口令识别模式(“准备”是口令触发的关键词)。
  • 【BT】:当为“BT”时,为按键识别模式(需在D4口(老版为D3)外接按钮)。

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

  • 【78】:可理解为MIC的音量,可以设置的为0-127(十进制),建议设置为64-85(十进制):值越大代表 MIC 音量越大,识别启动越敏感,但可能带来更多误识别;值越小代表 MIC音量越小,需要近距离说话才能启动识别功能,好处是对远处的干扰语音没有反应。

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

  • 【指令功能】:除原有的“kai deng”“guan deng”“zhun bei”不会擦除外,擦除所有的关键词。

B.AT命令的使用

功能:使用AT指令,初步认识ASR Board。

材料:

  • ASR Board 一个
  • Micro USB数据线 一个

板子出厂已经下载过代码,可以直接使用,如果需要另外实现功能可重新下载新代码。
使用过程:

(1)将小喇叭插在ASR Board的spk针脚上,红线接在正极,黑线接在负极(或者直接在LINE OUT处接上耳机)

[连接图]

(2)将资料中提供的AD4文件拷贝到SD卡中,将SD卡插在ASR Board的卡槽上(也可以自己录制音频文件,再使用AD4编码软件进行格式转换,使用方法见附件中的《AD4音频格式转换指南》)。ASR Board V3版本将直接使用MP3文件,无需再进行转换,同时把USB旁边的开关拨打SD一边,电脑将弹出一个U盘,即可使用USB直接给SD卡更新语音文件,无需取下SD卡;

(3)使用USB数据线连接ASR Board和电脑,在工具选项里面选择正确的板卡和端口号,V1版板卡选择UNO,V2以后版本板卡选择Leonardo,V3版需要把USB旁边的开关拨打MCU一边,打开Arduino IDE的串口监视器(端口选择错误将打不开串口监视器),在里面输入各种AT指令,观察串口监视器以及ASR Board。(板子上电后,会自动播报其波特率以及工作模式)【注意选择换行加回车模式】

比如:在串口监视器中输入AT+PLAY=001,点击回车,此时主控板会播放SD卡中编号为0001的音频文件,同时在串口监视器中输出“Now Playing ...1”“OK”。

lzyasr6.png

注意:板子启动初始化需要一定的时间,请等待大约15秒钟后再进行操作。

再比如:在串口监视器中输入AT+KW=001,chi fan,点击回车,此时监视器上会输出“OK”,同时,关键词“吃饭”已经添加到板卡中去了,我们只要对着MIC说出“吃饭”,主板识别以后就会播放相应的编号为0001的音频文件。

lzyasr7.png

可以直接使用AT指令添加关键词,查询关键词,擦出关键词等等。AT指令列表都可以如此使用。ASR Board的指令集详解见下文相关章节。

C.语音控制开关灯

功能:ASR Board识别到关键词“开灯”或“关灯”后,控制插在主控板数字阵脚四号口上的LED的亮灭。

材料:

  • ASR Board 一个
  • LED模块 一个
  • SD卡 一个
  • 小喇叭 一个

使用过程:
(1)将小喇叭插在ASR Board的spk针脚上,红线接在正极,黑线接在负极
(2)将资料中提供的AD4文件(V3版使用MP3文件)拷贝到SD卡中,将SD卡插在ASR Board的卡槽上(V3版无需取下SD卡)【注意SD卡最好使用1G的】
(3)将LED模块插在数字针脚4号(V3使用5号引脚)上面,注意GND、VCC、信号口的接线次序。(每个板子在出厂前都已经下载好程序了,可以在库文件ASRB_2\example\ASRBled找到,也可以修改该代码或者自行设计代码来控制LED灯的亮灭),同时,拿出一个跳帽,将其插在ASR Board的VCC和5V之间,不然灯是不会亮的

lzyasr8.png

(4)给ASR Board通电,使用外接电源或者连接USB线都行。如果连接USB,可以打开Arduino IDE的串口监视器,查看语音识别时传回来的数据是什么
(5)对着MIC说出开灯或者关灯,观察发现,LED灯有了明灭的变化。不过亮灭情况跟语音提示正好相反,这是因为程序里面,检测到“开灯”关键词时,熄灭LED,检测到“关灯”关键词时,点亮LED。同时,小喇叭也会播放出相应的语音,而串口监视器中会传回252、253的数值,这是因为我们在使用AT指令添加关键词时将这两条指令编号为252和253了

D.ASR Board点歌系统

材料:

  • ASR Board 一个
  • SD卡 一个
  • 小喇叭 一个

使用过程:
(1)将小喇叭插在ASR Board的spk针脚上,红线接在正极,黑线接在负极

(2)将喜欢的歌曲使用AD4格式转换器转成AD4格式(V3版直接使用MP3文件),同时给歌曲以编号的形式命令,比如0006.ad4(SD卡中的语音命名为4位,都是十进制数,取值范围是001-254)

(3)给ASR Board通电,使用外接电源或者连接USB线都行。如果连接USB,可以打开Arduino IDE的串口监视器,查看语音识别时传回来的数据是什么

(4)打开Arduino IDE的串口监视器,在里面输入AT指令,添加关键词,比如输入AT+KW=006,qing hua ci,指令添加成功后,会在串口监视器上返回OK

(5)对着MIC说:“请播放青花瓷”(只要有青花瓷三个关键字,ASR Board就可以检测到),主控板会播放编号为006的AD4文件,串口监视器中会返回数值“6”。我们也可以修改库文件里面的样例程序**example——>ASRBled(这个也是板子出厂时候下载的出厂程序)**让主控板唱歌的同时,LED亮起来,只需要修改下列程序

    /**************************************语音控制LED****************************/
    void ASR_monitor()
    {
    if(res==252) digitalWrite(led,LOW);
    else if(res==253) digitalWrite(led,HIGH);
    }

将其改成如下:

    /**************************************语音控制LED****************************/
    void ASR_monitor()
    {
    if(res==6) digitalWrite(led,HIGH);
    else  digitalWrite(led,LOW);
    }

【友情提醒,该出厂代码使用了ASRB的库,如果下载出现错误,可以检查一下是否把ASRB库放到库文件libraries里面】

E.语音控制小车

功能:ASR Board识别到关键词“前进”或“后退”后通过蓝牙传到 4WD小车的板子上,来控制小车运动。 材料:

使用过程:
(1)配置两个蓝牙,具体教程见两个蓝牙通信
部分或
ble link教程。(ASR Board V1和V2版本支持蓝牙V3和蓝牙bee,ASR Board V3版本只支持蓝牙bee和ble link)

(2)将小喇叭插在ASR Board的spk针脚上,红线接在正极,黑线接在负极,插上蓝牙;(不插也可以,减少语音播报功能)

(3)找到或者制作“前进”、“后退”、“左转”、“右转”等AD4音频文件,将其按照十进制4位的规范编好编号,放入SD卡根目录中;(没有AD4文件也可以,减少语音播报功能)

(4)连接ASR Board与电脑,修改程序:

  • 修改库文件里面的样例程序example——>ASRBled(这个也是板子出厂时候下载的出厂程序),在其中添加一句Serial1.begin(9600),修改后的set up()如下:

    void setup()
    {
      Serial1.begin(9600);     //添加了这条语句
      ASRB.Initialise(SUM,sRecog,fDigit);
      attachInterrupt(0,ExtInt0Handler,LOW);
      //pinMode(button,INPUT);
      pinMode(led,OUTPUT);
      digitalWrite(led,HIGH);
    }
  • 添加串口1打印识别结果,在库文件“ASRB.CPP”中找到int ASRBClass::finally函数,其中:

    if(n>=0){
       Serial.println(dd[n]);
       t=dd[n];
       if(Serial1) Serial1.println(t); //添加了这条语句,把识别结果发送给串口1,即蓝牙模块
       send_SD(t);
       return t;
     }

程序的其他地方不需要作改动。(这是因为ASR Board使用的是leonardo的板卡,该板卡有两个串口,我们使用Serial1来与外部通信)下载程序到板卡。【友情提醒,该出厂代码使用了ASRB的库,如果下载出现错误,可以检查一下是否把ASRB库放到库文件libraries里面】

(5)打开Arduino IDE,在串口监视器中输入添加前进、后退、左转、右转等指令,比如:AT+KW=004,qian jin(AT指令的基本使用方法可以参见前面的示例),点击发送。这个做完以后可以做个测试,对着ASR Board说“前进”,串口监视器会返回数值“4”(与上面输入的指令编号相对应)。

lzyasr111.png

(6)在4WD小车端编写程序。小车的具体使用见
4WD教程。在这里要注意的是,小车前进、后退、左转、右转等动作的发生是因为通过蓝牙接受到了ASR Board传来你的数据,比如按照前面的设置,如果对着ASR Board说出“前进”,ASR Board会通过蓝牙向我们AWD小车上的UNO主板发出数据“4”,正是收到了数据“4”,我们的AWD小车才知道需要“前进”,所以在小车端的编程应该是当串口检测到有数据输入时,对读取到的数据进行判断,如果是“4”,就调用小车前进的函数,如果是其他的,就调用其他的函数,这个可以根据自己的设定作相应的调整。

【注意】:该模块可以使用SD卡,在资料中也给了很多需要拷贝到SD卡中的AD4音频文件,如果我们添加的关键词编号跟已有的冲突,可以自行录制AD4文件以覆盖原有的。(当然,开灯,关灯,准备这三个指令出厂代码中用到了,还是不要动它们三好了)

参考程序如下(该程序是下载在Uno R3板卡上,作为小车端的程序,而不是载在ASR Board上):

    int E1 = 5;     //M1 Speed Control
    int E2 = 6;     //M2 Speed Control
    int M1 = 4;     //M1 Direction Control
    int M2 = 7;     //M1 Direction Control
    char a;
    void stop(void)                    //Stop
    {
      digitalWrite(E1,0);
      digitalWrite(E2,0);
    }
    void advance(char a,char b)          //Move forward
    {
      analogWrite (E1,a);      //PWM Speed Control
      digitalWrite(M1,HIGH);
      analogWrite (E2,b);
      digitalWrite(M2,HIGH);
    }
    void back_off (char a,char b)          //Move backward
    {
      analogWrite (E1,a);
      digitalWrite(M1,LOW);
      analogWrite (E2,b);
      digitalWrite(M2,LOW);
    }
    void turn_L (char a,char b)             //Turn Left
    {
      analogWrite (E1,a);
      digitalWrite(M1,LOW);
      analogWrite (E2,b);
      digitalWrite(M2,HIGH);
    }
    void turn_R (char a,char b)             //Turn Right
    {
      analogWrite (E1,a);
      digitalWrite(M1,HIGH);
      analogWrite (E2,b);
      digitalWrite(M2,LOW);
    }

    void setup(void)
    {

      int i;
      for(i=4;i<=7;i++)
        pinMode(i, OUTPUT);
        Serial.begin(9600);      //Set Baud Rate
    }

    void loop()
    {
       if ( Serial.available())
            {
                a = Serial.read();
                {
                  switch(a)
                   {
                     case '4':            //SD卡中,前进指令的编号是0004 (可自行修改)
                             advance (255,255);
                             break;
                     case '7':             //SD卡中,后退指令的编号是0007 (可自行修改)
                             back_off (255,255);
                             break;
                     case '5':
                             turn_L (100,100);
                             break;
                     case '6':
                             turn_R (100,100); ;
                             break;
                     case '3':
                             stop();
                             break;
                     default:break;
                   }
                }

            }
    }

(7)将配置好的蓝牙插在ASR Board上面。示意图如下:

lzyasr113.png

(8)将另一块配置好的蓝牙插在4WD车XBee插孔处(若ASR Board上面插的是ble link,4wd车上使用的是romeo ble则车上不需要再插蓝牙模块)。示意图如下:

[示意图]

(9)插好蓝牙,等待一段时间,两个蓝牙上的LINK指示灯亮起来了,表示两者正在通信。此时,我们对着ASR Board说出前进、后退、左转、右转等指令,小车就会做相应的动作了。

F.出厂代码范例

ASR Board演示代码(在不同工作模式下语音控制LED):
运行样例程序前,请先安装ASRBArduino ASR Board Library初始化ASR Board或者更新eeprom,先将asr_board_init.pde下载到ASR Board,再下载该演示代码。按键模式下,若使用的是外接按键,需使用到例程中最后面被/**/屏蔽的程序,并在D4口接上按钮模块。

    #include <ASRB.h>
    #include <EEPROM.h>
    #include <SPI.h>
    #include <SoftwareSerial.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};//MP3
    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=4,led=5;//按键数字口4,灯数字口5
    void setup()
    {
    ASRB.Initialise(SUM,sRecog,fDigit);
    attachInterrupt(0,ExtInt0Handler,LOW);
    pinMode(button,INPUT);
    pinMode(led,OUTPUT);
    digitalWrite(led,LOW);
    }
    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);//
      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);//请在D13灯亮起后进入识别
      delay(50);
      ASRB.Busy_SD();
      ASR_while(x,y,p,dd,set);
    }
    /**************************************语音控制LED****************************/
    void ASR_monitor()
    {
    if(res==252) digitalWrite(led,HIGH);//正在开灯
    else if(res==253) digitalWrite(led,LOW);//正在关灯
    }
     /*******************************口令模式*************************************/
    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);//请在D13灯亮起后进入识别
         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)==HIGH)
            {
              delay(100);
             if(digitalRead(button)==HIGH)
               {
                ASR_BT(x,y,p,dd,set);
                break;
                 }
           }*/
      }
    }

ASR Board关键词的识别

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

  • one → wan
  • two → tu
  • three → si rui

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

ASR Board工作模式

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

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

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

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

1.改变使用环境,或许在某些环境中的噪声或者回声会影响到判断说话结束。
2.说话人自己的音量,如果声音很低,也会导致判断人说话是否结束比较困难。
3.改变命令词语内容,比较好念,开口音响亮等,方便使用者连续清晰念出语音命令。
4.当D13灯亮起(ASR Board V1.1为D14)时ASR Board才处于识别中。
5.若D13灯(ASR Board V1.1为D14)一直不亮,建议检查设置的工作模式是否为“按键触发”模式,若灯亮起关键词无法识别,建议检查设置的工作模式是否为口令模式。
6.串口连接成功,发送AT命令出现“error”或者没有任何显示:建议用户重启ASR Board软件,当D14灯亮起后(ASR Board V2.1为D13)或者过几秒再操作。这是因为刚开启软件就发送命令会出现乱码造成的错误这是很多上位机都无法避免的。
7.串口连接成功,D14灯亮起(ASR Board V2.1为D13),无法使用ASR Board软件(在模块未重启的情况下):建议将波特率修改为上次使用过的波特率。
8.在使用过程中接收区出现乱码:建议重新修改波特率。
9.当使用模拟LED和模拟MP3后,无法进行正常语音识别,这是因为程序一直停留在“模拟LED”或者“模拟MP3”功能中,要退出这些功能需要发送其他功能的AT命令。或者用户在正在播放很长的音乐且播放语音过程中设置为不允许检测语音时,用户又想停止播放但无法发送其他功能的AT命令,在此建议用户点击控制板上的“RST”按钮。
10.因波特率的原因当波特率为2400时“模拟MP3”功能可能无法使用,并非控制板的原因。 11.上传程序时一直显示“上传...”改怎么办?可能是bootloader有问题,尝试重新烧录bootloader 12.AT命令无反应?此模块初始化需要一段时间,约10秒左右,若超过1分钟依然无反应可以尝试烧录示例程序中的“ asr_board_init.ino ”对板子进行初始化,烧录完成后打开串口监视器,显示78 3 即为正常。

ASR Board的识别场景分析

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

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

口令触发模式

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

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

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

应用场景

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

小技巧

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

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

  • 打开库文件中“Voice.cpp”,将void VoiceClass::LD_WriteReg和unsigned char VoiceClass::LD_ReadReg函数中的delay(10)屏蔽。
  • 看个人习惯:减少串口打印。比如:使用中串口显示的“MIC”,"ASR_FOUN ONE:.."等。

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

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

  • 特定值的修改,在库文件“ASRB.CPP”中找到int ASRBClass::finally函数,其中:

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

老版本

ASR Board V1

如有更多疑问,可登陆我们的论坛与我们进行交流,您的宝贵意见将我们不断进步的阶梯! 点击进入论坛

相关资料

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