Gravity:I2C 语音识别模块

1 简介

Gravity:I2C 离线语音识别模块,是一款以Gravity I2C作为连接接口的、针对中文进行识别的模块。该模块采用由 ICRoute 公司设计的 LD3320 “语音识别”专用芯片,只需要在程序中设定好要识别的关键词语列表并下载进主控的MCU中,语音识别模块就可以对用户说出的关键词语进行识别,并根据程序进行相应的处理。本品不需要用户事先训练和录音就可以完成非特定人语音识别,识别准确率高达95%。

  1. 针对误识别问题:建议将关键词设置为4-6个词左右,如将“kai deng”设置为“da kai deng guang”或“da kai ke ting deng”
  2. 针对识别率问题:一些前后鼻音模糊的词,可以将前后鼻音都添加到一个关键词,如设置“打开灯光”这个关键词
    asr.addCommand("da kai deng guang",2);
    asr.addCommand("da kai den guang",2);
  3. 太靠近麦克风识别效果会非常差,请离麦克风10cm以上

2 产品描述


3 产品参数

产品尺寸


4 引脚图

语音识别模块引脚图

特此说明:外接音频输入接口不是外置MIC,是线路输入口。
如果将外接音频音源接入MIC口,声音将出现失真。如果将MIC音源接入外接音频音源口,几乎没有声音。
麦克风输入信号是没有经过处理过的信号,电压一般在几毫伏到几百毫伏,而外接音频得电压通常是MIC信号电压的1000倍。
PS:如果外接MIC不能正常使用,可以尝试将3.5mm接头拔出一节


5 使用说明

5.1 语音控制LED灯实验

打开串口监控,设置好波特率,对着麦克风用标准的普通话说“打开灯光”,LED灯就会点亮,同时会通过串口推送指令标签“0”, 之后说“关闭灯光”,LED就会熄灭,同时会通过串口推送指令标签“1”。 PS:不要把嘴巴凑在话筒上..

硬件清单:

工具软件清单:

连线图:

语音识别模块连接图

演示代码:

代码所需库文件 DFRobot_ASR

#include "DFRobot_ASR.h"
#define Led 8                    //定义Led引脚为8

DFRobot_ASR  asr;

void setup()
{
  Serial.begin(9600);
  pinMode(Led,OUTPUT);           //初始化LED引脚为输出模式
  digitalWrite(Led,LOW);         //LED引脚低电平
  /*
    begin函数有两个参数:
    1)设置语音识别模式:1.LOOP(默认,循环模式) 2.PASSWORD(指令模式) 3.BUTTON(按钮模式)
    2)选择模块的录音输入方式:1.MIC(默认,此时板载咪头和3.5mm输入接口工作)2.MONO(3.5mm外接音频输入接口工作)
  */
  asr.begin(asr.LOOP);

  asr.addCommand("da kai deng guang",0);
  asr.addCommand("guan bi deng guang",1);

  //开始识别
  asr.start();
  Serial.println("Start");
}

void loop()
{
  switch(asr.read())            //判断识别内容,在有识别结果的情况下asr.read()会返回识别到的词条编号,否则返回-1
  {
    case 0:                     //若是指令“da kai deng guang”
      digitalWrite(Led,HIGH);   //点亮LED
      Serial.println("received'da kai deng guang',command flag'0'");//串口发送received"kai deng",command flag"0"
      break;
    case 1:                     //若是指令“guan bi deng guang”
      digitalWrite(Led,LOW);    //熄灭LED
      Serial.println("received'guan bi deng guang',command flag'1'");//串口发送received"guan deng",command flag"1"
      break;
  }
}

串口信息


5.2 Mind+ 上传模式编程

1、下载及安装软件。下载地址:https://mindplus.cc 详细教程:安装教程

2、切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程

3、点击左下角 扩展 按钮,进入扩展库界面

4、选择 主控板 选项卡下的你正在使用的主控板,arduino、micro:bit、掌控板均支持,这里以uno为例 所以选择 Arduino Uno。在 传感器 选项卡下搜索 I2C语音识别模块,点击加载扩展库。 详细教程:Mind+基础wiki教程-加载扩展库流程

5、进行编程,程序如下图:

6、菜单“连接设备”,“上传到设备”

