Python 实现文本转语音超详细教程!一键生成 MP3 文件!不管你是想做个 “听书工具”,还是给程序加个语音提醒功能,Python 的文本转语音(TTS)都能帮你搞定。今天咱们就用 pyttsx3 这个库,从零开始实现 “文字变声音”,还能直接存成 MP3 文件。全程大白话,代码复制就能跑,新手也能学会!
一、先搞懂基础:为什么选 pyttsx3?在开始之前,先跟你说下为啥选这个库 —— 毕竟 Python 做 TTS 的库不止一个:
有的库(比如 gTTS)需要联网才能用,断网就歇菜;有的库依赖太多,装起来麻烦;而 pyttsx3 是 “离线选手”,不用联网,还能自由调语速、音量,支持 Windows/macOS/Linux,最关键的是:能直接保存成 MP3!对新手来说,这简直是 “傻瓜级工具”,所以咱们就认准它了。
二、准备工作:先把环境搭好要干活,得先把 “工具” 装到位。就两步:装 Python、装 pyttsx3。
1. 装 Python(已装的跳过)去 Python 官网(https://www.python.org/ )下载,选 3.7 以上版本(太老的版本可能有兼容问题);安装时一定要勾上 “Add Python to PATH”(不然后续命令行找不到 Python);装完后验证:打开命令提示符(Win+R 输入 cmd 回车),输入python --version,能显示版本号就说明装好了。2. 装 pyttsx3 库还是在命令提示符里,输入下面这句命令,按回车等着就行:
代码语言:python复制pip install pyttsx3正常情况下,几十秒就装完了。但 Windows 系统可能会出 “小插曲”—— 往下看,专门解决!
三、Windows 专属:解决依赖问题很多人装完 pyttsx3 后,一运行就报错,比如 “找不到 pywin32”“com_error” 之类的。这是因为 Windows 需要一个额外的依赖库:pywin32(用来调用系统的语音引擎)。
解决办法:手动装 pywin32先查自己的 Python 版本和系统位数:命令提示符输入python --version,比如显示 “Python 3.10.11”,就是 3.10 版本;看系统是 32 位还是 64 位:桌面 “此电脑” 右键→属性,就能看到。下载对应版本的 pywin32:去这个网站下载(别担心,是官方可靠源):https://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32找到 “pywin32” 开头的文件,比如你的 Python 是 3.10、64 位系统,就选 “pywin32-227-cp310-none-win_amd64.whl”(cp310 对应 Python3.10,win_amd64 对应 64 位)。安装下载好的文件:打开命令提示符,先切换到下载文件的文件夹(比如下载到桌面,就输入cd Desktop);输入安装命令,格式是pip install 文件名,比如:代码语言:python复制pip install pywin32-227-cp310-none-win_amd64.whl装完再运行 pyttsx3,就不会报错了。四、入门:先跑通一个简单示例环境搭好后,咱们先写个 “Hello World” 级别的代码,感受下文本转语音的效果。
代码示例(复制就能跑)代码语言:python复制# 1. 导入pyttsx3库
import pyttsx3
# 2. 初始化语音引擎(核心工具,所有操作都靠它)
engine = pyttsx3.init()
# 3. 让引擎“说”指定的文字
engine.say("大家好!我是用Python的pyttsx3库做的语音,是不是很神奇?")
# 4. 等待语音说完(如果没有这句,程序会直接结束,听不到声音)
engine.runAndWait()
# 5. 关闭引擎(可选,不写也能运行,但养成好习惯)
engine.stop()逐行解释:第 1 行:把 pyttsx3 库引进来,不然没法用它的功能;第 2 行:init()就是 “启动引擎”,你可以理解成 “打开语音工具的开关”;第 3 行:say()里写要转语音的文字,支持中文哦;第 4 行:runAndWait()是 “等语音说完再往下走”,没这句的话,程序一闪而过,声音还没出来就结束了;第 5 行:stop()关闭引擎,释放资源,不写也能跑,但大型程序里建议加上。运行后,你就能听到电脑在念你写的文字了!是不是很简单?
五、进阶:创建 TextToSpeech 工具类(自由调参数)刚才的简单示例只能 “固定语音、固定语速”,不够灵活。咱们现在创建一个 TextToSpeech 类,把 “列语音、调语速、改音量、存 MP3” 这些功能都封装进去,以后想用直接调用就行。
完整工具类代码代码语言:python复制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}")工具类功能汇总(表格更清晰)方法名
功能描述
关键参数
注意事项
list_available_voices()
列出电脑所有可用语音(中文 / 英文等)
无
用 “序号” 来选择语音
set_voice(voice_index)
设置语音类型
voice_index:语音序号
序号要从列表里找,不能乱输
set_rate(rate)
设置语速
rate:100-300(默认 200)
超过 300 会太快,低于 100 会太慢
set_volume(volume)
设置音量
volume:0.0-1.0(默认 1.0)
0.0 是静音,1.0 是最大声
speak_text(text)
直接朗读文本
text:要朗读的文字
支持中文、英文混合
save_text_to_mp3(text, save_path)
保存文本为 MP3 文件
text:文字;save_path:保存路径
路径必须以.mp3 结尾,要等保存完成
六、实战:用工具类实现 “朗读 + 保存 MP3”光有类不行,咱们得实际用一下,比如 “用中文语音、中等语速、一半音量,朗读一段文字并保存成 MP3”。
实战代码示例代码语言:python复制# 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操作完成!")运行步骤和效果:运行代码后,先会打印出你电脑的语音列表,比如:代码语言:python复制================================
序号 语音ID 语音名称 支持语言
================================
0 HKEY_LOCAL_MACHINE... Microsoft David Desktop en-US
1 HKEY_LOCAL_MACHINE... Microsoft 慧涛 zh-CN
================================
提示:设置语音时,用上面的“序号”即可这时你就知道中文语音的序号是 1,所以set_voice(1)就对了。
然后会朗读那段文字,语速 180,音量 0.7。最后会在 D 盘根目录生成一个叫 “python_tts_demo.mp3” 的文件,打开就能听。七、常见问题和错误(避坑指南)刚用的时候肯定会遇到问题,我把最常见的列出来,教你怎么解决:
1. 运行报错:ModuleNotFoundError: No module named 'pyttsx3'原因:没装 pyttsx3 库,或者装了但 Python 没找到。解决:打开命令提示符,输入pip install pyttsx3重新安装;如果还报错,检查是不是用了多个 Python 版本(比如装了 Python3.8 和 3.10),要给对应版本装:比如用 Python3.10 的 pip,命令是pip3.10 install pyttsx3。2. Windows 报错:pywintypes.com_error: (-2147352567, ' 发生意外。', ...)原因:要么是没装 pywin32 依赖,要么是系统语音引擎损坏了。解决:先按前面的方法装 pywin32;如果还报错,修复系统语音引擎:打开 “控制面板”→“时钟和区域”→“区域”→“管理”→“更改系统区域设置”,选 “中国(中文,中国)”,重启电脑;重启后再试试,一般就能好。3. 保存的 MP3 文件没声音,或者文件大小只有几 KB原因:没调用engine.runAndWait(),保存操作没执行完。解决:保存 MP3 时,一定要在save_to_file()后面加runAndWait(),就像咱们工具类里那样:代码语言:python复制self.engine.save_to_file(text, save_path)
self.engine.runAndWait() # 这句不能少!4. 语速太快 / 太慢,听不懂原因:语速值设得太极端了。解决:把set_rate()的参数设在 150-250 之间,比如 180、200,这个范围最舒服。5. 找不到中文语音,列表里只有英文原因:Windows 系统默认可能没装中文语音包。解决:给 Windows 装中文语音:打开 “设置”→“时间和语言”→“语音”;在 “语音选择” 里,如果没有中文,点 “添加语音”;选择 “中文(中国)” 的语音包(比如 “Microsoft 慧涛”),下载安装;重启 Python,再运行list_available_voices(),就能看到中文语音了。八、面试会问到的问题(加分答案)如果面试时被问到 “Python 怎么实现文本转语音”,别只说 “用 pyttsx3”,要把细节说清楚,才能加分。我整理了常考的问题和回答思路:
1. 面试官:Python 实现文本转语音有哪些库?pyttsx3 相比其他库有什么优势?回答: 常见的库有 3 个:pyttsx3、gTTS、TTS。
pyttsx3 的优势主要是 3 点:
离线可用:不用联网,gTTS 必须联网才能生成语音,断网就用不了;支持多平台:Windows、macOS、Linux 都能用,而且能调用系统自带的语音引擎,不用额外装其他东西;灵活可调:能直接设置语速、音量、语音类型,还能保存成 MP3,其他库要么调不了参数,要么保存麻烦。2. 面试官:pyttsx3 怎么把文本保存成 MP3?需要注意什么?回答: 分两步:
先用engine.save_to_file(text, save_path)设置要保存的文本和路径;再调用engine.runAndWait(),等待保存完成。 注意事项有 2 个:
保存路径必须以.mp3 结尾,不然会报错;一定要加runAndWait(),因为 pyttsx3 的操作是 “异步” 的,没这句的话,保存操作不会执行,文件就会是空的。3. 面试官:如何获取电脑中所有可用的语音类型?用代码举例说明。回答: 用 pyttsx3 的engine.getProperty('voices')就能获取所有语音列表,然后循环遍历打印出来。比如:
代码语言:python复制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)来选择语音。
4. 面试官:pyttsx3 中语速和音量的调整范围是多少?怎么设置?回答: 语速范围是 100-300,默认是 200;音量范围是 0.0-1.0,默认是 1.0。
设置方法用setProperty():
代码语言:python复制import pyttsx3
engine = pyttsx3.init()
# 设置语速为180(比默认慢一点)
engine.setProperty('rate', 180)
# 设置音量为0.7(70%音量)
engine.setProperty('volume', 0.7)语速建议设 150-250,音量设 0.5-0.8,这样听着最舒服。
5. 面试官:Windows 下用 pyttsx3 报错,可能的原因有哪些?怎么解决?回答: 最常见的原因有 2 个:
缺少 pywin32 依赖:解决方法是下载对应 Python 版本的 pywin32 wheel 文件,用 pip 安装;系统语音引擎损坏或区域设置不对:解决方法是在控制面板里把系统区域设置成中文,重启电脑,修复语音引擎;没有对应语言的语音包:解决方法是在 Windows 设置里添加对应的语音包(比如中文语音),然后重启 Python 再用。九、总结到这里,整个教程就结束了。咱们从环境搭建、基础示例,到创建灵活的工具类,再到解决常见问题和面试题,把 pyttsx3 实现文本转语音的知识点都讲透了。
核心要点就 3 个:
环境搭好:Python+pyttsx3+Windows 的 pywin32;工具类封装:把列语音、调参数、存 MP3 都封装好,复用方便;避坑:保存 MP3 要加 runAndWait (),报错先查依赖和语音引擎。现在你可以自己动手试试,比如把小说片段转成 MP3 听,或者给你的 Python 程序加个语音提醒(比如 “程序运行完成啦!”)。有问题的话,回头看看常见问题部分,基本都能解决!