使用树莓派3B+开发智能音乐播放器

2023-05-16

一、功能描述

对麦克风说出歌名后,树莓派自动下载对应歌曲的MP3,默认播放搜索到的第一首歌曲。

二、硬件设备

1、树莓派3B+

2、sony的ps3 eye麦克风一个(淘宝20块一个,带摄像头和4个麦克风阵列,USB连接)

3、蓝牙音箱


三、需要的python库

1、pyaudio:用于采集麦克风语音信号

2、baidu-aip:使用百度的AI库,用于语音识别,将语音转化为文字和将文字转化为语音。需要到百度AI上注册,获取ID和KEY

3、requests:网络爬虫,用于搜索歌曲的MP3并下载,爬取百度

4、pygame:用于音乐文件播放

四、源代码

# -*- coding: utf-8 -*-

from aip import AipSpeech  #百度语音识别库
import pyaudio             #麦克风声音采集库
import wave
import requests,json       #音乐搜索
import pygame              #mp3播放
import os
import time
import sys
""" 我的 APPID AK SK """
APP_ID = 'XXXXXXX' #需要到百度AI注册申请ID  KEY 
API_KEY = 'XXXXXXXXXXXXXXXXXX'
SECRET_KEY = 'XXXXXXXXXXXXXXXXX'

#定义采集声音文件参数
CHUNK = 1024
FORMAT = pyaudio.paInt16 #16位采集
CHANNELS = 1             #单声道
RATE = 16000             #采样率
RECORD_SECONDS = 9       #采样时长 定义为9秒的录音
WAVE_OUTPUT_FILENAME = "/home/pi/my_python_programe/myvoice.pcm"  #采集声音文件存储路径

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

#获取下载地址
def get_down_url(songid):
    req=requests.get("http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.play&format=jsonp&callback=jQuery17206073972467458864_1511011710426&songid=%s&_=1511011713541" %songid)
    req.encoding='utf-8'
    #print(json.loads(req.text))
    json1=json.loads(req.text.replace("jQuery17206073972467458864_1511011710426(","").replace(");",""))
    print("下载地址:",json1["bitrate"]['show_link'])
    return json1["bitrate"]['show_link']
#下载保存文件
def music_down(url,music_name,artistname):
    f=open(music_name+'-'+artistname+'.mp3','wb')
    req_mp3=requests.get(url)
    f.write(req_mp3.content)
    f.close()
#调用百度AI,将文字转化为声音输出,用于提示音
def word_to_voice(text):
    result = client.synthesis(text, 'zh', 1, {
        'vol': 5, 'spd': 3, 'per': 3})
    if not isinstance(result, dict):
        with open('/home/pi/my_python_programe/audio.mp3', 'wb') as f:
            f.write(result)
            f.close()
    pygame.mixer.music.load('/home/pi/my_python_programe/audio.mp3')#text文字转化的语音文件
    pygame.mixer.music.play(loops=0)
    while pygame.mixer.music.get_busy() == True:
        print('waiting')

def word_to_voice1(text):
    result = client.synthesis(text, 'zh', 1, {
        'vol': 5, 'spd': 3, 'per': 3})
    if not isinstance(result, dict):
        with open('/home/pi/my_python_programe/audio1.mp3', 'wb') as f:
            f.write(result)
            f.close()
    pygame.mixer.music.load('/home/pi/my_python_programe/audio1.mp3')
    pygame.mixer.music.play(loops=0)
    while pygame.mixer.music.get_busy() == True:
        print('waiting')

#获得麦克风输入的声音文件,保存在myvoice.pcm
def  get_mic_voice_file(p):
    word_to_voice('请说出歌名')

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)
    print("* recording")

    frames = []
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
    print("* done recording")
    stream.stop_stream()
    stream.close()
    #p.terminate()#这里先不使用p.terminate(),否则 p = pyaudio.PyAudio()将失效,还得重新初始化。
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()
    print('recording finished')

#百度语音识别出歌名文字并返回
def  baidu_get_song_name(client):
    results = client.asr(get_file_content(WAVE_OUTPUT_FILENAME), 'pcm', 16000, { 'dev_pid': 1536, })
    # print(results['result'])
    song_name=results['result'][0]
    print(song_name)
    return song_name