7、程序上传完毕后,对语音识别模块说出“开灯”、“关灯”即可控制LED模块。详细教程:Mind+基础wiki教程-串口打印

注意:关键词添加完成后,一定要使用"设置完成 开始识别"积木结尾才可以正常识别

mind+编程


5.3 Mind+ Python模式编程(行空板)

Mind+Python模式为完整Python编程,因此需要能运行完整Python的主控板,此处以行空板为例说明

连接图

操作步骤

1、下载及安装官网最新软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装

2、切换到“Python模式”。“扩展”中选择“官方库”中的“行空板”和“pinpong库”中的”pinpong初始化“和“语音识别模块”。切换模式和加载库的详细操作链接

3、进行编程

4、连接行空板,程序点击运行后,可在终端查看数据。行空板官方文档-行空板快速上手教程 (unihiker.com)

代码编程

以pinpong库为例,行空板官方文档-行空板快速上手教程 (unihiker.com)

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_asr import DFRobot_ASR
from pinpong.board import Board
import time


Board().begin()
p_gravityasr = DFRobot_ASR()
p_gravityasr.begin(p_gravityasr.LOOP, p_gravityasr.MIC)
p_gravityasr.add_command("da kai deng guang", 1)
p_gravityasr.add_command("guan bi deng guang", 2)
p_gravityasr.start()

while True:
    my_variable = p_gravityasr.read()
    if (my_variable == 1):
        print("打开灯光")
    if (my_variable == 2):
        print("关闭灯光")
    time.sleep(0.2)

5.4 语音识别模式介绍及使用

本品目前有三种语音识别模式:循环模式按钮模式指令模式。(通过 begin() 函数的参数进行设置)

循环模式

将本品的识别模式设置为循环模式后,识别模式指示灯为常亮蓝色,此时模块一直处于拾音状态,不停的拾取环境中的声音进行分析识别。当识别到录入的关键词后,指示灯会闪烁一次,提示使用者已准确识别。同一时间只能识别一条关键词,待指示灯闪烁后方可进行下次识别。

循环模式

烧录下列代码:

#include "DFRobot_ASR.h"
DFRobot_ASR  asr;

void setup()
{
  Serial.begin(9600);
  digitalWrite(LED_BUILTIN,LOW);  //对 UNO 主控板的板载 LED 初始状态设置为熄灭
  asr.begin(asr.LOOP);  //1.LOOP 2.BUTTON 3.PASSWORD
  asr.addCommand("da kai deng guang",0);
  asr.addCommand("guan bi deng guang",1);
  asr.start();
  Serial.println("Start");
}

void loop()
{
  switch(asr.read()) //判断识别内容,在有识别结果的情况下asr.read()会返回识别到的词条编号,否则返回-1
  {
    case 0:          //若是指令“da kai deng guang”
      digitalWrite(LED_BUILTIN,HIGH);   //点亮板载 LED
      Serial.println("received'da kai deng guang',command flag'0'");
      break;
    case 1:          //若是指令“guan bi deng guang”
      digitalWrite(LED_BUILTIN,LOW);    //熄灭板载 LED
      Serial.println("received'guan bi deng guang',command flag'1'");
      break;
  }
}

mind+ 上传模式:

注意关键词添加完成后,一定要使用设置完成 开始识别积木结尾才可以正常识别

mind+编程

效果如下: 请使用打开灯光、关闭灯光来替代开灯、关灯命令

Mind+ python积木块模式:

Mind+ python代码模式:

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_asr import DFRobot_ASR
from pinpong.board import Board
import time


Board().begin()
p_gravityasr = DFRobot_ASR()
p_gravityasr.begin(p_gravityasr.LOOP, p_gravityasr.MIC)
p_gravityasr.add_command("da kai deng guang", 1)
p_gravityasr.add_command("guan bi deng guang", 2)
p_gravityasr.start()

while True:
    my_variable = p_gravityasr.read()
    if (my_variable == 1):
        print("打开灯光")
    if (my_variable == 2):
        print("关闭灯光")
    time.sleep(0.2)

按钮模式

