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

news2024/11/15 14:08:45

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

接下里,和大家分享下我的实现方法:首先音乐播放模块用的是我在上一篇博文写的《用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 = 0
        elif 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 = 0
        time.sleep(0.5)

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

import music
import random

musicThreads = []
count = 0
index = 0
flag = True

def playMusic():
   global index
   global count
   global flag
   global musicThreads
   musicThread = music.MusicThread()
   musicThreads.append(musicThread)
   count = musicThread.getCount()
   index = random.randint(0, count-1)
   musicThread.setId(index)
   musicThread.start()
   flag = False

def stopMusic():
   global index
   global count
   global flag
   global musicThreads
   index = musicThreads[-1].getId()
   musicThreads[-1].setId(count-1)
   musicThreads[-1].stop()
   flag = True

def nextSong():
   global index
   global musicThreads
   musicThreads[-1].stop() 

def prevSong():
   global index
   global musicThreads
   index = index - 1
   musicThreads[-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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

netty编程之基于websocket发送二进制数据

写在前面 本文看下基于websocket发送二进制数据。 1:正文 直接看源码吧,主要如下几个类: WebSocketServerProtocolHandler (内置):负责websocket握手消息处理 BinaryWebSocketFrameHandler(自定义):负责处理二进制…

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器 服务雪崩熔断、限流、降级熔断降级限流 手写实现一个微服务熔断限流器架构设计代码实现整体逻辑ProtectorAspect#aroundMethod(ProceedingJoinPoint)具体实现1、获取接口对…

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时,遭遇报错。具体报错信息如下: ‘NODE_OPTIONS‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…

速通LLaMA2:《Llama 2: Open Foundation and Fine-Tuned Chat Models》全文解读

文章目录 概览LLaMA和LLaMA2的区别AbstractIntroductionPretrainingFine-tuning1. 概括2、Supervised Fine-Tuning(SFT)3、⭐Reinforcement Learning with Human Feedback(RLHF)🔺总览Training Objectives:…

Redis——redispluspls库——通用命令以及String类型相关接口使用

文章目录 通用命令get,setkeys插入迭代器 expire和ttltype string 类型接口set和getset NX和XXmset 和 mgetgetrange 和 setrangeincr 和 decr 通用命令 get,set void get_set_test(sw::redis::Redis& redis){//bool set(const sw::redis::StringV…

回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-HKELM向量加权算法优化混合核极…

使用Python和Proxy302代理IP高效采集Bing图片

目录 项目背景一、项目准备环境配置 二、爬虫设计与实现爬虫设计思路目标网站分析数据获取流程 代码实现1. 初始化爬虫类(BingImageSpider)2. 创建存储文件夹3. 获取图像链接4. 下载图片5. 使用Proxy302代理IP6. 主运行函数 运行截图 三、总结 项目背景 …

2024/9/21 leetcode 19题 24题

目录 19.删除链表中的倒数第n个结点 题目描述 题目链接 解题思路与代码 24.两两交换链表中的结点 题目描述 题目链接 解题思路与代码 19.删除链表中的倒数第n个结点 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示…

Kyutai开源实时语音对话模型Moshi

新闻 法国人工智能实验室Kyutai在巴黎举行的一次活动上推出了能够进行自然交互的对话式人工智能助手Moshi,并计划将其作为开源技术发布。Kyutai表示,Moshi是首款可公开访问的人工智能助手,可实现实时对话,有别于OpenAI的GPT-4o&a…

mybatis 和 mybatis-plus

mybatis 配置 1.新建MAVEN项目 2.配置mybatis依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)

本文主要内容:详细介绍了无人机航拍输电线瓷瓶检测的整个过程&#xff0c;从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 输电线路绝缘瓷瓶的检测主要依赖人工巡检。巡检人员需携带专业设备&#xff0c;攀…

Typora安装和导入导出

Typora安装和导入导出 文章目录 Typora安装和导入导出前言Typora v1.9.5Typora v1.4.7Pandoc 前言 Typora v1.9是最新版, , Typora v1.4是老版本的, 这两个选择一个即可Pandoc可以导入导出word Typora v1.9.5 Typora v1.9.rar, 提取码&#xff1a;tian按ctrl单击鼠标左键打开…

毕业设计选题:基于ssm+vue+uniapp的捷邻小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大数据实验一: Linux系统安装和使用

一、实验目的 描述Ubuntu的安装过程&#xff1b;使用命令完成Ubuntu中的基础操作&#xff1b; 二、实验平台 操作系统&#xff1a;window系统&#xff1b;内存&#xff1a;4G以上&#xff1b;硬盘&#xff1a;100GB以上&#xff1b;Virtual Box或者VMware&#xff1b;Ubuntu…

如何用1024张显卡训练一个模型

最近看到知乎一个回答&#xff0c;把千卡训练的难度吹上天了。但其实真正用过千卡就会发现也就那么几个点。于是想写一篇文章简单讲讲。 本文将包括几个部分&#xff1a; 首先我们将讨论千卡训练的难题&#xff0c;以及应该在什么时候使用千卡训练&#xff1b; 接着&#xff…

品牌建设是什么?怎么做好品牌建设?

品牌建设&#xff0c;是每个公司品牌形象树立过程中所做的一系列动作&#xff0c;旨在与目标市场建立情感联系&#xff0c;并在竞争激烈的市场中为企业或产品赢得认同和忠诚度。要做好品牌建设&#xff0c;公司首先要明确自己的品牌定位&#xff0c;然后在通过一些品牌建设策略…

Java调用数据库 笔记06 (修改篇)

1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类调用方法进行连接&#xff0c;得到连接对象 DriverManager.getConnection(url, user, password); 其中设置参数&#xff1a; static final String url "jdbc:my…

2024年上海小学生古诗文大会倒计时一个月:做2024官方模拟题

2024年上海市小学生古诗文大会自由参赛的初赛将于10月19日开始&#xff0c;还有不到一个月的时间。 今天好真题继续带着大家来继续做官方2024年小学生古诗文大会的官方模拟题。 【温馨提示】我给每一道题都独家制作了解析&#xff0c;便于孩子理解和熟记题目背后的知识点&…

【python设计模式6】行为型模式1

目录 责任链模式 观察者模式 责任链模式 责任链模式的内容&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。责任链的角色有抽象处理者、…

b2b2c商城系统好用么 多用户商城系统四大盈利模式

商淘云B2B2C商城系统能帮助企业快速搭建企业自己的多用户商城系统&#xff0c;它提供了多种功能&#xff0c;如多商家管理、订单处理、支付模块集成等&#xff0c;适合各种规模的企业。用户界面友好&#xff0c;且支持定制化&#xff0c;能满足不同业务需求。 多用户商城有四大…