开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 151|回复: 4
收起左侧

[易语言模块源码] 百du语音识别之语音交互智能音乐播放器

[复制链接]
发表于 2025-1-7 15:25:42 | 显示全部楼层 |阅读模式   湖南省岳阳市
分享例程
界面截图:
备注说明: -
本帖最后由 2533 于 2025-1-7 15:27 编辑

百du语音识别之人机语音交互智能音乐播放器视频 演示  https://www.bilibili.com/video/BV1gsrSYNEJ6/


[Python] 纯文本查看 复制代码
import requests
import base64
import pyaudio
import wave
import os
import threading
import tkinter as tk
from tkinter import messagebox
import subprocess
import psutil
import pygame

# 初始化 pygame mixer
pygame.mixer.init()

# 组装URL获取token,详见文档
base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"
APIKey = "mjW9Q5ttBUQairQYiqG5PQDp"
SecretKey = "rWNfuHrLrOGIGskbRsmFq2C1SwXsPNMA"

HOST = base_url % (APIKey, SecretKey)

def getToken(host):
    res = requests.get(host)
    return res.json()['access_token']

# 传入语音二进制数据,token
# dev_pid为百du语音识别提供的几种语言选择
def speech2text(speech_data, token, dev_pid=1537):
    FORMAT = 'wav'
    RATE = 16000
    CHANNEL = 1
    CUID = 'wate_play'
    SPEECH = base64.b64encode(speech_data).decode('utf-8')

    data = {
        'format': FORMAT,
        'rate': RATE,
        'channel': CHANNEL,
        'cuid': CUID,
        'len': len(speech_data),
        'speech': SPEECH,
        'token': token,
        'dev_pid': dev_pid
    }
    url = 'https://vop.baidu.com/server_api'
    headers = {'Content-Type': 'application/json'}
    print('正在识别...')
    r = requests.post(url, json=data, headers=headers)
    Result = r.json()
    if 'result' in Result:
        return Result['result'][0]
    else:
        error_code = Result.get('err_no', 'Unknown error code')
        error_message = Result.get('err_msg', 'Unknown error message')
        return f"Error: {error_code} - {error_message}"

def get_audio(filepath):
    CHUNK = 1024         # 定义数据流块
    FORMAT = pyaudio.paInt16  # 量化位数(音量级划分)
    CHANNELS = 1        # 声道数
    RATE = 16000         # 采样率
    RECORD_SECONDS = 5  # 录音秒数
    WAVE_OUTPUT_FILENAME = filepath  # wav文件路径
    p = pyaudio.PyAudio()  # 实例化

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)
    print("*" * 10, "开始录音:请在5秒内输入语音")
    frames = []  # 定义一个列表
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  # 循环,采样率16000 / 1024 * 5
        data = stream.read(CHUNK)  # 读取chunk个字节 保存到data中
        frames.append(data)  # 向列表frames中添加数据data
    print("*" * 10, "录音结束\n")

    stream.stop_stream()
    stream.close()  # 关闭
    p.terminate()  # 终结

    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')  # 打开wav文件创建一个音频对象wf,开始写WAV文件
    wf.setnchannels(CHANNELS)  # 配置声道数
    wf.setsampwidth(p.get_sample_size(FORMAT))  # 配置量化位数
    wf.setframerate(RATE)  # 配置采样率
    wf.writeframes(b''.join(frames))  # 转换为二进制数据写入文件
    wf.close()  # 关闭
    return

def check_disk():
    list_drive = psutil.disk_partitions()  # 找出本地磁盘列表,保存的是结构体对象
    list_disk = []
    for drive in list_drive:
        list_disk.append(drive.device)
    return list_disk

def start_recognition():
    def run_recognition():
        try:
            text_box.delete('1.0', tk.END)  # 清空文本框
            get_audio(in_path)  # 录音

            with open(in_path, 'rb') as f:
                speech_data = f.read()

            res = speech2text(speech_data, token)  # 连接百du语音识别接口,得到识别结果
            text_box.insert(tk.END, f"识别结果:{res}\n")

            # 判断识别结果是否等于“打开酷狗”
            if res == "打开酷狗。":
                run_kugou()
            # 判断识别结果是否等于“关闭酷狗”
            elif res == "关闭酷狗。":
                close_kugou()
            # 判断识别结果是否为歌名
            else:
                play_song(res)
        except Exception as e:
            text_box.insert(tk.END, f"发生错误:{str(e)}\n")

    threading.Thread(target=run_recognition).start()

def run_kugou():
    try:
        # 假设酷狗的可执行文件路径为 "D:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe"
        kugou_path = "D:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe"
        subprocess.Popen(kugou_path)
    except Exception as e:
        text_box.insert(tk.END, f"启动酷狗时发生错误:{str(e)}\n")

def close_kugou():
    try:
        for proc in psutil.process_iter(['pid', 'name']):
            if proc.info['name'] == 'KuGou.exe':
                proc.kill()
                text_box.insert(tk.END, "酷狗已关闭。\n")
                return
        text_box.insert(tk.END, "未找到酷狗进程。\n")
    except Exception as e:
        text_box.insert(tk.END, f"关闭酷狗时发生错误:{str(e)}\n")

def play_song(song_name):
    try:
        # 指定歌曲目录
        music_dir = "D:\\KugouMusic"  # 替换为你的歌曲目录路径
        song_files = [f for f in os.listdir(music_dir) if f.lower().startswith(song_name.lower())]

        if song_files:
            song_path = os.path.join(music_dir, song_files[0])
            pygame.mixer.music.load(song_path)
            pygame.mixer.music.play()
            text_box.insert(tk.END, f"正在播放:{song_files[0]}\n")
        else:
            text_box.insert(tk.END, f"未找到歌曲:{song_name}\n")
    except Exception as e:
        text_box.insert(tk.END, f"播放歌曲时发生错误:{str(e)}\n")

if __name__ == '__main__':
    list_disk = check_disk()  # 检索本地磁盘
    dirname_path = os.path.join(list_disk[0], "voice")  # 设置语音文件存放路径

    if not os.path.exists(dirname_path):
        os.makedirs(dirname_path)

    filename = "voice.wav"  # 定义语音文件名
    in_path = os.path.join(dirname_path, filename)

    token = getToken(HOST)  # 获取Token

    # 创建主窗口
    root = tk.Tk()
    root.title("语音识别")
    root.geometry("400x300")

    # 创建文本框显示识别结果
    text_box = tk.Text(root, height=10, width=50)
    text_box.pack(pady=10)

    # 创建按钮开始录音和识别
    record_button = tk.Button(root, text="开始录音并识别", command=start_recognition)
    record_button.pack(pady=10)

    # 绑定 Enter 键到按钮的命令
    root.bind('<Return>', lambda event: record_button.invoke())

    # 运行主循环
    root.mainloop()



友情提醒:请选择可信度高的模块,勿用未知模块,防止小人在模块内加入木马程序。【发现问题模块请到站务投诉】。

签到天数: 11 天

发表于 5 天前 | 显示全部楼层   四川省成都市
收藏了,谢谢分享!!!
回复 支持 反对

使用道具 举报

发表于 2025-1-11 19:59:53 | 显示全部楼层   四川省成都市
撒水水水水
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 1 天

发表于 2025-1-8 22:21:29 | 显示全部楼层   四川省成都市
学习一下
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2025-1-8 10:08:10 | 显示全部楼层   陕西省汉中市
学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表