将本品的识别模式设置为按钮模式后,识别模式指示灯为常灭,此时模块处于休眠状态,对环境中的声音完全忽略,在按钮被按下时会激活模块。模块被激活后,指示灯常亮绿色,识别到录入的关键词后,指示灯会闪烁一次,提示使用者已准确识别。同一时间只能识别一条关键词,待指示灯闪烁后方可进行下次识别。

注意:必须按住按钮说话并等待模块识别成功后再松开按钮。当按钮松开后,模块会立即进入休眠,如果在识别过程中松开按钮会导致识别失败。

按钮模式

烧录下列代码:

#include "DFRobot_ASR.h"
DFRobot_ASR  asr;

void setup()
{
  Serial.begin(9600);
  digitalWrite(LED_BUILTIN,LOW);  //对 UNO 主控板的板载 LED 初始状态设置为熄灭
  asr.begin(asr.BUTTON);  //1.LOOP 2.BUTTON 3.PASSWORD
  asr.addCommand("da kai deng guang",0);
  asr.addCommand("guan bi deng guang",1);
  asr.start();
  Serial.println("Start");
}

void loop()
{
  switch(asr.read()) //判断识别内容,在有识别结果的情况下asr.read()会返回识别到的词条编号,否则返回-1
  {
    case 0:          //若是指令“kai deng”
      digitalWrite(LED_BUILTIN,HIGH);   //点亮板载 LED
      Serial.println("received'da kai deng guang',command flag'0'");
      break;
    case 1:          //若是指令“guan deng”
      digitalWrite(LED_BUILTIN,LOW);    //熄灭板载 LED
      Serial.println("received'guan bi deng guang',command flag'1'");
      break;
  }
}

mind+ 上传模式:

注意关键词添加完成后,一定要使用设置完成 开始识别积木结尾才可以正常识别

效果如下: 请使用打开灯光、关闭灯光来替代开灯、关灯命令

Mind+ python积木块模式:

Mind+ python代码模式:

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_asr import DFRobot_ASR
from pinpong.board import Board
import time


Board().begin()
p_gravityasr = DFRobot_ASR()
p_gravityasr.begin(p_gravityasr.BUTTON, p_gravityasr.MIC)
p_gravityasr.add_command("da kai deng guang", 1)
p_gravityasr.add_command("guan bi deng guang", 2)
p_gravityasr.start()

while True:
    my_variable = p_gravityasr.read()
    if (my_variable == 1):
        print("打开灯光")
    if (my_variable == 2):
        print("关闭灯光")
    time.sleep(0.2)

指令模式

将本品的识别模式设置为指令模式后,识别模式指示灯为常灭,此时模块处于休眠状态,对环境中的声音完全忽略,在说出唤醒关键词后激活模块。模块被激活后,指示灯常亮白色,识别到录入的关键词后,指示灯会闪烁一次,提示使用者已准确识别。同一时间只能识别一条关键词,待指示灯闪烁后方可进行下次识别。唤醒时长为10s。在这10s内,每当识别到添加的关键词后,唤醒时间会刷新。如果10s内没有识别成功。则模块会再次进入休眠状态。

注:指令模式下,默认录入的第一个关键词作为唤醒指令,与指令识别 ID 号顺序无关。

指令模式

烧录下列代码:

#include "DFRobot_ASR.h"
DFRobot_ASR  asr;

void setup()
{
  Serial.begin(9600);
  digitalWrite(LED_BUILTIN,LOW);  //对 UNO 主控板的板载 LED 初始状态设置为熄灭
  asr.begin(asr.PASSWORD);  //1.LOOP 2.BUTTON 3.PASSWORD
  asr.addCommand("xiao zhi",2);
  asr.addCommand("da kai deng guang",0);
  asr.addCommand("guan bi deng guang",1);
  asr.start();
  Serial.println("Start");
}

void loop()
{
  switch(asr.read()) //判断识别内容,在有识别结果的情况下asr.read()会返回识别到的词条编号,否则返回-1
  {
    case 0:          //若是指令“da kai deng guang”
      digitalWrite(LED_BUILTIN,HIGH);   //点亮板载 LED
      Serial.println("received'da kai deng guang',command flag'0'");
      break;
    case 1:          //若是指令“guan bi deng guang”
      digitalWrite(LED_BUILTIN,LOW);    //熄灭板载 LED
      Serial.println("received'guan bi deng guang',command flag'1'");
      break;
  }
}

