锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-08-25 02:30:00 至上连接器

首先,模块介绍
(1)参数详解
型号:YS-LDV7
名称:集成语音识别模块
规格:43*29.7MM
供电电压:5V (内部工作电压 3.3V)
待机电流:30MA
电流:45MA
IO 口输出:高电平为 3.3V
通信方式:串口通信(5)V 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(GB点击2312)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运算(开始识别)    ProcessInt判断识别是0()有结果
	}
  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。

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

学习笔记,仅供参考

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章