3452| 1
|
[项目] 物联版智能音箱——基于树莓派 |
大家可能都体验过小度音箱或者天猫精灵之类的智能音箱,但是这类音箱都是通过内置麦克风来获取用户的音频指令来播放内容的。受收音距离的限制,用户不能远离音箱,有时甚至大声喊出来,才能被识别。今天带大家利用物联网技术来远程发送音频指令,控制音箱播放你想要的内容。 一、所需器材 1、古德微镜像树莓派 2、有线音箱或蓝牙音箱 3、手机 二、知识回顾 1、MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,基于客户端-服务器进行消息发布/订阅 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。 MQTT传输的消息分为:主题(Topic)和负载(payload)两部分: (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload); (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。一般MQTT服务器会限制消息内容的长度。百度物联网平台限制为32K,不适合发送音频和图片消息。 2、Base64编码 Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码。标准Base64编码使用的64个字符为: 我们以字符串“Hello! ”编码过程为例,了解编码过程: Hello! 的Base64编码结果为 SGVsbG8h ,原始字符串长度为6个字符,编码后长度为8个字符,每3个原始字符经Base64编码成4个字符,编码前后长度比4/3,编码后的文本大小会增大1/3。对于原始长度不是3的倍数的情况,通过添加“=”来补全。 网上有很多Base64编解码工具,比如:http://tool.chinaz.com/Tools/Base64.aspx。 Python标准库中就包含Base64模块,用法非常简单: [mw_shl_code=python,false]import base64 me = base64.b64encode(b"mink") #b64encode 的参数类型必须是字节包(bytes) print(me) # 编码结果: 'bWluaw==' print (base64.b64decode(me) ) # 解码结果:'mink'[/mw_shl_code] 三、智能音箱实现过程 1、实现原理 (1)手机打开古德微控件页面,连接MQTT服务器,利用录音控件发布(Publish)主题为“audio”的音频数据(Base64编码) (2)树莓派与MQTT服务器建立连接,并订阅“audio”主题; (3)如果收到主题为“audio”的消息,将消息内容经过Base64 解码,并保存为mp3音频文件; (4)利用语音识别功能,识别上一步保存的MP3音频,转换为文字; (5)判断识别出来的文字是否包含指定的关键词,分别实现相应的动作; (6)点播功能,如果包含“播放”两个字,截取“播放”二字以后的文字,并将这些文字内容保存在【歌名文件】中; (7)python爬虫程序循环检测【歌名文件】的修改时间,如果修改时间有变化,打开【歌名文件】读取歌名,调用爬虫函数下载网络歌曲,保存为mp3文件。 (8)播放MP3歌曲 登录古德微编程平台:http://www.gdwrobot.cn进行编码。 2、添加物联网录音控件,注意设备编码要与所使用的的树莓派编码一致,主题也要记住,下面的程序中会用到。手机打开控件页面,按住录音按钮,就可以向指定的MQTT服务器发布(Publish)录音数据了 3、实现订阅主题,语音识别得到点播内容名称【歌名文件】,等待爬虫程序下载点播音频文件,下载完成后开始播放。 4、监测【歌名文件】爬取网络音频文件 通过python标准库os监测【歌名文件】的修改时间,如果较上次读取时间有变换,就重新读取内容,调用爬虫函数进行搜索,筛选出免费音乐,如果有多首符合条件的音乐,则随机选择其中一首进行下载。 爬虫部分参考CSDN博文:https://blog.csdn.net/weixin_44119390/article/details/90812246 四、效果演示 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed