AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手源码

 文章的目的为了记录AI应用学习的经历,降低AI的入门难度。同时记录开发流程和要点有些记忆模糊,防止忘记。也希望可以给看到文章的朋友带来一些收获。


相关链接:
AI 应用 图文 解说 (一) -- 百度智能云 实现 语音 聊天-CSDN博客
AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手程序 -CSDN博客

推荐链接:

开源 python 应用 开发(一)python、pip、pyAutogui、python opencv安装-CSDN博客

开源 python 应用 开发(二)基于pyautogui、open cv 视觉识别的工具自动化-CSDN博客

开源 python 应用 开发(三)python语法介绍-CSDN博客

开源 python 应用 开发(四)python文件和系统综合应用-CSDN博客

开源 python 应用 开发(五)python opencv之目标检测-CSDN博客

开源 python 应用 开发(六)网络爬虫-CSDN博客

开源 python 应用 开发(七)数据可视化-CSDN博客

开源 python 应用 开发(八)图片比对-CSDN博客

开源 python 应用 开发(九)目标跟踪-CSDN博客

开源 python 应用 开发(十)音频压缩-CSDN博客

开源 python 应用 开发(十一)AI应用--百度智能云ASR短语音转文本-CSDN博客

开源 python 应用 开发(十二)AI应用--百度智能云Agent聊天-CSDN博客

开源 python 应用 开发(十三)AI应用--百度智能云TTS语音合成-CSDN博客

开源 python 应用 开发(十四)python快速建设网站-CSDN博客

 推荐链接:

开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客

开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-CSDN博客

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-CSDN博客

 推荐链接:

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

​​​​​​开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

主要内容:一个完整的语音AI助手程序,使用Python实现录音、语音识别、AI对话和语音合成的功能。

目录:

1.主要功能

2.源码分析

3.所有源码

4.显示效果

一、主要功能

音频录制:使用sounddevice库录制16kHz单声道音频

语音识别:通过百度语音识别API将音频转换为文本

AI对话:使用AppBuilder AI模型进行智能对话

语音合成:通过百度语音合成API将文本转换为语音

音频播放:使用多种方式播放生成的语音回复

二、源码分析

2.1  类定义和初始化 (VoiceAIAssistant)
初始化录音配置参数(采样率、声道数等)

设置API密钥和认证信息

初始化各个组件(pygame音频、AppBuilder客户端)

2.2  音频处理功能
start_recording(): 开始录制音频

stop_recording(): 停止录制并保存

audio_callback(): 音频流回调函数,收集音频数据

save_to_wav(): 使用wave模块保存WAV文件

2.3  API调用功能
get_access_token(): 获取百度API访问令牌

speech_to_text(): 调用百度语音识别API

text_to_speech(): 调用百度语音合成API

call_ai_model(): 调用AppBuilder AI模型

2.4  辅助功能
play_audio(): 使用多种方式播放音频文件

process_audio(): 完整的音频处理流程

keyboard_listener(): 键盘监听主循环

5. 工具函数
check_dependencies(): 检查所需Python库是否已安装

main(): 程序主函数

三、所有源码