#百度音乐下载歌曲,取自百度
def download_music_file(song_name):
    req_url = "http://sug.music.baidu.com/info/suggestion?format=json&word=%s&version=2&from=0&callback=window.baidu.sug&third_type=0&client_type=0&_=1511013032878" % song_name
    req_so = requests.get(req_url)
    data = json.loads(req_so.text.replace("window.baidu.sug(", "").replace(");", ""))
    for i in data["data"]["song"]:
        print("\tsongid:" + str(i["songid"]), "音乐名字:" + i["songname"], "\t歌手:" + i["artistname"])
    input_songid = data["data"]["song"][0]["songid"]  # input("请输入你要下载的songid:")
    for i in data["data"]["song"]:
        if input_songid == str(i["songid"]):
            url = get_down_url(i["songid"])
            music_down(url, i["songname"], i["artistname"])
            print("下载完成")
            music_name = i['songname']  # 获取MP3文件中的歌曲名
            artistname = i["artistname"]  # 获取MP3文件中的歌手名
    filename = '/home/pi/my_python_programe/' + music_name + '-' + artistname + '.mp3'
    print(filename)

    word_to_voice1('请欣赏')
    return filename

def play_mp3(music_file):
    pygame.mixer.music.load(music_file)
    '''while True:
        # 检查音乐流播放,有返回True,没有返回False
        # 如果一直有音乐流则选择播放
        if pygame.mixer.music.get_busy() == False:
            pygame.mixer.music.play()'''
    pygame.mixer.music.play(loops=0)  #该函数运行后立即返回,音乐一直在后台运行

def one_time_process(p):#一次麦克采样+语音识别+音乐下载+自动播放
    get_mic_voice_file(p)
    play_mp3(download_music_file(baidu_get_song_name(client)))



if __name__=='__main__':
    #麦克风采集初始化、百度语音识别初始化、mp3文件播放初始化
    p = pyaudio.PyAudio()
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    pygame.mixer.init()
    #


    while 1:#循环调用麦克录音
        one_time_process(p)
        while pygame.mixer.music.get_busy()==True:
            print('playing')

四、其他

1、在/home/pi下新建my_python_programe文件夹,将程序文件拷贝到该文件夹下,“python3  文件名.py”运行程序。

2、程序只是个雏形,还有许多不完善和BUG,下一步将加入snowboy语音唤醒功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用树莓派3B+开发智能音乐播放器 的相关文章

