语音识别模块功能详细讲解
此模块使用方法简单,用户无需深入了解语音识别原理,通过l2C通信,即可识别语音,输出结果,可直接应用于多种人机交互领域的开发实验中语音识别模块仅支持汉字识别,模块最多可添加50个词条,每个词条最多10个文字。
一、 产品参数
1.供电电压:DC 5V
2.通信方式:I2C通信,用4PIN线连接主控器
3.产品尺寸:48mm×24mm
4.三种识别模式:循环识别模式、口令模式、按键模式
5.识别范围:安静环境下,语音接收最大距离为1米;嘈杂环境下语音接收最大距离为30cm。
6.板载芯片状态指示灯:循环识别模式下,状态灯常亮。口令模式下,以第一个词条为口令,当识别到口令词时常亮,等待识别到新的语音,并且读取识别结果后灭掉。按键模式下,按下按键开始识别且状态灯亮起,不按时不识别且状态灯不亮,支持掉电保存。
7.识别要求:每次识别最多可以设置50项候选识别句,识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字节的拼音串。
二、 性能描述
1.集成LD3320芯片实现汉语语音识别,不需要用户事先训练和录音,识别准确率95%。
2.每次识别最多可以设置50项候选识别句,识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字节的拼音串。
3.三种识别模式:循环识别模式:口令模式:按键模式
4.板载单片机型号为STC8F1K08S2。
5.板载单通道麦克风。
6.板载芯片状态指示灯,可直观看到芯片工作状态,支持掉电保存。
7.板载按键key,用于语言识别模式中的按键模式。
8.模块化安装,兼容乐高系列。
9.通信方式:IC通信,可使用4PIN连接线连接主控器。
10.I2C地址(7位):0x79
三、示例代码:
#include <Wire.h>
#include <string.h>
#define I2C_ADDR 0x79
#define ASR_RESULT_ADDR 100
// 识别结果存放处,通过不断读取此地址的值判断是否识别到语音,不同的值对应不同的语音
#define ASR_WORDS_ERASE_ADDR 101 // 擦除所有的词条
#define ASR_MODE_ADDR 102
//识别模式设置,范围1~3
//1,循环识别模式
//2,口令模式
//3,按键模式
#define ASR_ADD_WORDS_ADDR 160 // 词条添加的地址,支持掉电保存
bool WireWriteByte(uint8_t val) // 字节
{
Wire.beginTransmission(I2C_ADDR); //
Wire.write(val);
if( Wire.endTransmission() != 0 ) {
return false;
}
return true;
}
bool WireWriteDataArray( uint8_t reg,uint8_t *val,unsigned int len) // 数据组
{
unsigned int i;
Wire.beginTransmission(I2C_ADDR);
Wire.write(reg);
for(i = 0; i < len; i++) {
Wire.write(val[i]);
}
if( Wire.endTransmission() != 0 ) {
return false;
}
return true;
}
bool WireReadDataByte(uint8_t reg, uint8_t &val) //读取数据字节
{
if (!WireWriteByte(reg)) {
return false;
}
Wire.requestFrom(I2C_ADDR, 1);
while (Wire.available()) {
val = Wire.read();
}
return true;
}
int WireReadDataArray( uint8_t reg, uint8_t *val, unsigned int len) // 读取数据组
{
unsigned char i = 0;
/* Indicate which register we want to read from */
if (!WireWriteByte(reg)) {
return -1;
}
/* Read block data */
Wire.requestFrom(I2C_ADDR, len);
while (Wire.available()) {
if (i >= len) {
return -1;
}
val[i] = Wire.read();
i++;
}
return i;
}
bool ASRAddWords(unsigned char idNum, unsigned char *words)
{
Wire.beginTransmission(I2C_ADDR);
Wire.write(ASR_ADD_WORDS_ADDR);
Wire.write(idNum);
Wire.write(words, strlen(words));
if(Wire.endTransmission() != 0)
{
delay(10);
return false;
}
delay(10);
return true;
}
void setup()
{
uint8_t ASRMode = 1;
Wire.begin();
Serial.begin(9600);
// PinMode(SOUND,INPUT);
#if 1 //添加的词条和识别模式是可以掉电保存的
//第一次设置完成之后,可以将此段注释掉,即将1改为0,然后重新下载一次程序
WireWriteDataArray(ASR_WORDS_ERASE_ADDR, NULL, 0);
delay(60);
ASRAddWords(1,"kai shi"); // 开始
ASRAddWords(2,"ni hao"); // 你好
ASRAddWords(3,"xue dao"); // 学到
ASRAddWords(4,"niu niu"); // 牛牛
ASRAddWords(5,"huan er"); // 幻尔
if(WireWriteDataArray(ASR_MODE_ADDR, &ASRMode, 1))
{
Serial.println("ASR Module Initialization complete");
}
else
{
Serial.println("ASR Module Initialization file");
}
#endif
Serial.println("Start");
}
void loop()
{
unsigned char result;
delay(1);
wireReadDataArray(ASR_RESULT_ADDR, &result, 1);
if(result)
{
Serial.print("ASR result is:");
Serial.println(result); // 返回识别结果,即识别到的词条编号
}
}
串口打印: