语音模块LD3320模块的二次开发,并与树莓派进行串口通信

一、首先模块介绍
(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);//用户执行函数 
		

main
	Led_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 <wiringPi.h>
#include <stdio.h>
#include <wiringSerial.h>
#include <unistd.h>
#include <string.h>

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。

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

学习笔记,仅供参考

评论 2 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:岁月 设计师:pinMode 返回首页

打赏作者

嵌入式软件工程师

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值