
不管你是想做个 “听书工具”,还是给程序加个语音提醒功能,Python 的文本转语音(TTS)都能帮你搞定。今天咱们就用 pyttsx3 这个库,从零开始实现 “文字变声音”,还能直接存成 MP3 文件。全程大白话,代码复制就能跑,新手也能学会!
在开始之前,先跟你说下为啥选这个库 —— 毕竟 Python 做 TTS 的库不止一个:
对新手来说,这简直是 “傻瓜级工具”,所以咱们就认准它了。
要干活,得先把 “工具” 装到位。就两步:装 Python、装 pyttsx3。
python --version,能显示版本号就说明装好了。还是在命令提示符里,输入下面这句命令,按回车等着就行:
pip install pyttsx3正常情况下,几十秒就装完了。但 Windows 系统可能会出 “小插曲”—— 往下看,专门解决!
很多人装完 pyttsx3 后,一运行就报错,比如 “找不到 pywin32”“com_error” 之类的。这是因为 Windows 需要一个额外的依赖库:pywin32(用来调用系统的语音引擎)。
python --version,比如显示 “Python 3.10.11”,就是 3.10 版本;cd Desktop);pip install 文件名,比如:pip install pywin32-227-cp310-none-win_amd64.whl环境搭好后,咱们先写个 “Hello World” 级别的代码,感受下文本转语音的效果。
# 1. 导入pyttsx3库
import pyttsx3
# 2. 初始化语音引擎(核心工具,所有操作都靠它)
engine = pyttsx3.init()
# 3. 让引擎“说”指定的文字
engine.say("大家好!我是用Python的pyttsx3库做的语音,是不是很神奇?")
# 4. 等待语音说完(如果没有这句,程序会直接结束,听不到声音)
engine.runAndWait()
# 5. 关闭引擎(可选,不写也能运行,但养成好习惯)
engine.stop()init()就是 “启动引擎”,你可以理解成 “打开语音工具的开关”;say()里写要转语音的文字,支持中文哦;runAndWait()是 “等语音说完再往下走”,没这句的话,程序一闪而过,声音还没出来就结束了;stop()关闭引擎,释放资源,不写也能跑,但大型程序里建议加上。运行后,你就能听到电脑在念你写的文字了!是不是很简单?
刚才的简单示例只能 “固定语音、固定语速”,不够灵活。咱们现在创建一个 TextToSpeech 类,把 “列语音、调语速、改音量、存 MP3” 这些功能都封装进去,以后想用直接调用就行。
import pyttsx3
class TextToSpeech:
def __init__(self):
"""初始化语音引擎,默认设置"""
# 启动引擎
self.engine = pyttsx3.init()
# 默认语速(范围:100-300,越大越快,默认200)
self.default_rate = 200
# 默认音量(范围:0.0-1.0,越大越响,默认1.0)
self.default_volume = 1.0
# 初始化时设置默认语速和音量
self.set_rate(self.default_rate)
self.set_volume(self.default_volume)
def list_available_voices(self):
"""列出电脑里所有可用的语音类型(比如中文、英文)"""
# 获取所有语音列表
voices = self.engine.getProperty('voices')
# 用表格形式打印,清晰
print("="*80)
print(f"{'序号':<5} {'语音ID':<20} {'语音名称':<30} {'支持语言':<10}")
print("="*80)
for index, voice in enumerate(voices):
# 语音ID:系统识别用的标识
voice_id = voice.id
# 语音名称:比如“Microsoft 慧涛”(中文)、“Microsoft David”(英文)
voice_name = voice.name
# 支持语言:比如zh-CN(中文)、en-US(英文)
voice_lang = voice.language
print(f"{index:<5} {voice_id:<20} {voice_name:<30} {voice_lang:<10}")
print("="*80)
print("提示:设置语音时,用上面的“序号”即可")
def set_voice(self, voice_index):
"""
设置语音类型
:param voice_index: 语音序号(从list_available_voices()里看)
"""
voices = self.engine.getProperty('voices')
# 先判断序号是否合法
if 0 <= voice_index < len(voices):
self.engine.setProperty('voice', voices[voice_index].id)
print(f"已设置语音:{voices[voice_index].name}({voices[voice_index].language})")
else:
print(f"序号不合法!可用序号范围:0-{len(voices)-1}")
def set_rate(self, rate):
"""
设置语速
:param rate: 语速值(范围100-300,默认200,建议别超过300,不然听不懂)
"""
if 100 <= rate <= 300:
self.engine.setProperty('rate', rate)
print(f"已设置语速:{rate}(正常语速建议200)")
else:
print("语速值不合法!请设置100-300之间的数")
def set_volume(self, volume):
"""
设置音量
:param volume: 音量值(范围0.0-1.0,比如0.5是一半音量,1.0是最大)
"""
if 0.0 <= volume <= 1.0:
self.engine.setProperty('volume', volume)
print(f"已设置音量:{volume}(0.0最小,1.0最大)")
else:
print("音量值不合法!请设置0.0-1.0之间的数")
def speak_text(self, text):
"""
朗读文本
:param text: 要朗读的文字(支持中文、英文)
"""
if not text:
print("请输入要朗读的文字!")
return
print(f"正在朗读:{text}")
self.engine.say(text)
self.engine.runAndWait()
def save_text_to_mp3(self, text, save_path):
"""
把文本转成MP3文件保存
:param text: 要转换的文字
:param save_path: 保存路径(比如"D:/test.mp3")
"""
if not text:
print("请输入要转换的文字!")
return
if not save_path.endswith(".mp3"):
print("保存路径必须以.mp3结尾!比如"D:/audio.mp3"")
return
print(f"正在保存MP3:{save_path}")
# 1. 设置要保存的文本
self.engine.save_to_file(text, save_path)
# 2. 等待保存完成(必须加这句,不然文件是空的)
self.engine.runAndWait()
print(f"MP3保存成功!路径:{save_path}")方法名 | 功能描述 | 关键参数 | 注意事项 |
|---|---|---|---|
| 列出电脑所有可用语音(中文 / 英文等) | 无 | 用 “序号” 来选择语音 |
| 设置语音类型 | voice_index:语音序号 | 序号要从列表里找,不能乱输 |
| 设置语速 | rate:100-300(默认 200) | 超过 300 会太快,低于 100 会太慢 |
| 设置音量 | volume:0.0-1.0(默认 1.0) | 0.0 是静音,1.0 是最大声 |
| 直接朗读文本 | text:要朗读的文字 | 支持中文、英文混合 |
| 保存文本为 MP3 文件 | text:文字;save_path:保存路径 | 路径必须以.mp3 结尾,要等保存完成 |
光有类不行,咱们得实际用一下,比如 “用中文语音、中等语速、一半音量,朗读一段文字并保存成 MP3”。
# 1. 导入咱们刚才写的TextToSpeech类(如果在同一个文件里,直接用就行)
# from 你的文件名 import TextToSpeech (如果类在其他文件,要这么导入)
# 2. 创建工具类实例
tts = TextToSpeech()
# 3. 第一步:先看电脑里有哪些语音(找中文语音的序号)
print("=== 电脑可用语音列表 ===")
tts.list_available_voices()
# 4. 第二步:设置参数(比如选中文语音,序号假设是1,具体看你电脑的列表)
tts.set_voice(1) # 这里的1要换成你电脑里中文语音的实际序号
tts.set_rate(180) # 语速180,比默认慢一点,更清晰
tts.set_volume(0.7) # 音量0.7,不吵人
# 5. 第三步:朗读一段文字
print("n=== 开始朗读 ===")
test_text = "Python文本转语音教程:今天我们用pyttsx3库实现了文字转语音,还能保存成MP3文件。这个工具类真好用,以后再也不用手动录音了!"
tts.speak_text(test_text)
# 6. 第四步:把这段文字保存成MP3(保存到D盘根目录)
print("n=== 开始保存MP3 ===")
save_path = "D:/python_tts_demo.mp3" # 注意:路径里的斜杠是"/",不是""
tts.save_text_to_mp3(test_text, save_path)
# 7. 结束后关闭引擎
tts.engine.stop()
print("n操作完成!")================================
序号 语音ID 语音名称 支持语言
================================
0 HKEY_LOCAL_MACHINE... Microsoft David Desktop en-US
1 HKEY_LOCAL_MACHINE... Microsoft 慧涛 zh-CN
================================
提示:设置语音时,用上面的“序号”即可这时你就知道中文语音的序号是 1,所以set_voice(1)就对了。
刚用的时候肯定会遇到问题,我把最常见的列出来,教你怎么解决:
pip install pyttsx3重新安装;pip3.10 install pyttsx3。engine.runAndWait(),保存操作没执行完。save_to_file()后面加runAndWait(),就像咱们工具类里那样:self.engine.save_to_file(text, save_path)
self.engine.runAndWait() # 这句不能少!set_rate()的参数设在 150-250 之间,比如 180、200,这个范围最舒服。list_available_voices(),就能看到中文语音了。如果面试时被问到 “Python 怎么实现文本转语音”,别只说 “用 pyttsx3”,要把细节说清楚,才能加分。我整理了常考的问题和回答思路:
常见的库有 3 个:pyttsx3、gTTS、TTS。
pyttsx3 的优势主要是 3 点:
分两步:
engine.save_to_file(text, save_path)设置要保存的文本和路径;engine.runAndWait(),等待保存完成。注意事项有 2 个:
runAndWait(),因为 pyttsx3 的操作是 “异步” 的,没这句的话,保存操作不会执行,文件就会是空的。 用 pyttsx3 的engine.getProperty('voices')就能获取所有语音列表,然后循环遍历打印出来。比如:
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for index, voice in enumerate(voices):
print(f"序号:{index},名称:{voice.name},语言:{voice.language}")这样就能看到每个语音的序号、名称和支持的语言,然后用engine.setProperty('voice', voices[序号].id)来选择语音。
语速范围是 100-300,默认是 200;音量范围是 0.0-1.0,默认是 1.0。
设置方法用setProperty():
import pyttsx3
engine = pyttsx3.init()
# 设置语速为180(比默认慢一点)
engine.setProperty('rate', 180)
# 设置音量为0.7(70%音量)
engine.setProperty('volume', 0.7)语速建议设 150-250,音量设 0.5-0.8,这样听着最舒服。
最常见的原因有 2 个:
到这里,整个教程就结束了。咱们从环境搭建、基础示例,到创建灵活的工具类,再到解决常见问题和面试题,把 pyttsx3 实现文本转语音的知识点都讲透了。
核心要点就 3 个:
现在你可以自己动手试试,比如把小说片段转成 MP3 听,或者给你的 Python 程序加个语音提醒(比如 “程序运行完成啦!”)。有问题的话,回头看看常见问题部分,基本都能解决!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。