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

使用树莓派3B+开发智能音乐播放器
2018年07月03日 21:25:13 qq_42044484 阅读数:2397
一、功能描述

对麦克风说出歌名后,树莓派自动下载对应歌曲的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§:
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§:#一次麦克采样+语音识别+音乐下载+自动播放
get_mic_voice_file§
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语音唤醒功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值