当前位置: 首页 > news >正文

树莓派智能语音助手实现音乐播放

树莓派语音助手从诞生的第一天开始,我就想着让它能像小爱音箱一样,可以语音控制播放音乐。经过这些日子的倒腾,今天终于实现了。

接下里,和大家分享下我的实现方法:首先音乐播放模块用的是我在上一篇博文写的《用sounddevice实现连续的音乐曲库播放》,然后语义解析部分依旧用的是RASA,具体做法同前不久实现的《让树莓派智能语音助手实现定时提醒功能》,即用RASA解析语义,返回关键字指令给语音助手,语音助手负责调用sounddevice编写的语音库执行指令。

RASA部分主要定义了4个新的intent和4个新的actions。

如上分别是stories.md和nlu.md新增部分,最右边的是其中一个actions的举例,没啥技术含量,剩下三个就不贴了。另外,domain.yml部分记得把intent和actions定义一下。这些就是RASA的全部内容了。

再来看语音助手的demo.py部分。这次我把收到语义解析后的代码都重新改写了一下:

if resp == "有需要再叫我":print("对话结束,等待呼唤……"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) status = 0elif resp == 'play_music':resp = ""if flag:playMusic()elif resp == 'next_song':resp = ""nextSong()elif resp == 'prev_song':resp = ""prevSong()elif resp == 'stop_music':resp = ""stopMusic()else:index0 = resp.find('5分钟后提醒')if index0 != -1:text0 = '/EXTERNAL_reminder't = threading.Timer(300, act_remind, args=[text0])t.start()if resp != "":print("回复内容:"+resp)tts.text_to_speech(resp)else:print("播放音乐,对话结束,等待呼唤……"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))status = 0time.sleep(0.5)

以上代码放在callback函数“print("解析耗时:"+f'{time.time() - t:.4f}s')”这句话之后。除了这部分,再定义四个函数。

import music
import randommusicThreads = []
count = 0
index = 0
flag = Truedef playMusic():global indexglobal countglobal flagglobal musicThreadsmusicThread = music.MusicThread()musicThreads.append(musicThread)count = musicThread.getCount()index = random.randint(0, count-1)musicThread.setId(index)musicThread.start()flag = Falsedef stopMusic():global indexglobal countglobal flagglobal musicThreadsindex = musicThreads[-1].getId()musicThreads[-1].setId(count-1)musicThreads[-1].stop()flag = Truedef nextSong():global indexglobal musicThreadsmusicThreads[-1].stop() def prevSong():global indexglobal musicThreadsindex = index - 1musicThreads[-1].setId(index)musicThreads[-1].stop()

所有这些语音助手部分的代码都是基于最初的《树莓派智能语音助手之功能整合》修改的,有兴趣的小伙伴可以自行拼接。

好了,执行了如上代码后,树莓派智能语音助手也可以通过语音播放音乐了。

最后补充3个事情:

1.语音控制模块我是调用了sounddevice和soundfile的库,其中soundfile又是基于libsndfile来解码音频文件的。但是,我的raspbian能升级的libsndfile版本最高只有1.0.28,这个库在1.1.0版本下是不支持MP3解码的,所以,最终播放的音乐,我都是在pc端把MP3转格式为wav后才能使用。但是我在pc端windows下没有这个问题。在使用这个库之前可以先查看一下libsndfile的版本。

2.用于语音识别的录音模块我用的也是sounddevice,所以,要修改下record.py,在下面这句中添加一个参数device=,等号后面填写你录音所用的设备编号。

audio = sd.rec(int(self.duration * self.sample_rate), samplerate=self.sample_rate, channels=1)

查看有哪些音频设备,可以在终端输入:

python -m sounddevice

回车后就会list你可用音频设备列表,如下图就是我树莓派上的,我选择的是2号USB PNP SOUND DEVICE,所以上面新增的device参数可以写device=3

这样修改后,就可以让音乐播放和语音输入两个功能相对独立存在。

3.一开始在执行音乐播放时遇到了output underflow的提示,导致语音助手都卡壳了。后来查了文档解决了这个问题,具体解决方法可以看:

​​​​​​​用sounddevice播放音乐遇到output underflow提示-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TSRPC+Cocos
  • 在react中 使用redux
  • 2024年最新软件测试学习路线图(从入门到精通)
  • 利用长度选择器优化Prompt示例选择:提升AI对话效率
  • python实现多个pdf文件合并
  • docker镜像结构
  • pikachu下
  • Redis常用操作及springboot整合redis
  • 监听html元素是否被删除,删除之后重新生成被删除的元素
  • Django_Vue3_ElementUI_Release_004_使用nginx部署
  • C编程控制PC蜂鸣器
  • 【乐企-业务篇】开票前置校验服务-规则链服务接口实现(纳税人基本信息)
  • dedecms(四种webshell姿势)、aspcms webshell漏洞复现
  • Leetcode 144. 二叉树的前序遍历(Easy)
  • JZ2440开发板——S3C2440的UART的使用
  • 分享一款快速APP功能测试工具
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Angular 2 DI - IoC DI - 1
  • Angular4 模板式表单用法以及验证
  • C# 免费离线人脸识别 2.0 Demo
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript DOM 10 - 滚动
  • JavaScript 基础知识 - 入门篇(一)
  • Java多态
  • JSONP原理
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 订阅Forge Viewer所有的事件
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 详解NodeJs流之一
  • 移动端唤起键盘时取消position:fixed定位
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #java学习笔记(面向对象)----(未完结)
  • #宝哥教你#查看jquery绑定的事件函数
  • (03)光刻——半导体电路的绘制
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (solr系列:一)使用tomcat部署solr服务
  • (SpringBoot)第二章:Spring创建和使用
  • (SpringBoot)第七章:SpringBoot日志文件
  • (vue)页面文件上传获取:action地址
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库