一、首先模块介绍
(1)参数详解
型号:YS-LDV7
名称:一体化语音识别模块
规格:43*29.7MM
供电电压:5V (内部工作电压 3.3V)
待机电流:30MA
识别时电流:45MA
IO 口输出:高电平为 3.3V
通信方式:串口通信(5V TTL 电平,不可直接接 RS232、RS485)
单片机参数:型号–>STC11L08XE 、flash–>8k、SRAM–>1280、eeprom–>32k
识别词条个数:50 句
工作温度:-20 至 60℃

(2)与USB转串口模块的接线
本模块的串口如下图所示,从下至上的 5 根针分别为 GND、RXD、TXD、
5V、3.3V,其中 RXD 和 TXD 为实际内部单片机的串口接收和发射端口,故与
外部串口设备连接时要注意 RXD 接 TXD 的交叉接法。3.3V 的口为输出口,
可用于外部设备的供电利用,一般未用上直接忽略不用即可。
下图为本店提供的 USB 转 TTL 与语音模块的连接方法,如与其他单片机
或者其他设备的连接时注意串口电平需要为 5V,与语音模块电平一致,如电
平不一致可加入串口电平转换模块否则将导致通信异常甚至损坏设备端口。

(3)语音模块的代码的烧写与及代码的阅读
a.模块下载程序需要用到STC-ISP这个软件,本模块的程序下载实际为 STC 单片机的程序下载方法,首先我们需要安装 USB 转 TTL 驱动(如已安装无需再安装),然后接好 USB 转 TTL。按照下图进行选择各个选项。

b.
标题这里使用一个代码阅读器——sourceInsight(百度可下,最好破解一下)
首先在源代码(是为了让这些代码产生关联)那里新建一个文件夹,然后进入新建的文件夹然后,复制路径。

打开sourceInsight新建一个工程,工程存放的路径就是我们刚才复制的路径(放在这个路径下方便添加和查找代码,注意路径不要有中文)

点击ok再点击ok,然后出现下图,这时我们需要将源代码添加到我们新建的工程中,点击源代码所在文件夹(code),然后再点击Add all,点击ok,确定,然后关闭即可。

如果右侧已经出现代码结构,则不需要下面的操作,如果没有出现则按下图操作。

接下来如果乱码则继续往下走,点击file然后选择Reload Encoding然后选择编码格式为Chinese Simplified(GB2312),然后点击Load即可。

还有一种在方法可以永久解决乱码问题,点击Options,然后点击preference,然后点击file,将Default encoding改成SystemDefault(Windows ANSI)或者Chinese Simplified(GB2312)936

然后如果想修改代码大小和格式,点击Options下面的File Type Options,选择自己喜欢的字体。

那么如何让代码关联起来呢?点击Project选择同步文件Synchrogaze File,同步文件后想要查找某个函数的函数体就很方便了只需要按住Ctrl此时鼠标变为小手,点击即可跳转,现在基本所有的代码编辑软件都带有这个功能。还可以选中你想要查找的目标,然后按住ctrl加斜杠(/)再点击sercher即可在整个工程中查找你选中的目标。

二、基于语音识别模块源码的二次开发
前言:本次二次开发是在语音识别模块源码的基础上进行的二次开发,程序员只需要将源码理清楚,懂得在哪里进行代码的修改即可,其他的代码可以不用理会,如果是去读其他代码的话,那么方向就跑偏了
主要代码流程

void ExtInt0Handler(void) interrupt 0 中断处理函数当LD3320识别成功后,会引发IO口中断nAsrRes = LD_GetResult();/*获取结果*/User_handle(nAsrRes);//用户执行函数 mainLed_test(); 开机闪灯3MCU_init(); 单片机本身初始化,开启中断LD_Reset(); ld3320初始化UartIni(); /*串口初始化*/while(1){RunASR(); 启动识别LD_AsrStart();LD_Init_ASR();厂家提供的启动时序代码LD_AsrAddFixed(); 向LD模块添加关键词LD_AsrRun();运行ASR 启动ASR运算(“开始识别”)ProcessInt0()判断识别是否有结果}
  1. LD_AsrAddFixed(); 向LD模块添加关键词 在LDchip.c
  2. 识别出结果后,把数据从语音模块发出来void User_handle(uint8 dat) main

