pyttsx3文本转语音使用指南3
以下是 pyttsx3 库的核心属性和方法的详细说明,帮助你更灵活地控制文本转语音(TTS)的行为。
核心属性
pyttsx3 通过 engine 对象提供以下属性(需通过 getProperty/setProperty 访问):
| 属性名 | 描述 | 示例值/范围 |
|---|---|---|
rate |
语速(单词/分钟),默认值通常为 200。数值越小语速越慢。 |
150(慢速)、200(默认)、300 |
volume |
音量,范围 0.0(静音)到 1.0(最大音量)。 |
0.5、0.8、1.0 |
voice |
当前使用的声音 ID,需从 voices 列表中选择。 |
HKEY_LOCAL_MACHINE\...\David |
voices |
系统支持的语音列表(包含所有可用声音对象)。 | [<Voice id=...>, ...] |
active |
引擎是否处于活动状态(布尔值)。 | True、False |
核心方法
1. 初始化引擎
engine = pyttsx3.init(driverName=None, debug=False)
driverName: 指定底层驱动(如sapi5、espeak、nsss),默认自动选择。debug: 启用调试日志。
2. 设置/获取属性
# 获取属性
current_rate = engine.getProperty('rate')
# 设置属性
engine.setProperty('volume', 0.7)
3. 语音控制
| 方法 | 描述 |
|---|---|
say(text) |
将文本添加到待播放队列(需后续调用 runAndWait 执行)。 |
runAndWait() |
阻塞程序,直到所有语音播放完成。 |
stop() |
立即停止当前语音播放并清空队列。 |
save_to_file(text, filename) |
将文本转为音频文件并保存(需调用 runAndWait 生效)。 |
4. 事件循环(异步支持)
| 方法 | 描述 |
|---|---|
startLoop(useDriverLoop=True) |
启动事件循环(非阻塞模式)。 |
endLoop() |
停止事件循环。 |
iterate() |
处理事件队列(需在自定义循环中调用)。 |
5. 声音管理
# 获取所有可用声音
voices = engine.getProperty('voices')
# 切换声音(例如选择第一个声音)
engine.setProperty('voice', voices[0].id)
完整示例代码
import pyttsx3
# 初始化引擎
engine = pyttsx3.init()
# 设置属性
engine.setProperty('rate', 180)
engine.setProperty('volume', 0.8)
# 获取所有可用声音并切换
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id) # 选择第二个声音
# 注册事件回调(可选)
def onStart(name):
print(f"开始播放: {name}")
def onEnd(name, completed):
print(f"结束播放: {name}, 是否完成: {completed}")
engine.connect('started-utterance', onStart)
engine.connect('finished-utterance', onEnd)
# 朗读文本
engine.say("这是第一段文本。")
engine.say("这是第二段文本。")
# 保存为文件
engine.save_to_file("这是保存到文件的文本。", "output.wav")
# 执行并等待完成
engine.runAndWait()
事件回调
pyttsx3 支持通过事件监听实现高级控制:
| 事件名 | 触发时机 | 回调函数参数 |
|---|---|---|
started-utterance |
开始播放某段语音时触发。 | name(语音标识) |
finished-utterance |
某段语音播放完成或中断时触发。 | name(语音标识), completed(是否完成) |
# 注册事件回调示例
def onStart(name):
print(f"开始播放语音片段: {name}")
engine.connect('started-utterance', onStart)
跨平台注意事项
| 系统 | 驱动 | 语音支持 | 文件保存格式 |
|---|---|---|---|
| Windows | sapi5 |
支持多种语音(需系统安装语音包) | .wav(默认)、需额外库支持 MP3 |
| Linux | espeak |
需安装 espeak 及语音包 |
依赖 espeak 配置 |
| macOS | nsss |
系统自带语音 | .aiff、.wav |
常见问题
-
如何支持中文?
- Windows:在“系统设置 > 语音”中安装中文语音包。
- Linux:安装中文语音包(如
espeak-zh)。 - macOS:默认支持中文,但声音质量可能较低。
-
保存 MP3 失败?
- 安装
ffmpeg或使用第三方库(如pydub)转换格式。
- 安装
-
如何实现异步播放?
- 使用
startLoop和iterate实现非阻塞播放:
engine.startLoop(False) engine.say("异步播放测试") while engine.isBusy(): engine.iterate() engine.endLoop() - 使用
通过灵活使用这些属性和方法,你可以实现复杂的 TTS 功能,例如动态调整语音参数、异步控制播放流程,或结合其他库处理多语言混合内容。
浙公网安备 33010602011771号