import sounddevice as sd
import numpy as np
import wave
import keyboard
import time
import os
import base64
import urllib
import requests
import json
import pygame
import tempfile
import threading
import subprocess
from pydub import AudioSegment
import appbuilderclass VoiceAIAssistant:def __init__(self):# 录音配置self.is_recording = Falseself.frames = []self.sample_rate = 16000self.channels = 1self.audio_filename = "test.wav"self.response_filename = "response.wav"# API配置 - 请替换为您的实际密钥self.api_key = ""self.secret_key = ""self.app_token = ""self.app_id = ""# 设置环境变量os.environ["APPBUILDER_TOKEN"] = self.app_token# 初始化组件self.init_components()def init_components(self):"""初始化各个组件"""try:# 初始化pygame音频pygame.mixer.init()print("✅ Pygame音频初始化成功")except Exception as e:print(f"❌ Pygame初始化失败: {e}")try:# 初始化AppBuilder客户端self.app_builder_client = appbuilder.AppBuilderClient(self.app_id)self.conversation_id = self.app_builder_client.create_conversation()print("✅ AppBuilder客户端初始化成功")except Exception as e:print(f"❌ AppBuilder初始化失败: {e}")self.app_builder_client = Nonedef start_recording(self):"""开始录制音频"""if self.is_recording:print("已经在录制中...")returnself.is_recording = Trueself.frames = []print("开始录制16K音频... (按空格键停止并保存)")try:# 直接使用16K采样率录制self.stream = sd.InputStream(samplerate=self.sample_rate,channels=self.channels,callback=self.audio_callback,dtype='int16')self.stream.start()return Trueexcept Exception as e:print(f"开始录制失败: {e}")self.is_recording = Falsereturn Falsedef stop_recording(self):"""停止录制并保存"""if not self.is_recording:print("当前没有在录制")return Falseself.is_recording = Falseprint("停止录制,正在保存16K WAV文件...")try:self.stream.stop()self.stream.close()return self.save_to_wav()except Exception as e:print(f"停止录制失败: {e}")return Falsedef audio_callback(self, indata, frames, time, status):"""音频回调函数"""if status:print(f"音频流状态: {status}")if self.is_recording:self.frames.append(indata.copy())def save_to_wav(self):"""使用wave模块保存WAV文件"""if not self.frames:print("没有音频数据可保存")return Falsetry:# 合并所有音频帧audio_data = np.concatenate(self.frames, axis=0)audio_data = audio_data.flatten()# 确保数据在16位范围内audio_data = np.clip(audio_data, -32768, 32767)audio_data = audio_data.astype(np.int16)# 使用wave模块保存with wave.open(self.audio_filename, 'wb') as wav_file:wav_file.setnchannels(self.channels)wav_file.setsampwidth(2)  # 16位 = 2字节wav_file.setframerate(self.sample_rate)wav_file.writeframes(audio_data.tobytes())print(f"✅ 成功保存16K WAV文件: {self.audio_filename}")return Trueexcept Exception as e:print(f"保存文件时出错: {e}")return Falsedef get_file_content_as_base64(self, path, urlencoded=False):"""获取文件base64编码"""try:with open(path, "rb") as f:content = base64.b64encode(f.read()).decode("utf8")if urlencoded:content = urllib.parse.quote_plus(content)return contentexcept Exception as e:print(f"读取文件错误: {e}")return Nonedef get_access_token(self):"""获取百度API访问令牌"""try:url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials", "client_id": self.api_key, "client_secret": self.secret_key}response = requests.post(url, params=params)response.raise_for_status()result = response.json()access_token = result.get("access_token")if access_token:print("✅ 成功获取access_token")return access_tokenelse:print(f"获取access_token失败: {result}")return Noneexcept Exception as e:print(f"获取access_token错误: {e}")return Nonedef speech_to_text(self):"""语音识别:将音频转换为文本"""try:if not os.path.exists(self.audio_filename):print(f"错误:文件不存在 - {self.audio_filename}")return Nonefile_size = os.path.getsize(self.audio_filename)url = "https://vop.baidu.com/server_api"access_token = self.get_access_token()if not access_token:return Nonepayload = json.dumps({"format": "wav","rate": 16000,"channel": 1,"cuid": "voice_assistant_cuid","token": access_token,"speech": self.get_file_content_as_base64(self.audio_filename, False),"len": file_size}, ensure_ascii=False)headers = {'Content-Type': 'application/json','Accept': 'application/json'}response = requests.post(url, headers=headers, data=payload.encode("utf-8"))if response.status_code == 200:result = response.json()if result.get("err_no") == 0:text = result.get("result", [""])[0]print(f"✅ 识别结果: {text}")return textelse:print(f"语音识别失败: {result.get('err_msg')}")return Noneelse:print(f"请求失败,状态码: {response.status_code}")return Noneexcept Exception as e:print(f"语音识别错误: {e}")return Nonedef text_to_speech(self, text):"""文本转语音:将文本转换为音频"""try:url = "https://tsn.baidu.com/text2audio"access_token = self.get_access_token()if not access_token:return Noneencoded_text = urllib.parse.quote(text)params = {'tex': encoded_text,'tok': access_token,'cuid': 'voice_assistant_cuid','ctp': 1,'lan': 'zh','spd': 5,'pit': 5,'vol': 5,'per': 0,'aue': 6  # WAV格式}headers = {'Content-Type': 'application/x-www-form-urlencoded','Accept': 'audio/wav'}response = requests.post(url, data=params, headers=headers)if response.status_code == 200:# 保存音频文件with open(self.response_filename, 'wb') as f:f.write(response.content)print(f"✅ 语音合成完成,保存为: {self.response_filename}")return self.response_filenameelse:print(f"语音合成失败,状态码: {response.status_code}")return Noneexcept Exception as e:print(f"语音合成错误: {e}")return Nonedef call_ai_model(self, text):"""调用AI大模型处理文本"""if not self.app_builder_client:print("❌ AppBuilder客户端未初始化")return "抱歉,AI服务暂时不可用。"try:print(f"🤖 向AI模型提问: {text}")resp = self.app_builder_client.run(self.conversation_id, text)answer = resp.content.answerprint(f"🤖 AI回复: {answer}")return answerexcept Exception as e:print(f"调用AI模型错误: {e}")return "抱歉,我暂时无法处理您的请求。"def play_audio(self, audio_file):"""播放音频文件"""if not os.path.exists(audio_file):print(f"错误:音频文件不存在 - {audio_file}")return Falsetry:# 方法1: 使用winsound播放(最简单)import winsoundprint("🔊 正在播放音频...")winsound.PlaySound(audio_file, winsound.SND_FILENAME)print("✅ 播放完成")return Trueexcept Exception as e:print(f"winsound播放失败: {e}")try:# 方法2: 使用pygame播放pygame.mixer.music.load(audio_file)pygame.mixer.music.play()print("🔊 正在播放音频...")# 等待播放完成while pygame.mixer.music.get_busy():pygame.time.wait(100)print("✅ 播放完成")return Trueexcept Exception as e:print(f"pygame播放失败: {e}")try:# 方法3: 使用系统命令播放if os.name == 'nt':  # Windowsos.startfile(audio_file)else:  # Linux/Macsubprocess.run(['aplay', audio_file])print("✅ 使用系统播放器播放")return Trueexcept Exception as e:print(f"系统播放失败: {e}")return Falsedef process_audio(self):"""完整处理流程:录音->识别->AI->语音合成->播放"""print("=" * 60)print("开始处理音频...")print("=" * 60)# 1. 语音识别print("🎤 正在识别语音...")recognized_text = self.speech_to_text()if not recognized_text:print("❌ 语音识别失败")return False# 2. 调用AI模型print("🧠 正在调用AI模型...")ai_response = self.call_ai_model(recognized_text)# 3. 语音合成print("🔊 正在合成语音...")audio_file = self.text_to_speech(ai_response)if not audio_file:print("❌ 语音合成失败")return False# 4. 播放音频print("▶️ 正在播放回复...")return self.play_audio(audio_file)def keyboard_listener(self):"""键盘监听主循环"""print("=" * 60)print("语音AI助手已启动")print("按空格键开始/停止录制")print("按ESC键退出程序")print("=" * 60)recording_started = Falsewhile True:# 检测空格键if keyboard.is_pressed('space'):if not recording_started:if not self.is_recording:# 开始录制if self.start_recording():print("⏺️ 录制中... (再次按空格停止)")else:# 停止录制并处理if self.stop_recording():# 在新线程中处理音频,避免阻塞键盘监听processing_thread = threading.Thread(target=self.process_audio)processing_thread.daemon = Trueprocessing_thread.start()recording_started = Truetime.sleep(0.5)  # 防抖else:recording_started = False# 检测ESC键退出if keyboard.is_pressed('esc'):if self.is_recording:self.stop_recording()print("👋 程序退出")breaktime.sleep(0.1)def check_dependencies():"""检查所需依赖"""required_libs = ['sounddevice', 'numpy', 'keyboard', 'requests', 'pygame', 'pydub', 'appbuilder']missing_libs = []for lib in required_libs:try:if lib == 'appbuilder':import appbuilderelif lib == 'pydub':from pydub import AudioSegmentelse:__import__(lib)print(f"✅ {lib} 已安装")except ImportError:print(f"❌ {lib} 未安装")missing_libs.append(lib)if missing_libs:print(f"\n请安装缺失的库: pip install {' '.join(missing_libs)}")return Falsereturn Truedef main():"""主函数"""# 检查依赖if not check_dependencies():return# 创建语音助手实例try:assistant = VoiceAIAssistant()# 启动键盘监听assistant.keyboard_listener()except KeyboardInterrupt:print("\n👋 程序被用户中断")except Exception as e:print(f"❌ 程序运行错误: {e}")if __name__ == "__main__":main()

四、使用效果

使用python IDE 运行或双击.py文件,代码会检查所需要的库,如果没有安装,使用pip安装就行。

如果报错 Appbuilder问题,可以进行升级。

pip install --upgrade appbuilder-sdk -i https://mirrors.aliyun.com/pypi/simple/

程序不再报错后,按下空格开始录音,会音频提交到智能云,与AI对话,最后返回合成的语音。音频文件为.wav存放在桌面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97532.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机Python毕业设计推荐:基于Django的博客网站设计与实现【python/大数据/深度学习/机器学习定制】

精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻 💖🔥作者主页:计算机毕设木哥🔥 💖 文章目录 一、项目介绍二、…

当 AI 开始 “筛选” 信息:算法偏见会加剧认知鸿沟吗?如何构建公平的 AI 生态?

AI 筛选信息的现状与原理​在信息爆炸的时代,AI 筛选信息已成为各领域不可或缺的关键技术。在社交媒体平台上,如抖音、小红书等,AI 根据用户的点赞、评论、浏览历史等数据,精准推送用户可能感兴趣的内容,极大提升了用户…

2023年IEEE IOTJ SCI1区TOP,动态环境下无人机目标覆盖任务路径规划,深度解析+性能实测

目录1.摘要2.问题模型3.算法设计4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 无人机(UAV)作为物联网应用的重要工具,正广泛应用于智能农业监测、智能交通监测等领域,并逐渐成为国内外研究热点。然而&#x…

