Windows语音模糊点歌MP3播放器技术方案详解
我的学习:利用云服务器语音模糊点歌MP3播放初探
云服务器语音模糊点歌MP3播放器技术方案初探
我正在学习AI编程,这次利用豆包生成这个项目,目前应用在PC端,没有写一句代码。
部署过程要安装很多依赖及模块,每次出现问题就扔给豆包,让它提示解决,跌跌碰碰做了半天,终于做成了这个项目,目的是学习及练手。
要求有云服务器,或者局域网服务器,下一步考虑NAS
一、项目概述
本项目旨在开发一款适配Windows系统的桌面MP3播放器客户端,依托用户云服务器(http://xxx.x.x.x:3002)中root/music目录下的MP3音频资源,集成百度智能云语音识别能力,实现语音实时转文字、模糊语音点歌、常规音乐播放控制等核心功能。
客户端支持自定义配置百度智能云密钥与云服务器HTTP站点地址,兼容主流MP3音频格式,具备上一首、下一首、暂停/播放、随机播放、语音文本实时展示、模糊匹配点歌等完整能力,适配日常桌面音乐播放场景,操作便捷、识别精准、运行稳定。
二、整体架构设计
本系统采用Windows桌面客户端(前端界面+本地逻辑)+ 百度智能云语音识别API + 云服务器资源服务的三层架构,整体轻量化、低耦合,无需复杂部署,客户端直接对接接口与服务器资源。
2.1 架构分层
表现层(Windows客户端界面):提供可视化播放器界面、配置参数输入面板、语音识别文本展示区、播放控制按钮,承载用户所有操作交互。
业务逻辑层(客户端核心逻辑):包含语音采集与上传、百度API鉴权与调用、语音文本解析、歌曲模糊匹配、音乐播放控制、播放队列管理、网络请求处理等核心业务。
资源与接口层:
- 百度智能云语音识别API:提供语音转文字核心能力
- 云服务器HTTP站点(xxx.x.x.x::3002):提供music文件夹下MP3文件的远程访问、资源列表读取、音频流播放能力
2.2 核心流程总览
三、核心技术选型
3.1 Windows客户端开发技术
采用Python + PyQt6开发桌面客户端,优势为开发高效、界面美观、跨Windows版本兼容,且适配音频处理与网络请求,轻量化无冗余。
配套核心库:
- UI界面:PyQt6,实现播放器窗口、按钮、输入框、文本展示、播放进度条等组件
- 音频播放:pygame/pydub,支持MP3解码、播放、暂停、切歌、随机播放
- 语音采集:pyaudio,实时采集麦克风语音音频流
- 网络请求:requests,对接百度智能云API、请求云服务器音乐资源
- 模糊匹配:fuzzywuzzy,实现语音文本与歌曲名称的模糊相似度匹配
3.2 语音识别技术
我使用是百度智能云,注册后选择语音识别
在应用授权处可以看到
基于用户提供的百度智能云语音识别接口实现,固定密钥配置如下(客户端支持界面自定义修改覆盖):
BAIDU_APP_ID = 'xxxxxxx'
BAIDU_API_KEY = 'xxxxxxx'
BAIDU_SECRET_KEY = 'xxxxxxx'
采用百度短语音识别接口,支持实时语音转写,识别完成后即时返回文本内容,展示在客户端界面。
3.3 云服务器资源对接
对接服务器地址:http://xxx.xxx.xx.x:3002
客户端通过HTTP请求访问服务器root/music文件夹,获取所有MP3文件名称、远程播放地址,加载至本地播放列表,支持远程音频流直接播放,无需下载本地。
四、核心功能详细设计
4.1 自定义配置功能
客户端单独设置配置面板,支持用户手动输入、修改参数,配置自动本地保存,重启生效:
- 百度智能云配置:APP_ID、API_KEY、SECRET_KEY,默认填充用户提供密钥,支持自定义替换
- 服务器配置:HTTP站点地址(默认http://xxx.xx.xx.x:3002),支持修改适配服务器变更
- 配置校验:启动时自动校验密钥合法性、服务器连通性,异常弹窗提示
4.2 实时语音识别+文本展示功能
- 语音采集:用户点击“开始识音”按钮后,启动麦克风实时采集音频,支持手动停止
- 云端转写:将采集的音频流编码后上传百度智能云API,完成语音识别
- 文本实时展示:识别过程中分段展示临时文本,识别完成后展示完整语音内容
- 异常处理:无麦克风、网络中断、密钥错误时,实时提示识别失败原因
4.3 语音模糊点歌功能
核心差异化功能,解决用户语音点歌口语化、不精准的问题,流程如下:
- 客户端初始化后,自动请求云服务器music文件夹,拉取全部MP3文件名,生成本地歌曲库列表
- 语音识别完成获取文本后,剔除无效助词、标点,提取核心歌曲关键词
- 通过模糊匹配算法,计算语音文本与所有歌曲名的相似度,筛选相似度最高的歌曲
- 自动加载并播放匹配歌曲,无匹配结果时弹窗提示“未找到对应歌曲”
4.4 完整音乐播放控制功能
实现桌面播放器常规核心操作,兼容手动点击与语音指令控制:
- 基础播放:播放/暂停、进度拖拽调节、音量调节
- 切歌控制:上一首、下一首,顺序遍历播放列表
- 播放模式:支持随机播放、顺序播放两种模式切换
- 队列管理:自动缓存服务器歌曲列表,支持刷新重新加载云端资源
- 状态展示:实时显示当前播放歌曲名称、播放进度、播放模式
4.5 网络与资源适配能力
- 自动重连:服务器连接超时、网络波动时,自动重试请求
- 资源校验:过滤非MP3格式文件,仅加载有效音频资源
- 离线兼容:网络异常时,提示无法加载云端资源,保留本地操作界面
五、项目开发与部署流程
5.1 开发步骤
- 环境搭建:配置Python开发环境,安装PyQt6、pyaudio、requests、fuzzywuzzy等依赖库
- 配置模块开发:实现参数输入、保存、校验功能,对接百度密钥与服务器地址
- 服务器资源对接:开发HTTP请求逻辑,拉取云端music文件夹MP3资源列表
- 语音识别模块开发:实现麦克风采集、百度API对接、语音文本展示
- 模糊点歌模块开发:完成文本解析、相似度匹配、自动点歌播放逻辑
- 播放控制模块开发:实现暂停、切歌、随机播放、进度控制等功能
- UI界面优化:布局调整、按钮交互优化、状态提示美化
- 调试打包:功能全量测试、异常场景测试,打包为Windows可执行exe文件
5.2 部署运行要求
- 服务端:云服务器正常运行,3002端口开放,root/music文件夹存放MP3文件且支持HTTP访问
- 服务器由于我使用Ubuntu系统虚拟环境,在虚拟终端python 运行music.py 服务器端就一个文件music.py 就在网站一级目录
- 客户端:Windows 10/11系统,正常联网、开启麦克风权限
- 我在目录直接终端CMD运行 python main.py 客户端两个文件 main.py config.ini
- 无需额外安装环境,打包后exe文件直接双击运行也可以
六、异常与容错设计
- 密钥异常:百度密钥错误/过期时,语音识别功能禁用,弹窗提示重新配置
- 服务器异常:地址失效、端口不通时,提示“无法连接音乐服务器,请检查地址”
- 语音识别异常:无麦克风、静音、音频采集失败,实时提示设备异常
- 匹配异常:语音文本无对应歌曲、匹配度过低,提示未找到歌曲,不触发错误崩溃
- 播放异常:音频文件损坏、格式不兼容,自动跳过当前歌曲,播放下一首
七、项目优势与拓展方向
7.1 核心优势
- 轻量化:客户端体积小、运行占用资源低,适配所有主流Windows设备
- 高适配:支持自定义密钥与服务器地址,可灵活适配后续服务器、API信息变更
- 实用性强:模糊点歌贴合口语化操作,解决精准点歌门槛高的问题
- 稳定性高:完善的容错机制,避免单点异常导致程序崩溃
7.2 后续拓展方向
- 增加歌曲收藏、播放历史记录功能
- 优化语音识别,支持方言识别、长语音连续点歌
- 增加歌词展示、音效调节、倍速播放功能
- 实现多线程资源加载,提升大型音乐库的加载速度
注:本方案基于用户提供的技术文档整理,内容可能由AI生成,实际开发时请根据具体需求进行调整。
使用效果;
如图显示
在云服务器 运行这三个指令 # 创建虚拟环境
python3 -m venv /www/wwwroot/xxx.xxx.xxx.xxxx_3001/venv
激活虚拟环境
source /www/wwwroot/xxx.xxx.xxx.xxxx_3001/venv/bin/activate
在虚拟环境中安装 Flask
pip install flask flask-cors
然后 运行 python music.py 就可以看到如上图所示
music.py 代码如下
import os
import json
from flask import Flask, request, jsonify, send_from_directory
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # 全局跨域,支持Windows客户端无障碍访问
# 音乐目录配置(优先服务器正式目录,自动兼容本地测试)
MUSIC_DIR = '/www/wwwroot/xxx.xx.xx.xxx_3001/music'
if not os.path.exists(MUSIC_DIR):
MUSIC_DIR = './music'
# 目录不存在则自动创建
if not os.path.exists(MUSIC_DIR):
os.makedirs(MUSIC_DIR)
@app.route('/api/music/list', methods=['GET'])
def get_music_list():
"""获取全部MP3音乐列表(修复歌名显示BUG)"""
try:
# 筛选所有mp3文件
files = [f for f in os.listdir(MUSIC_DIR) if f.lower().endswith('.mp3')]
music_list = []
for f in files:
# 【核心修复】只获取纯文件名,剔除后缀,解决前端展示异常
display_name = os.path.splitext(f)[0]
music_list.append({
'filename': f,
'display_name': display_name
})
return jsonify({'success': True, 'data': music_list})
except Exception as e:
return jsonify({'success': False, 'message': str(e)})
@app.route('/api/music/play/<path:filename>', methods=['GET'])
def play_music(filename):
"""音乐流式播放接口,支持客户端在线播放"""
try:
return send_from_directory(MUSIC_DIR, filename)
except Exception as e:
return jsonify({'success': False, 'message': 'File not found'}), 404
@app.route('/api/status', methods=['GET'])
def status():
"""服务状态检测接口,用于客户端连通性校验"""
try:
music_files = [f for f in os.listdir(MUSIC_DIR) if f.lower().endswith('.mp3')]
return jsonify({
'status': 'running',
'port': 3002,
'music_count': len(music_files)
})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)})
if __name__ == '__main__':
# 正式部署配置:0.0.0.0全网可访问、端口3002、关闭调试模式
app.run(host='0.0.0.0', port=3002, debug=False)
在电脑PC端 文件目录下 运行 python main.py 要求 config.ini 也在一起目录
main.py
import sys
import random
import pyaudio
import wave
import os
import requests
from aip import AipSpeech
from fuzzywuzzy import fuzz, process
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
QListWidget, QPushButton, QLineEdit, QCheckBox, QMessageBox, QListWidgetItem,
QSlider, QTabWidget, QFormLayout, QLabel, QTextEdit)
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl, Qt, QSettings
# ===================== 默认官方密钥+服务器地址(一键可用)=====================
DEFAULT_SERVER_URL = "http://xxx.xxx.xxx.xxx:3002"
DEFAULT_BAIDU_APP_ID = "xxxxxxx"
DEFAULT_BAIDU_API_KEY = "xxxxxxxxxxxxx"
DEFAULT_BAIDU_SECRET_KEY = "xxxxxxxxxxxxxxxx"
# 百度标准录音参数(杜绝3314报错核心)
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_DURATION = 4
class VoiceMusicPlayer(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("智能语音点歌播放器|含最新歌曲列表")
self.resize(850, 680)
# 配置持久化
self.settings = QSettings("VoiceMusicPlayer", "Config")
self.load_global_config()
# 核心变量
self.baidu_client = None
self.music_cache = []
self.newest_music_list = [] # 新增:最新10首缓存
self.current_play_index = -1
self.is_random_play = False
# 播放器
self.player = QMediaPlayer()
self.player.stateChanged.connect(self.on_play_state_changed)
self.player.positionChanged.connect(self.update_progress_bar)
self.player.durationChanged.connect(self.set_total_duration)
self.build_ui()
self.init_baidu_client()
self.refresh_music_list()
def load_global_config(self):
"""加载配置,无配置自动填充官方默认值"""
self.server_url = self.settings.value("server_url", DEFAULT_SERVER_URL)
self.baidu_app_id = self.settings.value("baidu_app_id", DEFAULT_BAIDU_APP_ID)
self.baidu_api_key = self.settings.value("baidu_api_key", DEFAULT_BAIDU_API_KEY)
self.baidu_secret_key = self.settings.value("baidu_secret_key", DEFAULT_BAIDU_SECRET_KEY)
self.similarity_threshold = int(self.settings.value("similarity_threshold", 60))
def init_baidu_client(self):
"""初始化百度语音客户端"""
if all([self.baidu_app_id, self.baidu_api_key, self.baidu_secret_key]):
self.baidu_client = AipSpeech(self.baidu_app_id, self.baidu_api_key, self.baidu_secret_key)
def build_ui(self):
main_widget = QWidget()
self.setCentralWidget(main_widget)
main_layout = QVBoxLayout(main_widget)
self.tab_widget = QTabWidget()
self.player_tab = QWidget()
self.setting_tab = QWidget()
# ========== 播放页面UI(新增最新10首歌曲区域 + 语音识别显示框) ==========
player_layout = QVBoxLayout(self.player_tab)
# 搜索+语音按钮行
search_bar = QHBoxLayout()
self.search_input = QLineEdit()
self.search_input.setPlaceholderText("输入歌名模糊搜索点歌")
self.voice_btn = QPushButton("🎤 语音点歌")
self.voice_btn.clicked.connect(self.voice_point_song)
search_bar.addWidget(self.search_input)
search_bar.addWidget(self.voice_btn)
player_layout.addLayout(search_bar)
# 【新增】语音识别实时显示区域
player_layout.addWidget(QLabel("🗣️ 语音识别结果:"))
self.voice_result_text = QTextEdit()
self.voice_result_text.setReadOnly(True)
self.voice_result_text.setMaximumHeight(80)
self.voice_result_text.setPlaceholderText("语音识别文字将显示在这里...")
player_layout.addWidget(self.voice_result_text)
# 【新增】最新上传10首歌曲区域
player_layout.addWidget(QLabel("🎵 服务器最新上传10首歌曲(点击播放)"))
self.newest_list_widget = QListWidget()
self.newest_list_widget.setMaximumHeight(180)
self.newest_list_widget.itemClicked.connect(self.click_newest_song)
player_layout.addWidget(self.newest_list_widget)
# 全部歌曲列表
player_layout.addWidget(QLabel("📃 全部歌曲列表(双击播放)"))
self.song_list = QListWidget()
self.song_list.doubleClicked.connect(self.play_selected_song)
player_layout.addWidget(self.song_list)
# 进度条
self.progress_slider = QSlider(Qt.Horizontal)
self.progress_slider.sliderMoved.connect(self.seek_play_position)
player_layout.addWidget(self.progress_slider)
# 控制栏(新增刷新按钮)
control_bar = QHBoxLayout()
self.prev_btn = QPushButton("上一首")
self.prev_btn.clicked.connect(self.play_prev)
self.play_btn = QPushButton("播放")
self.play_btn.clicked.connect(self.toggle_play_pause)
self.next_btn = QPushButton("下一首")
self.next_btn.clicked.connect(self.play_next)
self.random_check = QCheckBox("随机播放")
self.random_check.stateChanged.connect(self.toggle_random_mode)
self.refresh_btn = QPushButton("刷新歌曲")
self.refresh_btn.clicked.connect(self.refresh_music_list)
control_bar.addWidget(self.prev_btn)
control_bar.addWidget(self.play_btn)
control_bar.addWidget(self.next_btn)
control_bar.addWidget(self.random_check)
control_bar.addWidget(self.refresh_btn)
player_layout.addLayout(control_bar)
# ========== 设置页面UI ==========
setting_layout = QFormLayout(self.setting_tab)
self.server_input = QLineEdit(self.server_url)
self.appid_input = QLineEdit(self.baidu_app_id)
self.apikey_input = QLineEdit(self.baidu_api_key)
self.secret_input = QLineEdit(self.baidu_secret_key)
self.threshold_input = QLineEdit(str(self.similarity_threshold))
save_btn = QPushButton("保存配置")
save_btn.clicked.connect(self.save_config_to_local)
setting_layout.addRow("服务器地址", self.server_input)
setting_layout.addRow("百度APP_ID", self.appid_input)
setting_layout.addRow("百度API_KEY", self.apikey_input)
setting_layout.addRow("百度SECRET_KEY", self.secret_input)
setting_layout.addRow("匹配相似度阈值", self.threshold_input)
setting_layout.addRow("", save_btn)
self.tab_widget.addTab(self.player_tab, "点歌台")
self.tab_widget.addTab(self.setting_tab, "系统设置")
main_layout.addWidget(self.tab_widget)
def save_config_to_local(self):
self.server_url = self.server_input.text().strip()
self.baidu_app_id = self.appid_input.text().strip()
self.baidu_api_key = self.apikey_input.text().strip()
self.baidu_secret_key = self.secret_input.text().strip()
self.similarity_threshold = int(self.threshold_input.text().strip())
self.settings.setValue("server_url", self.server_url)
self.settings.setValue("baidu_app_id", self.baidu_app_id)
self.settings.setValue("baidu_api_key", self.baidu_api_key)
self.settings.setValue("baidu_secret_key", self.baidu_secret_key)
self.settings.setValue("similarity_threshold", self.similarity_threshold)
self.init_baidu_client()
QMessageBox.information(self, "提示", "配置保存生效!")
self.refresh_music_list()
def refresh_music_list(self):
"""加载歌曲 + 自动截取最新10首 + 修复列表类型报错"""
try:
resp = requests.get(f"{self.server_url}/api/music/list", timeout=5)
if resp.status_code == 200:
data = resp.json()
if data.get("success"):
raw_list = data.get("data", [])
self.music_cache = []
for item in raw_list:
# 修复服务端返回数组歌名BUG,强制转为字符串
display_name = item.get("display_name", "")
if isinstance(display_name, list):
display_name = "".join([str(p) for p in display_name if p])
display_name = str(display_name).strip()
if display_name:
self.music_cache.append({
"filename": item["filename"],
"display_name": display_name
})
# 截取最新10首
self.newest_music_list = self.music_cache[-10:] if len(self.music_cache) > 10 else self.music_cache
self.refresh_newest_ui()
# 刷新全部歌曲列表
self.song_list.clear()
for song in self.music_cache:
QListWidgetItem(song["display_name"], self.song_list)
self.voice_result_text.setText(f"✅ 歌曲加载成功:共{len(self.music_cache)}首|最新展示{len(self.newest_music_list)}首")
except Exception as e:
self.voice_result_text.setText(f"❌ 服务器连接失败:{str(e)}")
def refresh_newest_ui(self):
"""刷新最新歌曲界面"""
self.newest_list_widget.clear()
for song in self.newest_music_list:
item = QListWidgetItem(song["display_name"])
item.setData(Qt.UserRole, song)
self.newest_list_widget.addItem(item)
def click_newest_song(self, item):
"""点击最新列表直接播放"""
song = item.data(Qt.UserRole)
for idx, s in enumerate(self.music_cache):
if s["filename"] == song["filename"]:
self.current_play_index = idx
self.play_song_by_name(s["filename"])
self.voice_result_text.setText(f"✅ 点击播放:{song['display_name']}")
return
# ===================== 【核心修复】彻底解决3314空音频报错 + 实时显示识别文字 =====================
def voice_point_song(self):
if not self.baidu_client:
QMessageBox.warning(self, "提示", "请检查百度配置是否完整!")
return
temp_audio = "temp_voice.wav"
# 清理旧文件
if os.path.exists(temp_audio):
os.remove(temp_audio)
# 实时状态显示
self.voice_result_text.setText("🎤 正在聆听,请清晰说出歌名...")
self.record_audio(temp_audio)
# 关键:检测音频有效长度,拦截空音频(解决3314)
file_size = os.path.getsize(temp_audio)
if file_size < 1500:
os.remove(temp_audio)
self.voice_result_text.setText("❌ 识别失败:未检测到有效人声,请靠近麦克风、大声说话!")
return
self.voice_result_text.setText("🔍 正在解析语音文字...")
text = self.speech_to_text(temp_audio)
os.remove(temp_audio)
if not text:
self.voice_result_text.setText("❌ 识别失败:未识别到有效歌名,请清晰朗读!")
return
# 显示识别到的原始文字
self.voice_result_text.setText(f"✅ 识别成功:{text}")
match_result = self.fuzzy_match_song(text)
if match_result:
filename, score = match_result
self.play_song_by_name(filename)
self.voice_result_text.append(f"🎵 匹配成功,相似度{score}%,正在播放歌曲!")
else:
self.voice_result_text.append(f"❌ 未匹配到对应歌曲")
def record_audio(self, filename, duration=RECORD_DURATION):
"""标准16k单声道录音,适配百度API"""
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
frames = []
for _ in range(0, int(RATE / CHUNK * duration)):
data = stream.read(CHUNK)
frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(filename, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
def speech_to_text(self, audio_file):
"""百度语音识别,容错增强"""
with open(audio_file, 'rb') as f:
audio_data = f.read()
res = self.baidu_client.asr(audio_data, 'wav', 16000, {'dev_pid':1537})
if res['err_no'] == 0:
raw_text = res.get('result', [])
if raw_text:
return raw_text[0].strip("。,!? ")
return None
def fuzzy_match_song(self, query):
"""模糊匹配,兼容口语化点歌"""
if not self.music_cache or not query:
return None
name_map = {item['display_name']: item['filename'] for item in self.music_cache}
match_res = process.extractOne(query, list(name_map.keys()), scorer=fuzz.partial_ratio)
if match_res:
best_name, score = match_res
if score >= self.similarity_threshold:
return name_map[best_name], score
return None
# ========== 播放控制(完全保留你原有逻辑) ==========
def play_selected_song(self):
idx = self.song_list.currentRow()
if 0 <= idx < len(self.music_cache):
self.current_play_index = idx
self.play_song_by_name(self.music_cache[idx]['filename'])
self.voice_result_text.setText(f"✅ 双击播放:{self.music_cache[idx]['display_name']}")
def play_song_by_name(self, filename):
play_url = QUrl(f"{self.server_url}/api/music/play/{filename}")
self.player.setMedia(QMediaContent(play_url))
self.player.play()
def toggle_play_pause(self):
if self.player.state() == QMediaPlayer.PlayingState:
self.player.pause()
self.voice_result_text.append("⏸️ 已暂停播放")
else:
self.player.play()
self.voice_result_text.append("▶️ 继续播放")
def on_play_state_changed(self, state):
self.play_btn.setText("暂停" if state == QMediaPlayer.PlayingState else "播放")
def play_next(self):
if not self.music_cache:
return
if self.is_random_play:
self.current_play_index = random.randint(0, len(self.music_cache)-1)
else:
self.current_play_index = (self.current_play_index + 1) % len(self.music_cache)
song_name = self.music_cache[self.current_play_index]['display_name']
self.play_song_by_name(self.music_cache[self.current_play_index]['filename'])
self.voice_result_text.setText(f"⏭️ 已切换下一首:{song_name}")
def play_prev(self):
if not self.music_cache:
return
if self.is_random_play:
self.current_play_index = random.randint(0, len(self.music_cache)-1)
else:
self.current_play_index = (self.current_play_index - 1) % len(self.music_cache)
song_name = self.music_cache[self.current_play_index]['display_name']
self.play_song_by_name(self.music_cache[self.current_play_index]['filename'])
self.voice_result_text.setText(f"⏮️ 已切换上一首:{song_name}")
def toggle_random_mode(self, state):
self.is_random_play = (state == Qt.Checked)
tip = "✅ 随机播放已开启" if self.is_random_play else "❌ 随机播放已关闭"
self.voice_result_text.setText(tip)
def update_progress_bar(self, pos):
self.progress_slider.setValue(pos)
def set_total_duration(self, duration):
self.progress_slider.setMaximum(duration)
def seek_play_position(self, pos):
self.player.setPosition(pos)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = VoiceMusicPlayer()
win.show()
sys.exit(app.exec_())
还有config.ini
[SERVER]
url = http://xxx.xxx.xxx.xxx:3002
[BAIDU]
app_id = xxxxx
api_key = xxxxxxx
secret_key = xxxxxx
运行 python main.py 后 出现界面
先在界面的设置 填写 你的云服务器或者局域网 MP3的地址 及百度智能云的ID等 匹配度建议30 更加容易

如图多试试 就可以了 按一下语音点歌 然后说话 就可以语音识别 ,不用长按
这个就是我初学AI编程搞的 目的就是学习,下一步 我将改造为嵌入式设备 利用ESP32-S3实现类似功能。
更多推荐



所有评论(0)