import ctypes
import sys
from asyncio import run
from operator import mod
from pprint import pprint
import threading
import requests
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import QTimer, QCoreApplication
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QWidget
from api import getCaptcha, loginCaptcha, music_list
from player import VlcPlayer
from record import ASR as listenASR
from gesture import gesture_recognition
from ui.loginDialog import Ui_Dialog as Ui_LoginDialog
from ui.ui import Ui_MainWindow
# 主窗口类
class myWindow(Ui_MainWindow):
def __init__(self, Dialog):
self.gestureThread = None
super().setupUi(Dialog)
self.musicResultsList = [] # 搜索结果
self.currentPlaying = -1 # 正在播放
self.currentPosition = 0 # 播放列表控件中的位置
self.volume = 100 # 音量
self.musicPlaylists = [] # 播放列表
# 实例化VLC播放器
self.mediaPlayer = VlcPlayer()
self.mediaPlayer.set_volume(self.volume)
# 实例化登录对话框
self.loginDialog = LoginDialog()
# 播放列表操作按钮点击事件监听
self.clearList.clicked.connect(self.clearPlayList)
self.deleteListItem.clicked.connect(self.deletePlayListItem)
# 媒体控制按钮点击事件监听
self.playbutton.clicked.connect(self.playCurrentMusic)
self.prebutton.clicked.connect(self.playPreMusic)
self.nextbutton.clicked.connect(self.playNextMusic)
self.pushButton.clicked.connect(self.jumpNext5s)
self.pushButton_2.clicked.connect(self.jumpPre5s)
# 添加到播放列表按钮点击事件监听
self.addToList.clicked.connect(self.addToMusicPlaylists)
self.searchMusicBtn.clicked.connect(self.searchMusicName)
# 登录与关闭按钮
self.loginBtn.clicked.connect(self.showDialog)
self.closeBtn.clicked.connect(QCoreApplication.instance().quit)
# 打开手势按钮
self.gestureBtn.clicked.connect(self.gestureChanged)
# 每100毫秒刷新进度条
progressBar_Slot = QTimer(MainWindow)
progressBar_Slot.timeout.connect(self.reloadProgressBar)
progressBar_Slot.start(100)
# 静音按钮
self.slienceBtn.clicked.connect(self.setSilence)
# 音量滑块设置
self.volumeValue.setMinimum(0)
self.volumeValue.setMaximum(100)
self.volumeValue.setValue(100)
# 音量滑块变动信号监听
self.volumeValue.valueChanged.connect(self.volumeChanged)
def volumeChanged(self):
self.volume = self.volumeValue.value()
self.mediaPlayer.set_volume(self.volume)
def setSilence(self):
self.volume = 0
self.volumeValue.setValue(self.volume)
self.mediaPlayer.set_volume(self.volume)
def gestureChanged(self):
if self.gestureBtn.text() == "打开手势":
print("### 打开手势操作 ###")
self.gestureBtn.setText("关闭手势")
self.gestureThread = gestureThread()
self.gestureThread.start()
else:
print("### 关闭手势操作 ###")
self.gestureThread.setStopFlag()
self.gestureBtn.setText("打开手势")
def reloadProgressBar(self):
if self.mediaPlayer.get_state() == 1:
wholeTime = self.mediaPlayer.get_length() / 1000
nowTime = self.mediaPlayer.get_time() / 1000
nowMin = int(nowTime / 60)
nowSec = int(mod(nowTime, 60))
wholeMin = int(wholeTime / 60)
wholeSec = int(mod(wholeTime, 60))
position = self.mediaPlayer.get_position()
self.musicProgress.setValue(int(position * 100))
self.currentPosition = self.mediaPlayer.get_position()
self.label_7.setText(
str(nowMin) + ":" + str(nowSec).zfill(2) + "/" + str(wholeMin) + ":" + str(wholeSec).zfill(2))
if self.mediaPlayer.get_length() == self.mediaPlayer.get_time():
self.playNextMusic()
def reloadPlayList(self):
self.list.clear()
for each in self.musicPlaylists:
tmpStr = each['name'] + '-' + each['singer']
self.list.addItem(tmpStr)
def addItemToResults(self):
# 清除搜索列表
self.results.clear()
for each in self.musicResultsList:
tmpStr = each['name'] + '-' + each['singer']
item = QtWidgets.QListWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setText(tmpStr)
self.results.addItem(item)
def addToMusicPlaylists(self):
# 将勾选的的搜索结果添加到播放队列中
for i in range(self.results.count()):
if self.results.item(i).checkState() == 2:
self.musicPlaylists.append(self.musicResultsList[i])
self.results.item(i).setCheckState(QtCore.Qt.Unchecked)
self.reloadPlayList()
def showDialog(self):
self.loginDialog.show()
def searchMusicName(self):
name = listenASR()
print("识别到的音乐名", name)
result = music_list(name)
# 将搜索结果加入 musicResultsList
if name != "3307":
self.musicResultsList = result
myWindowObj.addItemToResults()
else:
self.nicknameLabel.setText("识别失败")
def playCurrentMusic(self):
if self.list.count() > 0:
if self.currentPlaying == -1 or self.currentPlaying >= self.list.count():
self.currentPlaying = 0 # 超出范围,跳到第一首
else:
self.currentPlaying = -1
if self.currentPlaying != -1:
if self.mediaPlayer.get_state() == 0:
self.mediaPlayer.play()
elif self.mediaPlayer.get_state() == 1:
self.mediaPlayer.pause()
else:
url = self.musicPlaylists[self.currentPlaying]['picurl']
res = requests.get(url)
img = QImage.fromData(res.content)
self.label_5.setPixmap(QPixmap.fromImage(img))
self.label_3.setText(self.musicPlaylists[self.currentPlaying]['name'])
self.artist.setText(self.musicPlaylists[self.currentPlaying]['singer'])
self.mediaPlayer.set_uri(self.musicPlaylists[self.currentPlaying]['song_url'])
self.mediaPlayer.play()
def playPreMusic(self):
if self.currentPlaying != -1:
self.mediaPlayer.release()
self.currentPlaying = mod(self.currentPlaying + self.list.count() - 1,
self.list.count()) # 上一首,如果没有上一首就是最后一首,循环
self.mediaPlayer = VlcPlayer()
self.mediaPlayer.set_volume(self.volume)
# self.mediaPlayer.set_uri(self.musicPlaylists[self.currentPlaying]['song_url'])
self.playCurrentMusic()
if self.currentPlaying != -1:
url = self.musicPlaylists[self.currentPlaying]['picurl']
res = requests.get(url)
img = QImage.fromData(res.content)
self.label_5.setPixmap(QPixmap.fromImage(img))
self.label_3.setText(self.musicPlaylists[self.currentPlaying]['name'])
self.artist.setText(self.musicPlaylists[self.currentPlaying]['singer'])
def playNextMusic(self):
if self.currentPlaying != -1:
self.mediaPlayer.release()
self.currentPlaying = mod(self.currentPlaying + self.list.count() + 1, self.list.count()) # 同理
# self.mediaPlayer.set_uri(self.musicPlaylists[self.currentPlaying]['song_url'])
self.mediaPlayer = VlcPlayer()
self.mediaPlayer.set_volume(self.volume)
self.playCurrentMusic()
if self.currentPlaying != -1:
url = self.
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 基于树莓派+百度云网易云API实现家庭桌面语音点歌台python源码+项目说明.zip 本项目通过树莓派Raspberry Pi、摄像头、USB麦克风、HDMI显示屏,来实现家庭点歌台的实现,可以实现对歌曲的播放暂停以及切换歌曲还有快进快退的操作,并在此基础上嵌入了语音识别搜索歌曲功能,另外还加入了手势识别,可以让使用者隔空进行对播放的操作。并且配备了精美简洁的GUI界面,可以让使用者触屏操作,方便使用者,并给予实时的反馈。 硬件模块 - 树莓派Raspberry Pi - 摄像头 - USB麦克风 - HDMI显示屏(800*400) 运行环境 ```shell # python库 pip install baidu-aip pip install PyQt5 pip install PyAudio pip install python-vlc pip install requests # vlc sudo apt install vlc ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于树莓派+百度云网易云API实现家庭桌面语音点歌台python源码+项目说明.zip (36个子文件)
项目说明.md 766B
assets
暂停.png 3KB
右.png 790B
播放.png 3KB
tmp.jpg 1.45MB
左.png 755B
album.png 1.9MB
音乐.svg 828B
快退.png 4KB
快进.png 4KB
绿色 - 陈雪凝.mp3 10.36MB
快进png 4KB
player.py 2KB
output.wav 156KB
.idea
.name 10B
MusicTable.iml 399B
vcs.xml 180B
misc.xml 199B
inspectionProfiles
Project_Default.xml 2KB
profiles_settings.xml 174B
modules.xml 272B
.gitignore 182B
api.py 2KB
record.py 4KB
window.py 13KB
gesture.py 2KB
__pycache__
api.cpython-310.pyc 2KB
record.cpython-310.pyc 2KB
player.cpython-310.pyc 3KB
gesture.cpython-310.pyc 2KB
ui
loginDialog.ui 6KB
main.ui 10KB
loginDialog.py 5KB
__pycache__
loginDialog.cpython-310.pyc 3KB
ui.cpython-310.pyc 6KB
ui.py 10KB
共 36 条
- 1
资源评论
Make程序设计
- 粉丝: 6814
- 资源: 3575
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功