AI数字人入门系列002:百度在线TTS接入,让数字人说话更自然

大家好,我是人入入让人说工程师阿凯。上一篇我们实现了极简版AI数字人,门系核心用的列百是pyttsx3离线文字转语音(TTS),但很多朋友反馈“中文语音不自然”“没有多样的度线发音人选择”。今天是话更系列第2篇,我们就解决这个问题——接入百度智能云在线TTS,数字数字让数字人拥有更流畅、人入入让人说更多样的门系中文语音能力。
先简单对比下离线TTS和在线TTS的列百核心差异:离线TTS(如pyttsx3)无需联网,但语音自然度低、度线发音人少;在线TTS(如百度、话更阿里、数字数字腾讯)依赖网络,人入入让人说却能提供接近真人的门系语音效果,还支持情感语音、方言等,更适合商业化数字人场景。今天我们选百度智能云TTS,原因很简单:免费额度充足(新用户有100万次免费调用)、接入流程简单、中文语音效果优质。
核心目标:替换上一篇的离线TTS模块,保留虚拟形象显示功能,实现“文字→百度在线TTS合成语音→播放语音+显示虚拟形象”的完整流程。话不多说,直接上实操步骤。
一、前置准备:获取百度智能云TTS密钥(关键步骤)
要使用百度在线TTS,首先需要注册百度智能云账号并创建应用,获取API密钥(AK)和Secret Key(SK),步骤如下:
1. 打开百度智能云官网(https://cloud.baidu.com/),注册并登录账号(支持手机号快速注册);
2. 搜索“语音技术”,进入语音技术产品页面,点击“立即使用”进入控制台;
3. 在控制台左侧导航栏选择“应用管理→创建应用”,填写应用名称(如“AI数字人TTS”),应用类型选“语音合成”,其他信息按需填写,点击“创建”;
4. 应用创建成功后,在应用列表中找到刚创建的应用,复制“API Key”和“Secret Key”,后续代码会用到(这两个密钥要妥善保存,不要泄露)。
二、环境准备(补充依赖库)
上一篇我们已经安装了opencv-python、numpy,这一篇需要额外安装百度智能云SDK和音频播放库,命令行输入以下指令:
pip install baidu-aip # 百度智能云Python SDK pip install playsound # 音频播放库(支持mp3格式) pip install mutagen # 辅助处理音频文件(解决playsound兼容问题)温馨提示:如果安装playsound后报错,可尝试安装指定版本:pip install playsound==1.2.2
三、完整代码(接入百度TTS+虚拟形象显示)
代码在第1篇的基础上修改,核心替换了TTS模块,保留了虚拟形象显示逻辑,带详细注释,新手可直接复制使用:
# 导入依赖库 from aip import AipSpeech # 百度TTS SDK import cv2 import numpy as np from playsound import playsound import os # 1. 配置百度TTS参数(替换成你的AK和SK) APP_ID = 你的APP_ID # 第一步创建应用时的APP_ID API_KEY = 你的API_KEY # 复制的API Key SECRET_KEY = 你的SECRET_KEY # 复制的Secret Key # 初始化百度TTS客户端 client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 2. 调用百度TTS合成语音(保存为mp3文件) def baidu_tts(text, output_file=digital_human_voice.mp3): # 调用百度API合成语音 # 参数说明: # tex:要合成的文本(支持中文,长度≤1024字) # lang:语言(zh为中文,en为英文) # ctp:客户端类型(1为web端) # per:发音人选择(0-女声,1-男声,3-情感女声,4-情感男声,5-少儿声) result = client.synthesis( text=text, lang=zh, ctp=1, per=3 # 这里选情感女声,可根据需求修改 ) # 处理合成结果 if not isinstance(result, dict): # 合成成功(失败会返回字典) with open(output_file, wb) as f: f.write(result) print(f"语音合成成功,已保存为{ output_file}") return output_file else: print(f"语音合成失败:{ result[err_msg]}") return None # 3. 播放语音并同步显示虚拟形象(优化版) def run_digital_human_with_baidu_tts(text, avatar_path): # 第一步:合成语音 voice_file = baidu_tts(text) if voice_file is None: # 语音合成失败则直接退出 return # 第二步:读取并处理虚拟形象图片 avatar = cv2.imread(avatar_path) if avatar is None: print("错误:未找到虚拟形象图片,请检查路径!") os.remove(voice_file) # 合成的语音文件删除 return # 调整图片大小(适配屏幕) avatar = cv2.resize(avatar, (640, 960)) # 第三步:同步播放语音和显示虚拟形象 print(f"数字人发言:{ text}") # 启动线程播放语音(避免播放时画面卡顿) import threading play_thread = threading.Thread(target=playsound, args=(voice_file,)) play_thread.start() # 循环显示虚拟形象,语音播放完或按ESC键退出 while play_thread.is_alive(): # 只要语音还在播放,就显示图片 cv2.imshow(百度TTS版AI数字人, avatar) if cv2.waitKey(1) & 0xFF == 27: # 按ESC键强制退出 break # 释放资源 cv2.destroyAllWindows() os.remove(voice_file) # 删除临时语音文件,节省空间 # 4. 主函数(程序入口) if __name__ == "__main__": # 数字人要讲的话(支持更长文本,百度TTS单段≤1024字) speak_text = "大家好,我现在用的是百度在线TTS语音。相比离线语音,我的发音更自然,还能带有情感哦。后续我们还会实现唇形同步,让我说话更逼真。" # 虚拟形象图片路径(和上一篇保持一致,无需重新准备) avatar_path = "avatar.jpg" # 运行数字人 run_digital_human_with_baidu_tts(speak_text, avatar_path)四、关键说明与问题解决
1. 核心优化点解析:
- 发音人可选:代码中per参数设为3(情感女声),还可改为0(普通女声)、1(普通男声)、4(情感男声)、5(少儿声),不同发音人风格差异明显,大家可自行测试;
- 避免卡顿:用多线程分离语音播放和画面显示,解决了上一篇“先播放语音再显示画面”的不同步问题;
- 临时文件清理:合成的语音文件播放完后自动删除,避免占用本地空间。
2. 常见问题解决:
- 密钥错误:提示“invalid api key”,检查APP_ID、API_KEY、SECRET_KEY是否复制正确,确保没有多余空格;
- 语音播放失败:若提示“no module named win32api”,安装依赖:pip install pywin32;Mac/Linux用户若playsound兼容问题无法解决,可替换为simpleaudio库(pip install simpleaudio),并修改播放语音的代码为simpleaudio.play_buffer;
- 调用额度不足:新用户有100万次免费调用,足够测试使用;若额度用完,可切换到阿里、腾讯等其他平台的在线TTS(后续可能会出对应教程)。
五、系列预告(第3篇核心内容)
解决了语音自然度问题后,下一篇我们将攻克“唇形同步”——让数字人的嘴唇动作和语音完美匹配。核心思路是通过语音节奏分析,驱动虚拟形象的嘴唇做出“啊、哦、额”等对应动作,让数字人说话更有代入感。
今天的内容就到这里,重点是帮大家掌握在线TTS的接入逻辑,这是AI数字人走向“逼真”的关键一步。如果运行代码时遇到任何问题,欢迎在评论区留言,我会第一时间回复。记得关注专栏,下一篇我们继续优化数字人,实现唇形同步!
本文地址:https://www.45854.cn/news/3e799989.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。