首页 > 其他分享 >树莓派智能语音助手实现音乐播放

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

时间:2024-09-14 20:55:47浏览次数:9  
标签:index 树莓 resp global musicThreads 语音 time 播放

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

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

标签:index,树莓,resp,global,musicThreads,语音,time,播放
From: https://blog.csdn.net/hydekong/article/details/142266041

相关文章

  • 智能语音电销机器人的应用前景
    智能语音电销机器人是一款自动外呼软件,它可以自动拨打电话,在系统中导入手机号码,上传专业话术语音,导入客户名单后就可以自动拨打电话。客户接通后,系统会按照设定好的话术逻辑与客户进行沟通,筛选出意向客户,绑定微信后,会直接将意向客户直接推送到微信上。咨询嘉单科技yyzkd8使用......
  • RTSP播放器选型指南
    RTSP播放器选型指南选择合适的RTSP播放器时,需要考虑多个方面以确保其能够满足您的具体需求。以下是一些关键的选择标准和建议:一、功能需求低延迟:对于直播或实时监控场景,低延迟是至关重要的。选择一个能够保持较低延迟(如几百毫秒)的RTSP播放器,以确保实时性。音视频同步:确保......
  • 树莓派操作系统-利用Makefile创建内核镜像文件kernel8.img
    编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。在MakeFile里的构建过程分为3步:1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。2.将.o文件经过链接生成.elf可执行文件......
  • HarmonyOS video 视频播放器
    源码import{display,window}from'@kit.ArkUI';@Entry@ComponentstructIndex{controller:VideoController=newVideoController()//video控制器@StatecurRate:PlaybackSpeed=PlaybackSpeed.Speed_Forward_1_00_X;//播放倍数@StatecurRateName......
  • 今年最后一期【计算机视觉和自然语言及语音处理】专项培训
    证书出台背景:为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求,深入实施人才强国战略和创新驱动发展战略,加强全国数字化人才队伍建设,持续推进人工智能从业人员能力培养和评价,工业和信......
  • Whisper 模型在实时语音转录中有哪些具体的应用场景?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • NVG040W语音芯片为制氧机带来人性化、便捷和安全
    在当今社会,家庭医疗设备和健康保健产品越来越受到人们的关注。制氧机作为其中的一种,为许多需要氧气治疗的人们提供了重要的帮助。然而,对于许多用户来说,如何正确操作和维护这些设备仍然是一个挑战。为此,NVG040W语音芯片为制氧机带来了人性化的语音提示和报警功能,使设备使用更加便捷......
  • 动物目标检测——基于YOLOv5和树莓派4B平台
    目标检测在计算机视觉领域中具有重要意义。YOLOv5(YouOnlyLookOne-level)是目标检测算法中的一种代表性方法,以其高效性和准确性备受关注,并且在各种目标检测任务中都表现出卓越的性能。本文将详细介绍如何在性能更强的计算机上训练YOLOv5模型,并将训练好的模型部署到树莓派4B上,通过......
  • 使用WebSocket协议实现在ESP32上音频接收播放
     主要目的:学习WebSocket通讯协议和ESP32开发所需配置:Pycharm,python3.12,ESP32S3N16R8, 扬声器(8欧,2W), 功放模块:MAX98357I2SAMP。一、介绍 1、WebSocket协议 WebSocket是一种网络通信协议,位于OSI模型的应用层。它提供了在单个TCP连接上进行全双工通信的能力,使得客......
  • Whisper技术:引领语音交互新时代
    在当今这个数字化时代,人们对于高效、便捷的交互方式的需求日益增长。其中,语音交互作为一种自然、无障碍的沟通方式,正逐渐成为科技发展的前沿领域。而Whisper技术,正是这一领域中的一颗璀璨明星,引领着语音交互迈向新的高度。一、Whisper技术简介Whisper技术是一种基于深度学习的语音......