引言
本文详细介绍了使用python的pyttsx3库开发文本转语音工具的实战过程。pyttsx3作为离线tts库,支持windows、macos、linux多系统,具有无需网络、响应快、可配置参数等优势。教程从环境准备入手,依次实现基础文本朗读、语速/音量/语音类型调整、本地.txt文件朗读、语音保存为wav文件等功能,最后整合为支持命令行参数的完整工具,并提供参数使用说明、常见问题解决方案及gui界面开发等扩展思路。整体内容循序渐进,代码解释清晰,适合python初学者掌握pyttsx3核心应用并开发本地文本转语音工具。
在日常工作和学习中,我们经常会遇到需要将文本内容转换为语音的场景,比如听小说、读文档、制作语音提示等。今天就带大家用python开发一个简单实用的文本转语音工具,核心用到的库是pyttsx3。与其他在线tts(文本转语音)服务相比,pyttsx3的优势在于离线运行,无需网络连接,响应速度快,而且支持多种语音引擎和参数配置。
本教程将从环境搭建开始,逐步实现文本朗读、语音参数调整、文本文件转语音等功能,最后整合为一个完整的工具。代码解释清晰,适合python初学者和想快速实现tts功能的开发者。
一、工具介绍与核心库解析
1.1 工具功能概述
我们要开发的文本转语音工具将包含以下核心功能:
- 实时朗读输入的文本内容
- 调整语音的语速(快慢)、音量(大小)、语音类型(男/女/中性)
- 支持读取本地文本文件(.txt)并转换为语音
- 将文本转换后的语音保存为wav格式文件
1.2 核心库pyttsx3详解
pyttsx3是python的一个离线文本转语音库,它基于不同操作系统的原生语音引擎工作:
- windows:使用sapi5引擎(系统自带,无需额外安装)
- macos:使用nsspeechsynthesizer引擎(系统自带)
- linux:需要安装espeak引擎(命令:
sudo apt-get install espeak)
pyttsx3的主要特点:
离线运行,无需依赖第三方api;支持多语音引擎切换;可灵活调整语速、音量、语音;支持语音保存为文件。
二、环境准备与依赖安装
2.1 python环境要求
推荐使用python 3.6及以上版本,确保环境变量配置正确。可以通过以下命令检查python版本:
python --version # windows python3 --version # macos/linux
2.2 安装pyttsx3库
使用pip命令直接安装pyttsx3:
pip install pyttsx3