mind+ 上传模式:

注意关键词添加完成后,一定要使用设置完成 开始识别积木结尾才可以正常识别

效果如下: 请使用打开灯光、关闭灯光来替代开灯、关灯命令

Mind+ python积木块模式:

Mind+ python代码模式:

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_asr import DFRobot_ASR
from pinpong.board import Board
import time


Board().begin()
p_gravityasr = DFRobot_ASR()
p_gravityasr.begin(p_gravityasr.PASSWORD, p_gravityasr.MIC)
p_gravityasr.add_command("xiao zhi", 0)
p_gravityasr.add_command("da kai deng guang", 1)
p_gravityasr.add_command("guan bi deng guang", 2)
p_gravityasr.start()

while True:
    my_variable = p_gravityasr.read()
    if (my_variable == 1):
        print("打开灯光")
    if (my_variable == 2):
        print("关闭灯光")
    time.sleep(0.2)

5.4 LineIn 接口的使用方法

LineIn接口:LineIn 为外界音频输入接口。比如电脑的音频输出接口或手机的耳机接口都可以作为音频输出接口,通过两端 3.5mm 接口线与语音识别模块连接。LineIn 接口只在 MONO 模式下使用。(如下图)

电脑音频接口手机耳机接口AUX音频线


  1. 连接方法如图:

连接图示

  1. 烧录代码:
#include "DFRobot_ASR.h"
DFRobot_ASR  asr;

void setup()
{
  Serial.begin(9600);
  asr.begin(asr.LOOP,asr.MONO); // LineIn接口只在MONO模式下使用
  asr.addCommand("bei jing",0);       //添加词条"北京",识别号为 0
  asr.addCommand("shang hai",1);      //添加词条"上海",识别号为 1

  asr.start();
  Serial.println("Start");
}

void loop()
{
  int result = 0;
  result = asr.read();

  if(result != -1)
  {
    Serial.print("ASR result is:");
    Serial.println(result);//返回识别结果,即识别到的词条编号
  }
}

使用 Mind+ 图形化编程时,可通过下面的积木进行模式设置

mind+音频模式

  1. 在电脑端录制两段音频,内容为“北京”、“上海”(以下展示是在Windows10操作系统下完成)

打开电脑自带的录音软件,录制两段音频,如下图:

录音界面

  1. 点击播放录制的音频

播放录制的音频,音频通过 LineIn 接口输入语音识别模块内,可以在串口监视器中看到音频已经被正确识别并且打印出对应识别号。

串口信息


6 库函数说明

语音识别模块接口介绍


7 更多应用技巧

在某些场合需要识别一些简单的外文或者纯方言发音的时候,可以用拼音标注的方法来实现。

例如,有些场合需要识别一些简单的英文单词,可以用拼音标注:

one → wan

two → tu

three → si rui

例如,有些场合需要识别一些纯方言发音的词汇,也可以用拼音标注:

在识别精度要求高的场景中,可以增添 “垃圾关键词语”——吸收错误识别

LD3320 采用的识别方式是近似识别,麦克风采集到的声音与录入的词条做对比,相似度高就认为是相同。所以,在使用中可能会出现误识别的现象。这时我们可以在程序中多添加些 “垃圾关键词语”,就可以最大程度避免误识别。

例如,某个应用场景中,需要识别的关键词语是 4 条,“前进”,“后退”,“开门”,“关门”。在把这 4 个关键词语设置进芯片后,可以再另外设置 10~30 个词语进模块芯片,比如“前门”,“后门”,“阿阿阿”,“呜呜”等等。

只有识别结果是 4 个关键词语之内的,才认为识别有效。如果识别结果是“垃圾关键词语”,则说明是其他的声音导致的误识别,程序会重新开始一次识别过程。

更多技巧请戳这里 LD3320_advanced.pdf


8 常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。


9 文档

<File:nextredirectltr.png>库文件v1.0

<File:nextredirectltr.png>中文语音识别模块_Gravity_I2C 原理图

<File:nextredirectltr.png>LD3320_芯片手册.pdf

<File:nextredirectltr.png>LD3320_开发手册.pdf

<File:nextredirectltr.png>LD3320_进阶手册.pdf