按关键词阅读:
大家好 , 我是阿乐 。
今天教大家给LD3320语音识别模块加上语音交互的功能 。
本文插图
上节课已经教大家将模块使用起来了 , 但是使用的时候是我们单方面说出命令 , 机器识别后并没有给我们一些视觉上或者听觉上的应答反馈 , 总觉得缺少点什么 , 所以今天我就教大家给语音识别模块加上语音交互的功能 , 我们问一句 , 模块答一句 , 这样多有意思 , 这也使得这个机器更加人性化 , 实用性更强 。
好的 , 介绍一下我们今天将会用到的新模块 , 就是这个东西 , 下图是实物图:
本文插图
模块型号名称是MP3-TF-16P , 别看它体积不大 , 功能可是很强大的 。 简单来说 , 它就是一个音乐播放器 , 可以用来播放U盘、TF卡、NOR FLASH里的MP3、WAV、WMA格式的音频文件 , 同时它也可以作为电脑的声卡 , 用来播放电脑的声音 。 它也可以作为读卡器 , 通过USB连接电脑后就可以更新TF卡里的内容 , 用来更新文件 。 还有更关键的一点是 , 它价格很便宜 , 几块钱的东西 , 很是值得我们入手来开发学习 。
这个小东西能用来放音乐 , 放广播 , 它不仅支持通过按键来选曲、调音量 , 还可以通过单片机来操作 , 这也就是说 , 我们可以通过编程 , 通过串口来发指令 , 指定它什么时候放哪首歌曲 , 放多大的音量 , 中途插不插播广告等 , 根本不用我们动手 , 程序上就解决了 。 这就很有灵性了 , 我们上节课学习了LD3320语音识别模块 , 它识别到我们的指令后可以对IO口做一系列的操作 , 用来输出高低电平或者从串口发送数据 , 我们这样把它俩撮合到一起 , 这不就成了嘛 , 一个具有语音交互功能的语音识别系统就这样诞生了 。
本文插图
来 , 先来看看这个小家伙的这些引脚都有什么作用 。 看图:
本文插图
它一共有16个脚 , 左上角为第一个脚 , 是模块的电源输入引脚 , 输入电压范围是3.3-5V , 建议用5V供电 。
第二个脚是RX , 是UART 串行数据输入 。
第三个脚是TX , 是UART 串行数据输出 。
第四个脚是DAC_R , 是音频输出右声道 , 可驱动耳机或者输出音频信号给功放 。
第五个脚是DAC_L , 是音频输出左声道 。
第六个脚是SPK2 , 是接小喇叭+的 , 可以驱动小于3W的喇叭 。
第七个脚是GND , 接电源负极 。
第八个脚是SPK1 , 是接小喇叭-的 。
第九个脚是IO1 , 是触发口 , 默认上一曲(长按音量-) 。
第十个脚也是GND 。
第十一个脚是IO2 , 也是触发口 , 默认下一曲(长按音量+) 。
第十二个脚是ADKEY1 , AD口1 , 当触发时是第一段(长按循环第一段) 。
第十三个脚是ADKEY2 , AD口2 , 当触发时是第五段(长按循环第五段) 。
第十四个脚是USB+ , USB+ DP , 接U盘或插电脑的USB口 。
第十五个脚是USB- , USB- DM , 接U盘或插电脑的USB口 。
最后一个是BUSY引脚 , 它是播放指示 , 有音频播放时是输出低电平 , 没有音频播放时是输出高电平 。
好 , 到这一步我们要理一下思路啦 , 对于命令的传输我们通过串口来发送 , 当语音识别模块识别到我们的命令后 , 让它通过串口给这个MP3模块发送一串指令 , 这MP3模块接收到指令后 , 就播放相对应的MP3文件 , 这样不就实现了系统对我们的应答了嘛 。分页标题
本文插图
比如我设置这个语音识别模块的一级口令为“创客小秘” , 我叫一声“创客小秘” , 语音识别模块识别成功后就给MP3模块发送一个指令 , 指定播放一个MP3文件 , 而这个文件的内容是“主人 , 我在” , 这样就完成了一个交互的过程 。
好 , 先把硬件连接好 , 我画了个简单的电路图:
本文插图
左边这个是语音识别模块 , 右边的是MP3模块 , 它们电源正极和地都需要接 , 这个不用说 , 然后就是数据的传输了 , 通过串口来 , 它们的RX和TX交叉来接 , RX接TX , TX接RX , 这就完成了 , 很简单 。 当然 , 如果我们还要去控制家电 , 那就像上节课一样通过一个三极管控制继电器就好了 。 我这里增加了一路是用来控制这个小风扇的开与关的 , IO口控制三极管 , 然后三极管直接控制风扇 。
好 , 接下来讲讲怎样生成我们需要的MP3文件 , 我们先设想一下对话的过程 , 简单举五个例子吧 , 第一句 , 就是我说出一级口令 , 我叫一声“创客小秘” , 语音识别模块识别成功后回我一句“主人 , 我在”;
第二句 , 我说“打开继电器” ,语音识别模块识别成功后回我一句“好的” , 同理 , 我说“关闭继电器”回我“好的” 。 第三句 , 我说“打开风扇” , 回我“已开风扇” 。 第四句 , 我说“关闭风扇” , 回我“已关风扇” 。 第五句 , 我说“拜拜” , 回我“主人再见 , 很高兴为您服务!”
好 , 下一步就是生成MP3文件了 , 我们需要生成的MP3文件有:1、主人 , 我在;2、好的;3、已开风扇;4、已关风扇;5、主人再见 , 很高兴为您服务!
本文插图
生成这些MP3文件我用的软件是朗读女 , 我们只要输入文字 , 它就会合成语音 , 选择想要的发音人 , 然后就可以直接生成MP3文件啦 , 非常好用 。 当然还有其它软件 , 比如灵云朗读软件、TTS语音合成工具、讯飞快读等 , 大家根据自己需要来选用 。
好 , 我们生成这些MP3文件后 , 把它们拷贝到TF卡里 , 然后把卡插到MP3播放模块上就可以了 。
本文插图
到此为止 , 我们硬件上的准备已经就绪 , 接下来要做的就是要修改程序 。 到这一步要跟大家说一下控制这个MP3模块播放的指令和格式 。 举个例子 , 指定播放一个MP3文件的指令是这样的:7E FF 06 03 00 00 01 FE F7 EF , 很长吧 , 我们从语音模块通过串口给MP3模块发这一串东西 , MP3模块收到后就知道这是要播放第一个MP3文件了 , 在这里简单说一下每个字节表示的意思:7E是起始位 , 固定不变的 , 都要有它;FF这是这个模块的版本信息 , 也是固定不变的;06 , 指的是从上一字节开始 , 到后面的字节个数 , 也就是说 , 从FF开始 , 到06 03 00 00 01为止 , 一共有六个字节 。 然后这个03在这里 , 指的是指定曲目播放 , 也是固定不变的 。 00在这里指的是不需要反馈信息 , 如果是01 , 就是要反馈信息 , 这里的反馈信息指的是MP3播放模块反馈给语音识别模块的信息 。 到这个00 01 , 这里指的是歌曲序号 , 00是数据高字节 , 01是数据低字节 , 低字节01在这里表示的就是播放第一首歌曲 。 FE和F7指的是累加和校验 , 是用来给数据查错的 , 最后一位EF是结束位 , 当接收到这一位 , 就说明整个数据发送完毕了 。 在这里可能大家听得比较懵逼 , 它设置那么复杂的指令是为了提高数据传输时的准确性 , 大家听不懂也没关系 , 懂得有这么一回事就得了 。 在这里我们要关注的是03 00 00 01这四个字节 , 代表的就是指定播放第一首歌曲 , 不需要信息反馈 。分页标题
本文插图
好 , 看下面的图片 , MP3模块官方给出的例程 , 在这里我只给大家简单介绍3个函数 , 首先是这个串口发送函数 , 就是把我们上面的这一串东西发送出去的函数 , 你看它最先发送出去的是起始位的7E , 然后通过一个自加循环 , i++ , 按顺序的把这一串数据全部发送出去 , 后面EF就是结束位了 。
本文插图
?如下图 , 往下这个是求和校验函数 , 为什么要这个函数呢 , 它是怕数据在传输的过程中出错 , 经过这个函数处理 , 配合下一个要讲的函数 , 它就知道这个数据在传输的过程有没有出错 。 举个例子 , 比如原先我是想传00010001这个数据 , 结果数据在传输的过程中受到干扰 , 有一位数据受到影响由0变成1了 , 那在接收的那一端收到的数据可能就变成了00010011了 , 如果没有校验函数去校验 , 接收端就无法判断数据的准确性 , 这就很容易出现大问题 , 所以这个函数存在的意义就在这里了 。 这个函数在这里具体是怎么校验的就不深入给大家讲了 , 解释进去又是另一片天地了 。
本文插图
再看到下边的图片 , 图片上面那个是Uart_SendCMD函数 , 我们一起结合下面main函数里的操作来看 , 如下图:
本文插图
先看下面的main函数 , 在main函数里首先初始化串口寄存器 , 然后执行Uart_SendCMD这个函数 , 这个函数的括号里有3个数据 , 0x03指的是播放指定的MP3文件 , 中间的0指的是无需反馈 , 0x01指的是播放第一首歌曲 , 这三个数据会分别赋值给上面这个函数括号里的CMD、feedback和dat , 然后大家看到上边Uart_SendCMD函数里边 , CMD放画红色横线1的位置 , feedback放画红色横线2的位置 , dat放画红色横线3的位置 , 而且这个dat分高字节和低字节的 , 这6个字节的数据是不是就是我们刚才讲过的从FF开始到01的这6个 , 是了吧 , 然后进行校验 , 最后就把这些数据通过串口给发送出去了 。
好 , 我们需要做的就是把这3个函数复制粘贴到语音识别模块的大程序中去 , 进行融合 , 如下图:
本文插图
【AI人工智能|LD3320结合MP3模块加入语音交互功能,实现人和机器交流对话】
本文插图
然后我们在语音识别程序处理函数这里加上我们想要播放的音乐就得了 , 还记得我们刚才生成的MP3文件吗?我们按顺序放到TF卡里 , 第一首是“主人 , 我在” , 第二首是“好的” , 第三首是“已开风扇” , 第四首是“已关风扇” , 第五首是“主人再见 , 很高兴为您服务” 。
来啦 , 如下图:
本文插图
当我们说出一级口令 , 识别成功后我们就调用第一首音乐 , 把这个函数放过来 , 里面三个数据就是0x03,0,0x01,0x01在这里指的就是播放第一首歌曲嘛 , 就是播放“主人我在” 。
好 , 然后下面 , 如下图:
本文插图
打开继电器关闭继电器都是调用“好的”这个MP3文件 , 那我们把这个函数放过来 , 里面三个数据就是0x03,0,0x02 。 0x02在这里指的就是播放第二首歌曲 。分页标题
同理 , 看下面的图片:
本文插图
当我说出“打开风扇”时 , 调用的就是第三首歌曲 , IO口给个高电平;当我说出“关闭风扇”时 , 调用的就是第四首歌曲 , IO口给个低电平 。
本文插图
看上面的图片 , 最后 , 当我说出拜拜时 , IO口不用做任何操作 , 只发送串口数据 , 调用“主人再见 , 很高兴为您服务!”这个MP3文件 , 一样的 , 我们把这个函数放过来 , 里面三个数据就是0x03,0,0x05,后面的这个0x05在这里指的就是播放第五首歌曲 。
好的 , 这就完成了编程的整个过程 , 我们将程序编译下载 , 就完成了给语音识别模块添加语音交互的这个功能 , 整个过程有点繁琐 , 也有点难度 , 需要大家有一定的基础 , 在这里主要是给大家粗略看一下开发的大致框架与过程 , 给大家提供一个思路 , 大家也可以根据自己的需求加入更好的创意和想法 , 还是挺好玩的一个作品 。
详细视频教程请移步到我的主页观看 , 本期图文教程就讲这么多 , 后面再给这个语音控制系统加一个无线传输数据、无线控制的功能 , 比如在家里 , 我想在一个房间通过语音识别 , 去控制另一个房间的灯的开关 , 那就需要一个无线模块去完成通讯了 , 我们先做一对一的 , 看进度可以的话再做一对多 , 不断完善丰富我们的系统 。
本期教程就到这里了 , 我们下期再见 , 拜拜 。
来源:(科技小数据)
【】网址:/a/2020/0712/1594484717.html
标题:AI人工智能|LD3320结合MP3模块加入语音交互功能,实现人和机器交流对话