pyttsx3文本转语音使用指南3

以下是 pyttsx3 库的核心属性方法的详细说明,帮助你更灵活地控制文本转语音(TTS)的行为。


核心属性

pyttsx3 通过 engine 对象提供以下属性(需通过 getProperty/setProperty 访问):

属性名 描述 示例值/范围
rate 语速(单词/分钟),默认值通常为 200。数值越小语速越慢。 150(慢速)、200(默认)、300
volume 音量,范围 0.0(静音)到 1.0(最大音量)。 0.50.81.0
voice 当前使用的声音 ID,需从 voices 列表中选择。 HKEY_LOCAL_MACHINE\...\David
voices 系统支持的语音列表(包含所有可用声音对象)。 [<Voice id=...>, ...]
active 引擎是否处于活动状态(布尔值)。 TrueFalse

核心方法

1. 初始化引擎

engine = pyttsx3.init(driverName=None, debug=False)
  • driverName: 指定底层驱动(如 sapi5espeaknsss),默认自动选择。
  • 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

常见问题

  1. 如何支持中文?

    • Windows:在“系统设置 > 语音”中安装中文语音包。
    • Linux:安装中文语音包(如 espeak-zh)。
    • macOS:默认支持中文,但声音质量可能较低。
  2. 保存 MP3 失败?

    • 安装 ffmpeg 或使用第三方库(如 pydub)转换格式。
  3. 如何实现异步播放?

    • 使用 startLoopiterate 实现非阻塞播放:
    engine.startLoop(False)
    engine.say("异步播放测试")
    while engine.isBusy():
        engine.iterate()
    engine.endLoop()
    

通过灵活使用这些属性和方法,你可以实现复杂的 TTS 功能,例如动态调整语音参数、异步控制播放流程,或结合其他库处理多语言混合内容。

posted @ 2025-05-27 17:00  天堂面包  阅读(129)  评论(0)    收藏  举报