计算机视觉(四):二值化

二值化,就是将图像从彩色或灰度模式转换为只有两种颜色(通常是黑色和白色)的模式。这个过程的本质是设定一个阈值 (Threshold),将图像中所有像素的灰度值与这个阈值进行比较。 基本原理 二值化的核心原理非常简单: 灰度…

(二)设计模式(Command)

文章目录项目地址一、设计模式1.1 Command Design1. 创建命令接口2. 创建支付的Command类3. CommandScheduler4. 使用1.2 Chain of Responsibility1. 接口创建2. 审批人3. 发起审批1.3 State Pattern1. 创建简单的状态机定义动作和状态状态机使用状态机1.x Iterator1.x Observe…

现代C++性能陷阱:std::function的成本、异常处理的真实开销

1. std::function 的成本 std::function 是一个通用的、类型擦除的函数包装器,它非常方便,可以存储和调用任何可调用对象(函数、lambda、函数对象、bind表达式等)。然而,这种灵活性是有代价的。 主要成本来源&#xff…

基于Spark的白酒行业数据分析与可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍一、项目背景与研究意义二、系统整体架构三、系统功能设计四、应用场景与价值五、项目特色与创新点六、总结与展望每文一语有需要本项目的代码或文档以及全部资源,或者部…

织梦会员中心模板调用某个栏目名和栏目下文档的办法

大家在用到织梦dedecms时候,需要在会员中心模板调用栏目的名称和链接,还有某个栏目下的文档要怎么操作呢? 我们都知道,在会员中心模板,直接用dede:type或者dede:arclist标签是不行的,在会员中心调用只能用p…

区块链的法律定位:技术、工具还是资产?

高鹏律师首席数据官,数字经济团队创作AI辅助当我们谈论区块链时,我们在谈论什么?是那串不可篡改的哈希值,是去中心化的信仰图腾,还是藏在代码背后的权利密码?今天,我们不聊技术迭代的炫酷&#…

LeetCode每日一题,2025-8-31

dfs搜索解数独,重点是如何判断当前这位置的board[x][y]是否可以填数字num public class T37 {public static void main(String[] args) {char[][] board new char[][]{{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, …

Linux 进程信号学习笔记:从概念到实操

一、Linux 信号基本概念1.1 生活角度理解信号我们可以把进程比作等待快递的人,信号就像快递:识别信号:就像我们知道快递来了该 怎么处理,进程对信号的识别是内核程序员预先编写的内置特性,即使信号没产生,进…

解决多种类潮湿敏感元器件的多温度、多时长的排潮烘干

铠德科技ESD烘箱针对复杂电路产品的排潮烘干需求,可通过以下技术路径实现多品类元器件的高效兼容处理:多温区独立控制系统采用蜂窝式加热模块阵列,每个0.6m独立温区可设置1℃精度支持同时运行3种不同温度曲线(典型值:8…

obdumper和obloader迁移OceanBase业务库(一):实施手册

obdumper和obloader迁移OceanBase业务库(一):实施手册导出前准备全库(模式)数据导出全库(模式)数据导入导入后检查环境信息:OceanBase v4.3.5单机部署,MySQL租户OBDUMPER…

SQLSugar 快速入门:从基础到实战查询与使用指南

目录 ​编辑 一、SQLSugar 简介 二、SQLSugar 环境搭建 2.1 安装 SQLSugar 2.1.1 通过 Visual Studio NuGet 图形化界面安装 2.1.2 通过 NuGet 命令行安装 2.2 引用 SQLSugar 命名空间 三、SQLSugar 核心初始化配置 3.1 基础初始化(非 IOC 模式&#xff09…

Python与Rust语法对比详解:从入门到精通

Python与Rust语法对比详解:从入门到精通 前言 Python和Rust作为当今最受关注的编程语言,分别代表了动态类型和静态类型语言的典型特征。本文将从语法层面深入对比这两种语言,帮助开发者理解它们的设计理念和使用场景。1. 基础语法结构 1.1 He…

视频加水印_带gif 加动态水印 gif水印 视频浮动水印

如果你有一个视频,你想给它加一个水印,让水印浮动,而且加的还是 GIF 动态图片水印,那么你可以使用这个工具。首先把你的两个文件拖进来,然后点击第三个按钮。加好了,打开看一下,我们看到这个水印…

C# 字符和字符串

原文:C# 字符和字符串_w3cschool 请勿将文章标记为付费!!!!! C#字符和字符串 C#的 char 类型别名 System.Char 类型表示 Unicode 字符。 在单引号中指定char字面值: …

IntelliJ IDEA 反编译JAR包记录

本文记录了使用 IntelliJ IDEA 内置反编译工具对 JAR 包进行反编译的详细步骤,方便日后快速参考和使用。 🛠️ 工具准备 反编译工具使用的是 IntelliJ IDEA 内置的 Java 反编译器,无需额外安装其他工具。 工具路径: /Applications…

KingbaseES JDBC 驱动详解:连接、配置与最佳实践

目录KingbaseES JDBC 驱动详解:连接、配置与最佳实践引言一、JDBC 基础与 KingbaseES 实现1.1 JDBC 技术概述1.2 KingbaseES JDBC 驱动特点二、环境配置与驱动获取2.1 驱动包选择与依赖管理2.2 国密算法支持2.3 驱动版本信息获取三、数据库连接管理3.1 使用 DriverM…

破解 Aspose.Words 24.12,跳过 License 校验,实现 HTML 向 Word/PDF 的转换,附带 Demo。

说明 在Java生态中处理Office文档时,开发人员常面临格式兼容性和功能完整性的挑战。商业组件Aspose以其卓越的文档处理能力成为企业级解决方案之一,支持Word、Excel、PDF等多种格式的精准转换与操作。 请勿用于商业用途,若侵权请联系我。 参考…