Arduino制作天猫精灵好朋友“天狗精灵”语音识别和语音控制外接设备 LD3320语音识别模块使用
这个设计应用LD3320语音识别模块,配合XY5300 MP3音乐模块和扬声器等,实现类似控制天猫精灵放歌等效果,并结合LED灯,实现语音控制外接设备。
1、Arduino Uno控制板
2、YX5300 MP3音乐模块
3、LD3320语音识别模块
4、读卡器
5、SD卡
6、面包板
7、导线
8、扬声器
1、YX5300 MP3音乐模块
该模块是一个基于高音质MP3音乐芯片的MP3音乐播放器模块。支持采样率是8KHz ~ 48KHz的MP3、WAV格式文件。
板载Micro SD卡座,可插上存了音乐文件的micro SD卡。单片机可以通过串口发送命令进行切换音乐、调节音量、播放模式等操作。用户也可以通过USB转串口模块对该模块进行调试。模块与UNO/AVR/ARM/PIC等单片机系统兼容。UART TTL串口控制播放模式,串口波特率为9600bps, 供电电源可为3.2 ~ 5.2V DC.
2、LD3320语音识别模块
LD3320语音识别模块使用一颗基于非特定人语音识别(SI-ASR:Speaker-Independent Automatic Speech Recognition)技术的语音识别/声控芯片,提供了真正的单芯片语音识别解决方案。
LD3320芯片上集成了高精度的A/D和D/A接口,不再需要外接辅助的Flash和RAM,即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以动态编辑的。
YX5300 MP3--------------------Arduino
TX--------------------------------D10
RX--------------------------------D11
LD3320A--------------------------Arduino
CLK-------------------------------A5
DO---------------------------------A4
DI----------------------------------A3
CS---------------------------------A2
RST--------------------------------5
IRQ--------------------------------3
LED1-----------------------------------Arduino
VCC-----------------------------------6
LED2
VCC--------------------------------------7
#include "LD3320.h"
#include //添加软串口头文件
SoftwareSerial mySerial(10,11); // 音乐模块TX接4,音乐模块RX接5
首先引入LD3320和软串口头文件,定义音乐模块TX\RX端口的接线
unsigned char ganmane[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x01,0xEF}; //1
unsigned char haodezhuren[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x02,0xEF}; //2
unsigned char mingbai[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x03,0xEF}; //3
unsigned char shoudaozhuren[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x04,0xEF}; //4
unsigned char haodeba[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x05,0xEF}; //5
unsigned char bubola[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x06,0xEF}; //6
unsigned char song1[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x07,0xEF}; //7
unsigned char song2[8] = {0x7E,0xFF,0x06,0x03,0x00,0x00,0x08,0xEF}; //8
上面定义了一些字符变量,用于存储指令,其中song1[8]指令为播放歌曲1, song2[8]指令播放歌曲2,并且定义了一些语音交互的指令,配合LD3320达到一定的人机交互效果。相关指令可以参考下图:
unsigned char pause[8]={0x7E,0xFF,0x06,0x0E,0x00,0x00,0x00,0xEF}; //暂停播放
unsigned char play[8]={0x7E,0xFF,0x06,0x0D,0x00,0x00,0x00,0xEF}; //恢复播放
unsigned char stop_play[8] = {0x7E,0xFF,0x06,0x16,0x00,0x00,0x00,0xEF}; //停止播放指令
unsigned char top_volume[8]={0x7E,0xFF,0x06,0x06,0x00,0x00,0x1E,0xEF}; //设置最大音量
此代码同时用到了上述指令
mySerial.write(top_volume, 8); //设置音量为最大
mySerial.write(stop_play, 8); //开机静音
上述指令设置了播放的音量以及开机默认静音,本实验只设置了两首歌,创客们如果想随机播放歌曲的话可以设置随机数种子,通过random()函数获取随机数并播放随机数对应的歌曲。
//识别码客户修改处
#define CODE_CMD 0x00 //该命令码0x00用户不可进行修改。
#define CODE_DMCS 0x01 //代码测试
#define CODE_CSWB 0x02 //测试完毕
#define CODE_1KL1 0x04
#define CODE_1KL2 0x05
#define CODE_1KL3 0x16
#define CODE_1KL4 0x17
#define CODE_2KL1 0x18
#define CODE_2KL2 0x19
#define CODE_2KL3 0x1A
#define CODE_2KL4 0x1B
#define CODE_3KL1 0x1C
#define CODE_3KL2 0x1D
#define CODE_3KL3 0x1E
#define CODE_3KL4 0x1F
#define CODE_4KL1 0x20
#define CODE_4KL2 0x21
#define CODE_4KL3 0x22
#define CODE_4KL4 0x23
#define CODE_5KL1 0x24
从LD3320.h文件中可以看到,不同的识别码分别对应不同的16进制数据,需要识别的关键词语和识别码的关联如下程序所示,该程序存在于库函数.c文件中。
u8 sRecog[DATE_A][DATE_B] = {
"tian gou jing ling",\
"da kai feng shan",\
"guan bi feng shan",\
"da kai deng yi",\
"guan bi deng yi",\
"da kai deng er",\
"guan bi deng er",\
"fang shou ge",\
"huan yi shou",\
"ting zhi bo fang",\
"ha ha ha",\
"ha ha ha",\
"ha ha ha",\
"ha ha ha",\
}; /*添加关键词,用户修改*/
u8 pCode[DATE_A] = {
CODE_CMD,\
CODE_DMCS,\
CODE_CSWB,\
CODE_1KL1,\
CODE_1KL2,\
CODE_1KL3,\
CODE_1KL4,\
CODE_2KL1,\
CODE_2KL2,\
CODE_2KL3,\
CODE_2KL4,\
CODE_3KL1,\
CODE_3KL2,\
CODE_5KL1,
}; /*添加识别码,用户修改*/
在ino文件中需要操作的是如下代码
case CODE_1KL1: /*命令“打开灯1”*/
Serial.println("打开灯1"); /*text.....*/
mySerial.write(haodezhuren,8);
digitalWrite(led1,HIGH);
Serial.println(digitalRead(led1));
break;
case CODE_1KL2: /*命令“关闭灯1”*/
Serial.println("关闭灯1"); /*text.....*/
mySerial.write(mingbai,8);
digitalWrite(led1,LOW);
Serial.println(digitalRead(led1));
break;
case CODE_1KL3: /*命令“打开灯2”*/
Serial.println("打开灯2"); /*text.....*/
mySerial.write(shoudaozhuren,8);
digitalWrite(led2,HIGH);
Serial.println(digitalRead(led2));
break;
case CODE_1KL4: /*命令“关闭灯2”*/
Serial.println("关闭灯2"); /*text.....*/
mySerial.write(mingbai,8);
digitalWrite(led2,LOW);
Serial.println(digitalRead(led2));
break;
这里还设置了串口输出,将识别正确后的关键词语串口打印出来,更多关键词语的识别需要创客们自行添加。