随机推荐

  • 记录ubuntu22.04突然连不上网

    问题 xff1a ubuntu22 04莫名其妙连不上网 xff0c 右上角那个网络图标也没有 折腾了一天之后终于能连网了 因为虚拟机里装了conda环境 xff0c 装了一个机器学习框架要用的各种包 xff0c 实在不想再装一次虚拟机和环
  • IOS开发之——多线程-基础(1)

    一 概述 进程和线程多线程在IOS开发中的应用耗时操作的执行 二 进程和线程 2 1 什么是进程 进程是指在系统中正在运行的一个应用程序比如同时打开QQ Xcode xff0c 系统就会分别启动2个进程通过 活动监视器 可以查看Mac系统中
  • Word文档(.docx) 转为 Markdown文档(.md)的一种方法 —— 一款word插件(Writage)

    将Word文档转为Markdown文档 xff0c 虽然这种情况不多 xff0c 但是遇到的时候 xff0c 如果有一个顺手的插件 xff0c 那真是太舒服了 工具 xff1a Writage大小 xff1a lt 10M下载方式 xff1
  • Redis主从集群搭建(有网情况下在一台服务器)

    Redis集群搭建 简介 Redis 集群是一个提供在多个Redis节点间共享数据的程序集 Redis 集群通过分区来提供一定程度的高可用性 在实际环境中 xff0c 当某个节点宕机或者不可达的情况下能够继续提供服务 xff1b Redis
  • 操作无法完成,因为其中的文件夹或文件已在另一程序中打开 --> 彻底解决方案

    操作无法完成 xff0c 因为其中的文件夹或文件已在另一程序中打开 gt 彻底解决方案 删除文件时出现的状况 xff1a 解决方案一 打开任务管理器 xff08 快捷键Ctrl 43 alt 43 Del xff09 xff0c 选择性能
  • 重装系统后Photoshop打开提示已停止工作

    友情链接 xff1a http laozhangdongzao com 1 首先右键单击photoshop cs6 点击 属性 2 点击 兼容性 3 可以看到此时 以兼容模式运行这个程序 前未勾选 4 勾选 以兼容模式运行这个程序 xff0
  • python3—字典(dict)

    目录 1 字典的描述2 访问字典里的值3 修改字典4 删除字典元素5 字典键的特性6 字典内置函数 amp 方法 1 字典的描述 字典是另一种可变容器模型 xff0c 且可存储任意类型对象 字典的每个键值 key 61 gt value 对
  • 字母交换

    题目 字符串S由小写字母构成 xff0c 长度为n 定义一种操作 xff0c 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交换m次之后 xff0c 字符串中最多有多少个连续的位置上的字母相同 xff1f 链接 思路 记录每个
  • github加载太慢以及release里面文件下载太慢或者无法下载的解决方法

    参考链接 xff1a github下载与加载慢怎么解决 1 FastGithub 项目 解决github加载太慢 xff0c 解决releases无法上传下载失败等问题 2 dev sidecar 项目 解决github加载太慢 xff0c
  • Git常用命令符

    1 强制推送 xff08 慎用 xff0c 除非你认为其他冲突等可以丢弃 或者不是很重要 xff09 git push force 2 创建文件等小命令 touch a 创建一个a文件 echo 1234 gt gt a 把1234这个内容
  • ffmpeg--libswscale(图像缩放、颜色空间和像素格式转换操作)

    libswscale介绍 span class token number 1 span span class token number 2 span 种初始化方法 xff1a span class token keyword struct
  • vmware Ubuntu22.04共享文件夹找不到问题

    1 在VMware上先配置Windows上需要共享的文件名称路径 xff0c 选择 总是开启 2 在终端执行命令 xff1a vmware hgfsclient 当前面一步配置正确会显示 xff0c windows下共享的文件夹名称 但是我
  • Ubuntu Server 22.04修改静态ip及配置网关

    1 查看本机获取的IP地址 xff1a 输入命令 ip addr xff1a 2 修改配置文件 跳转到配置文件目录 xff1a cd etc netplan 使用ls查看配置文件名称 xff1a ls 使用nano修改配置文件 xff1a
  • 【二】卷积神经网络CNN

    为什么设计神经网络的架构能让结果表现更好 xff1f 总结 本课从影像识别切入 xff0c 从全连接网络讲起 xff0c 通过2种观察得出2种简化得到了CNN xff0c 一是有些pattern仅出现在图片的一小部分提出了感受野 xff0c
  • Docker Error :Invalid or corrupt jarfile .jar

    他提示的是你的jar包有问题 xff0c 无效 那么有很多种情况 xff0c 我遇到的是两种 dockerfile有问题 xff0c 我的dockerfile一开始是直接网上复制的 xff0c 其中有一句是将jar包copy进到容器 xff
  • Python每日一编程小练习(2019.05.26)——1到3循环报数,最后留下报号不是3的位置

    题目 xff1a 有n个人围成一圈 xff0c 顺序排号 xff0c 从第一个人开始报数 xff08 从1 3报数 xff09 xff0c 凡报到3的人退出圈子 问 xff1a 最后留下的人原来排在第几号 难点 xff1a 如何定义一个能循
  • 解决Ubuntu16.04拨号上网及有线连接频繁断网的问题

    最近从Ubuntu14 04换到了16 04 xff0c 学校又从锐捷校园网换成了深澜 xff0c 于是上网时候遇到了一些小问题 首先解决在Ubuntu下拨号上网 首先终端输入 sudo pppoeconf 之后就会出现一个界面 xff0c
  • Debian10配置Raid5及部署LVM

    Debian10配置 Raid5 任务点 添加4块1G的硬盘 创建raid5 xff0c 其中一块作为热备盘 xff0c 设备名为md0 将md0设置为LVM xff0c 设备为 dev vg01 lv01 格式化为ext4文件系统 开机自
  • Debian 10 apache2配置https

    apache2配置https 首先需要证书 xff0c 可以看我另一篇关于openssl颁发证书的blog 配置https span class token comment 编辑配置文件 span span class token func
  • 使用树莓派3B+开发智能音乐播放器

    一 功能描述 对麦克风说出歌名后 xff0c 树莓派自动下载对应歌曲的MP3 xff0c 默认播放搜索到的第一首歌曲 二 硬件设备 1 树莓派3B 43 2 sony的ps3 eye麦克风一个 xff08 淘宝20块一个 xff0c 带摄像