2.3 系统依赖补充(linux用户)
linux系统需要额外安装espeak引擎,否则运行会报错:
sudo apt-get update sudo apt-get install espeak
三、核心功能分步实现
我们将按照“基础朗读 → 参数配置 → 文件处理 → 保存语音”的顺序逐步实现功能,每一步都有完整代码和解释。
3.1 基础功能:文本实时朗读
首先实现最核心的“文本转语音朗读”功能,步骤如下:
- 导入pyttsx3库
- 创建tts引擎实例
- 使用引擎朗读文本
- 等待朗读完成(避免程序提前退出)
代码实现:
import pyttsx3
def text_to_speech_basic(text):
# 创建tts引擎实例
engine = pyttsx3.init()
# 设置要朗读的文本
engine.say(text)
# 等待朗读完成(必须调用,否则语音可能无法输出)
engine.runandwait()
# 测试:朗读一段文本
if __name__ == "__main__":
test_text = "大家好,欢迎学习python文本转语音工具开发,我是用pyttsx3实现的语音。"
text_to_speech_basic(test_text)
代码解释:
pyttsx3.init():初始化tts引擎,根据操作系统自动选择对应的语音引擎。engine.say(text):将文本添加到引擎的朗读队列中(并非立即朗读)。engine.runandwait():执行朗读队列中的任务,直到所有文本朗读完成。
3.2 进阶功能:调整语音参数(语速、音量、语音)
pyttsx3支持灵活调整语音参数,让输出的语音更符合需求。我们主要调整三个参数:
3.2.1 调整语速
语速通过engine.setproperty('rate', 值)设置,默认值约为200(单词/分钟),值越大语速越快。
3.2.2 调整音量
音量通过engine.setproperty('volume', 值)设置,范围为0.0~1.0,默认值约为1.0。
3.2.3 切换语音类型(男/女)
不同操作系统提供的语音包不同,我们可以通过engine.getproperty('voices')获取所有可用语音,再通过engine.setproperty('voice', 语音id)切换。
完整参数配置代码:
import pyttsx3
def text_to_speech_advanced(text, rate=200, volume=1.0, voice_id=0):
engine = pyttsx3.init()
# 1. 调整语速
engine.setproperty('rate', rate) # 建议范围:100~300
# 2. 调整音量
engine.setproperty('volume', volume) # 范围:0.0~1.0
# 3. 切换语音类型
voices = engine.getproperty('voices') # 获取所有可用语音
# 打印所有语音信息(方便选择)
print("可用语音列表:")
for i, voice in enumerate(voices):
print(f"语音id: {i}, 名称: {voice.name}, 语言: {voice.language}")
engine.setproperty('voice', voices[voice_id].id) # 设置指定语音
# 朗读文本
engine.say(text)
engine.runandwait()
# 测试:调整参数朗读
if __name__ == "__main__":
test_text = "我是调整后的语音,语速稍慢,音量适中,使用指定的语音类型。"
# 语速150,音量0.8,语音id1(根据实际可用语音选择)
text_to_speech_advanced(test_text, rate=150, volume=0.8, voice_id=1)
注意:语音id需要根据实际运行时打印的“可用语音列表”选择。例如windows系统可能有“david”(英文男音)、“zira”(英文女音),中文语音需要提前安装对应的语音包。
3.3 扩展功能1:读取本地文本文件并朗读
实现读取本地.txt文件,将文件内容转换为语音。步骤:
- 接收文件路径参数
- 打开并读取文件内容(注意编码格式,推荐utf-8)
- 调用tts引擎朗读文件内容
代码实现:
import pyttsx3
def read_text_file(file_path, rate=200, volume=1.0, voice_id=0):
try:
# 打开并读取文本文件(指定utf-8编码避免中文乱码)
with open(file_path, 'r', encoding='utf-8') as f:
file_content = f.read()
if not file_content:
print("文件内容为空!")
return
# 调用进阶朗读函数
engine = pyttsx3.init()
engine.setproperty('rate', rate)
engine.setproperty('volume', volume)
voices = engine.getproperty('voices')
engine.setproperty('voice', voices[voice_id].id)
print("开始朗读文件内容...")
engine.say(file_content)
engine.runandwait()
print("朗读完成!")
except filenotfounderror:
print(f"错误:文件 {file_path} 不存在!")
except exception as e:
print(f"读取文件失败:{str(e)}")
# 测试:朗读本地test.txt文件
if __name__ == "__main__":
file_path = "test.txt" # 替换为你的文本文件路径
read_text_file(file_path, rate=160, voice_id=0)
3.4 扩展功能2:将语音保存为wav文件
pyttsx3支持将文本转换后的语音保存为wav格式文件,使用engine.save_to_file(text, 文件名)实现。
代码实现:
import pyttsx3
def text_to_wav(text, output_file="output.wav", rate=200, volume=1.0, voice_id=0):
engine = pyttsx3.init()
# 配置语音参数
engine.setproperty('rate', rate)
engine.setproperty('volume', volume)
voices = engine.getproperty('voices')
engine.setproperty('voice', voices[voice_id].id)
# 将文本保存为wav文件
engine.save_to_file(text, output_file)
# 等待保存完成
engine.runandwait()
print(f"语音已保存到:{output_file}")
# 测试:将文本保存为wav文件
if __name__ == "__main__":
test_text = "这是一段保存为wav文件的语音,你可以在输出目录找到它。"
text_to_wav(test_text, output_file="my_voice.wav", rate=180)
注意:pyttsx3默认只支持保存为wav格式,如果需要mp3格式,可以使用pydub库将wav转换为mp3(需额外安装ffmpeg)。
四、完整工具整合与使用说明
将以上功能整合为一个完整的工具,支持命令行参数输入,方便灵活使用。
4.1 完整代码
import pyttsx3
import argparse
def init_engine(rate=200, volume=1.0, voice_id=0):
"""初始化tts引擎并配置参数"""
engine = pyttsx3.init()
engine.setproperty('rate', rate)
engine.setproperty('volume', volume)
voices = engine.getproperty('voices')
engine.setproperty('voice', voices[voice_id].id)
return engine
def text_speak(text, engine):
"""朗读文本"""
engine.say(text)
engine.runandwait()
def file_speak(file_path, engine):
"""朗读文本文件"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
if not content:
print("文件内容为空!")
return
print("开始朗读文件...")
engine.say(content)
engine.runandwait()
print("朗读完成!")
except exception as e:
print(f"文件处理失败:{str(e)}")
def text_to_wav_file(text, output_file, engine):
"""文本转wav文件"""
engine.save_to_file(text, output_file)
engine.runandwait()
print(f"wav文件已保存:{output_file}")
def main():
# 解析命令行参数
parser = argparse.argumentparser(description="python文本转语音工具(pyttsx3)")
parser.add_argument('--text', type=str, help='要朗读的文本内容')
parser.add_argument('--file', type=str, help='要朗读的文本文件路径(.txt)')
parser.add_argument('--output', type=str, help='保存语音的wav文件路径')
parser.add_argument('--rate', type=int, default=200, help='语速(默认200,范围100-300)')
parser.add_argument('--volume', type=float, default=1.0, help='音量(默认1.0,范围0.0-1.0)')
parser.add_argument('--voice', type=int, default=0, help='语音id(默认0,可先运行查看可用id)')
args = parser.parse_args()
# 初始化引擎
engine = init_engine(rate=args.rate, volume=args.volume, voice_id=args.voice)
# 根据参数执行对应功能
if args.text:
if args.output:
text_to_wav_file(args.text, args.output, engine)
else:
text_speak(args.text, engine)
elif args.file:
file_speak(args.file, engine)
else:
print("请指定--text(文本)或--file(文件路径)参数!")
parser.print_help()
if __name__ == "__main__":
main()
4.2 运行效果
python .\simple_wav_tool.py --text "测试" --output test.wav

4.2 工具使用说明
将完整代码保存为text_to_speech.py,通过命令行运行,支持以下参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| –text | 要朗读的文本内容 | python text_to_speech.py --text “你好,python” |
| –file | 文本文件路径(.txt) | python text_to_speech.py --file test.txt |
| –output | 保存wav文件路径 | python text_to_speech.py --text “测试” --output test.wav |
| –rate | 语速(100-300) | python text_to_speech.py --text “测试” --rate 150 |
| –volume | 音量(0.0-1.0) | python text_to_speech.py --text “测试” --volume 0.8 |
| –voice | 语音id(先运行查看可用id) | python text_to_speech.py --text “测试” --voice 1 |
五、常见问题与解决方案
5.1 运行报错“no module named ‘pyttsx3’”
解决方案:确保已正确安装pyttsx3,重新执行pip install pyttsx3。如果是python3,可能需要用pip3 install pyttsx3。
5.2 linux系统报错“could not find libespeak.so”
解决方案:安装espeak引擎,执行命令sudo apt-get install espeak。
5.3 中文朗读乱码或无法朗读中文
解决方案:
- 读取文件时指定编码为utf-8(如代码中
open(file_path, 'r', encoding='utf-8'))。 - 确保系统已安装中文语音包(windows:控制面板→语音识别→文本到语音;macos:系统设置→辅助功能→语音)。
5.4 无法保存为mp3格式
解决方案:pyttsx3不直接支持mp3,可先用本工具保存为wav,再用pydub转换为mp3:
# 安装依赖 pip install pydub # 安装ffmpeg(windows需添加环境变量,linux:sudo apt-get install ffmpeg) from pydub import audiosegment # wav转mp3 wav_file = "output.wav" mp3_file = "output.mp3" audio = audiosegment.from_wav(wav_file) audio.export(mp3_file, format="mp3")
六、工具扩展思路
如果想进一步增强工具功能,可以考虑以下方向:
- 开发gui界面(使用tkinter、pyqt等),让非技术用户也能方便使用。
- 支持批量处理文本文件,一次性将多个.txt文件转为语音。
- 添加语音情感调整(部分语音引擎支持,如微软azure tts,但需在线)。
- 整合剪贴板监听,自动朗读剪贴板中的文本。
七、总结
本教程详细介绍了如何用python的pyttsx3库开发文本转语音工具,从基础的文本朗读到进阶的参数配置、文件处理、语音保存,再到完整工具的整合与使用。pyttsx3作为离线tts库,在响应速度和隐私保护上有明显优势,适合开发本地文本转语音应用。
希望通过本教程,你能掌握pyttsx3的核心用法,并能根据自己的需求扩展工具功能。
以上就是利用python开发一个简单实用的文本转语音工具的详细内容,更多关于python文本转语音工具的资料请关注代码网其它相关文章!
发表评论