文章目录
-
- edge-tts实现
-
- 通用部分-安装依赖
- 生成`不使用标签`的音频
- [生成`使用标签`的音频(有问题 todo)](#生成
使用标签的音频(有问题 todo))
实现tts有多种方式,这里用的是微软edge(浏览器那个公司)的edge-tts。
因为非页面版不支持ssml,所以精确的控制做不到,但是可以实现基本的文本转云因。
edge-tts实现
这里用的是edge-tts来实现的。
通用部分-安装依赖
pip install edge_tts
pip install asyncio
生成不使用标签的音频
代码:
py
import asyncio
import edge_tts
# 定义文本转语音的异步函数
async def text_to_speech(text, output_file="output.mp3", voice="zh-CN-XiaoyiNeural", rate="+0%", volume="+0%"):
"""
将文本转为语音并保存为 MP3 文件
:param text: 要转换的文本内容
:param output_file: 输出音频文件路径
:param voice: 语音音色(支持的音色列表可通过 edge-tts --list-voices 命令查看)
:param rate: 语速(+0% 为默认,+50% 加快,-50% 减慢)
:param volume: 音量(+0% 为默认,范围 -100% 到 +100%)
"""
try:
# 创建 TTS 通信对象
communicate = edge_tts.Communicate(
text=text,
voice=voice,
rate=rate,
volume=volume
)
# 将语音流保存到文件
await communicate.save(output_file)
print(f"语音文件已保存至:{output_file}")
except Exception as e:
print(f"转换失败:{e}")
# 主函数
if __name__ == "__main__":
# 要转换的文本内容
text_content = "你好,这是使用 edge_tts 实现的文本转语音示例,支持自定义音色和语速。"
# 调用异步函数
asyncio.run(text_to_speech(
text=text_content,
output_file="my_voice.mp3",
voice="zh-CN-YunxiNeural", # 云希(男),也可换为 zh-CN-XiaoyiNeural(晓伊,女)
rate="+10%", # 语速加快 10%
volume="+0%" # 音量默认
))
实测没问题,生成了mp3且播放没问题。
生成使用标签的音频(有问题 todo)
代码:
csharp
import asyncio
import edge_tts
async def text_to_speech_with_rhythm(output_file="rhythm_voice.mp3"):
"""
Win11 适配版:带抑扬顿挫的文本转语音(修复 SSML 解析问题)
"""
# 精简 SSML 格式(移除多余换行/空格,确保 Win11 下解析正常)
ssml_text = """
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="zh-CN">
<prosody rate="+5%" pitch="0Hz" volume="0%">你好,</prosody>
<break time="100ms"/>
<prosody rate="-10%" pitch="+8Hz" volume="+5%">这是使用 edge_tts 实现的</prosody>
<break time="80ms"/>
<prosody rate="-15%" pitch="+12Hz" volume="+8%">抑扬顿挫的语音示例,</prosody>
<break time="150ms"/>
<prosody rate="0%" pitch="-2Hz" volume="0%">支持自定义音色、语速和音调。</prosody>
</speak>
"""
# 去除 SSML 文本中的多余空格和换行(关键:避免 Win11 下解析异常)
ssml_text = "".join([line.strip() for line in ssml_text.splitlines() if line.strip()])
try:
# Win11 下强制指定编码和协议,提升兼容性
communicate = edge_tts.Communicate(
text=ssml_text,
voice="zh-CN-XiaoyiNeural", # Win11 自带的晓伊音色,兼容性最好
proxy=None # Win11 无需代理,避免干扰
)
# 保存音频(Win11 下指定绝对路径更稳定,示例用相对路径)
await communicate.save(output_file)
print(f"✅ 语音生成成功!文件路径:{output_file}")
print(f"📌 可直接在 Win11 中双击 {output_file} 播放")
except Exception as e:
print(f"❌ 转换失败:{e}")
# Win11 下常见错误提示
if "Connection" in str(e):
print("💡 建议:检查网络,Win11 需联网调用微软 TTS 服务")
if "Invalid" in str(e):
print("💡 建议:确认 SSML 格式无误,或更换音色(如 zh-CN-YunxiNeural)")
if __name__ == "__main__":
# Win11 下异步运行(兼容 Python 3.8+)
asyncio.run(text_to_speech_with_rhythm())
实测有问题,会连speak标签一起读出来,期待的效果是不读speak标签,只读标签里面的内容。