3.语音识别模块重要的代码的修改
在大概理清所有代码基本流程后,接下来就是对代码进行修改了
3.1语音识别的默认口令(即词条的修改)

上面拼音部分就是词条的内容的意思,下面就是词条对应的宏,无论是词条的增加还是词条的改变,宏都是需要跟着变的

3.2 语音识别的默认的识别码

这里的识别码对应着上面的词条的宏,无论是新增词条还是词条的改变,都要在这个词条这里进行改变,如果是改变词条的话,那么就在相应的宏处进行修改即可,如果是增加词条的话,对应的宏也要被增加进来

3.3 默认的识别结果串口输出

3.4 词条的修改或增加自己的词条

—-根据关键词的数量和长度修改宏定义 DATE_A 和 DATE_B ,例如您要添加
10 个关键词,在这些关键词中最长的一句长度为 30,那么定义如下:
#define DATE_A 10
#define DATE_B 30
—sRecog[ ][ ] 数组为关键词数组,添加内容为拼音输入方式,例如想添加
“开灯”命令,则写入“kai deng”,每个汉字间的拼音用空格隔开。
—pCode[ ] 数组为识别码数组,所添加的识别码为预先定义好的宏定义常
量值,同时必须和关键词一一对应,如上图所示,“dai ma ce shi”命令对应的识
别码为 CODE_DMCS

3.5 识别码的修改此处即为识别码的添加和修改,用户可以根据自己的需要和喜好任意定义识别码和宏名,但必须和前面所使用的识别码配对,否则会提示未定义错误。识别码的参数范围为 01-FF 随意选择,没有具体意义,只要不存在重复的即可。

3.6 修改语音识别串口输出的结果

用户可以根据自己的使用情况在相对应的识别码后添加识别成功后的
操作。那么在设备到某句话后就会执行相应的动作,实际上此段程序是判断
识别到那个识别码然后执行相应的动作,属单片机的程序应用处理部分

三、直接上代码

#include #include #include #include #include int main(){int fd;int n_read;char cmdBuf[128] = {'\0'};if(wiringPiSetup() == -1){printf("fail to set up the wiringPi\n");return -1;}fd = serialOpen("/dev/ttyAMA0",9600); //一样先打开树莓派的串口if(fd == -1){printf("fail to open the serial\n");return -1;}while(1){n_read = read(fd,cmdBuf,sizeof(cmdBuf)); //从串口出读取语音模块输出在串口上的指令,并执行对应的操作if(strlen(cmdBuf) == 0) //如果过了一定的时间串口上还是没有信息的话就会打印下面的超时{printf("time out\n");}if(strstr(cmdBuf,"open") != NULL){printf("the light is open\n");}else if(strstr(cmdBuf,"close") != NULL){printf("the light is close\n");}else if(strstr(cmdBuf,"hello") != NULL){printf("你好\n");}memset(cmdBuf,'\0',sizeof(cmdBuf)/sizeof(char)); //每次读取完指令并执行对应得操作后,把字符串清空一下}serialClose(fd);return 0;}


由于我的语音识别的代码里就是输出开灯,关灯,你好三个内容,所以可以看出代码里就是简单的输出一下三个指令对应的内容,强调一点就是,树莓派电脑串口通信代码(树莓派串口一次只能接受8个字节,如果超出8个字节就分多次接收):,所以为了避免一句话多次输出,所以就用到了strstr函数,还有一点要补充一下,read在linux系统中应该是阻塞的,但是在这里没有阻塞,可能是因为串口底层驱动的设置问题,如果长时间没有数据读取到,那么会每隔10s返回一个-1。

以上就是语音识别的二次开发,并实现语音识别模块与树莓派之间进行串口通信

学习笔记,仅供参考