文章目录
- 一、pyttsx3
-
- 0、简介
- 1、基础文本转语音(入门用法)
- 2、自定义语速、音量(常用配置)
- [3、切换语音类型(男声 / 女声)](#3、切换语音类型(男声 / 女声))
- 4、中断正在朗读的语音(交互场景)
- [5、批量朗读文件中的文本(读取文件 + 语音朗读)](#5、批量朗读文件中的文本(读取文件 + 语音朗读))
- 6、将语音保存为音频文件(扩展用法)
一、pyttsx3
0、简介
文档:https://pypi.ac.cn/project/pyttsx3/
pyttsx3 是 Python 轻量级的离线文本转语音(TTS, Text-to-Speech) 库,区别于 gTTS(需要联网),它直接调用操作系统内置的语音引擎,无需网络即可实现文本转语音,响应速度快,且支持跨平台(Windows、macOS、Linux)。
bash
# 基础安装(Windows 直接可用,Linux/macOS 需额外依赖)
pip install pyttsx3
# Linux:需安装 espeak 和 libespeak1
sudo apt-get install espeak libespeak1
# macOS:若语音异常,可安装 pyobjc
pip install pyobjc
1、基础文本转语音(入门用法)
py
import pyttsx3
# 1. 初始化语音引擎
engine = pyttsx3.init()
# 2. 设置要朗读的文本(支持中文,Windows 自带中文语音包)
text = "你好,我是pyttsx3库,这是基础的文本转语音示例。"
# 3. 执行朗读(将文本加入朗读队列)(可多次调用,按顺序朗读)
engine.say(text)
# 4. 等待朗读完成(必须调用,否则程序会直接结束,无语音输出)
engine.runAndWait()
# 5. 释放引擎资源(可选,建议在程序结束时调用)
engine.stop()
2、自定义语速、音量(常用配置)
py
import pyttsx3
# 初始化引擎
engine = pyttsx3.init()
# ========== 1. 调整语速 ==========
# 获取当前语速(默认约200词/分钟,值越小越慢)
# getProperty(key):获取引擎属性,常用 key 包括 rate(语速)、volume(音量)、voices(语音列表);
current_rate = engine.getProperty('rate')
print(f"当前语速:{current_rate}")
# 设置新语速(建议范围:100-300)
# setProperty(key, value):设置引擎属性,音量值必须在 0.0-1.0 之间,语速值无严格上限,但建议在 100-300 之间。
engine.setProperty('rate', 150) # 放慢语速
# ========== 2. 调整音量 ==========
# 获取当前音量(范围0.0-1.0,默认1.0)
current_volume = engine.getProperty('volume')
print(f"当前音量:{current_volume}")
# 设置新音量(0.8表示80%音量)
engine.setProperty('volume', 0.8)
# 朗读文本
text = "我现在的语速是150词/分钟,音量是80%。"
engine.say(text)
engine.runAndWait()
engine.stop()
3、切换语音类型(男声 / 女声)
Windows 系统中,中文语音包通常名称包含 "慧慧""晓晓" 等,语言代码为 zh-CN;
若找不到中文语音,可在 Windows 控制面板的 "语音识别" 中安装中文语音包。
py
import pyttsx3
engine = pyttsx3.init()
# 1. 获取所有可用的语音列表
# voices 是一个列表,每个元素是语音对象,包含 id(唯一标识)、name(名称)、language(语言)等属性;
voices = engine.getProperty('voices')
print("可用的语音包列表:")
for idx, voice in enumerate(voices):
print(f"序号:{idx},名称:{voice.name},语言:{voice.languages}")
# 2. 切换语音(以Windows为例,通常0是英文男声,1是中文女声)
engine.setProperty('voice', voices[1].id) # 切换到中文女声
# 3. 朗读中文文本
engine.say("你好,我是中文女声,现在切换了语音类型。")
engine.runAndWait()
# (可选)切换回英文男声
engine.setProperty('voice', voices[0].id)
engine.say("Hello, I am English male voice.")
engine.runAndWait()
engine.stop()
4、中断正在朗读的语音(交互场景)
py
import pyttsx3
import time
import threading
# 初始化引擎
engine = pyttsx3.init()
engine.setProperty('rate', 100) # 放慢语速,方便测试中断
# 定义朗读函数
def read_long_text():
long_text = "这是一段很长的文本,用于测试中断功能。我会慢慢朗读,你可以在朗读过程中触发中断。" * 3
engine.say(long_text)
engine.runAndWait()
# 启动朗读线程(避免阻塞主线程)
read_thread = threading.Thread(target=read_long_text)
read_thread.start()
# 等待3秒后中断朗读
time.sleep(3)
print("正在中断朗读...")
engine.stop() # 中断当前朗读
# 等待线程结束
read_thread.join()
print("朗读已中断")
5、批量朗读文件中的文本(读取文件 + 语音朗读)
py
import pyttsx3
def read_text_from_file(file_path):
# 初始化引擎
engine = pyttsx3.init()
engine.setProperty('rate', 160)
engine.setProperty('volume', 0.9)
try:
# 读取文件内容(指定编码为utf-8,避免中文乱码)
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 分段朗读(避免文本过长导致卡顿)
paragraphs = content.split('\n') # 按换行符分段
for para in paragraphs:
if para.strip(): # 跳过空行
engine.say(para)
engine.runAndWait()
except FileNotFoundError:
print(f"错误:未找到文件 {file_path}")
except Exception as e:
print(f"读取文件出错:{e}")
finally:
engine.stop()
# 调用函数,读取并朗读txt文件
if __name__ == "__main__":
read_text_from_file("test.txt") # 确保当前目录有test.txt文件,且内容为中文/英文
6、将语音保存为音频文件(扩展用法)
pyttsx3 本身不支持直接保存音频,但可通过 Windows 自带的 SAPI5 实现(最简便,仅适用于 Windows):
py
import pyttsx3
from comtypes.client import CreateObject # 需要安装:pip install comtypes
def text_to_audio(text, output_path):
# 初始化SAPI5语音引擎
speaker = CreateObject("SAPI.SpVoice")
# 初始化音频流
stream = CreateObject("SAPI.SpFileStream")
# 设置输出文件格式(WAV格式)
stream.Open(output_path, 3) # 3 = SPSF_CREATE_ALWAYS
speaker.AudioOutputStream = stream
# 执行语音合成并保存
speaker.Speak(text)
# 关闭流
stream.Close()
# 测试:将文本保存为WAV文件
if __name__ == "__main__":
text = "这是保存为音频文件的示例,输出格式为WAV。"
text_to_audio(text, "output.wav")
print(f"音频已保存到 output.wav")