pyttsx3
Python 离线文字转语音库,跨平台兼容,无需网络,直调用系统 TTS 引擎(SAPI5/NSSpeech/espeak)。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Python 离线文字转语音库,跨平台兼容,无需网络,直调用系统 TTS 引擎(SAPI5/NSSpeech/espeak)。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
凌晨两点,你在调试一段需要朗读出错的程序。打开主流的 TTS 在线 API,却发现公司网络隔离环境根本无法访问外网——这是许多嵌入式开发者、离线环境运维人员、以及需要在企业内网中部署语音功能的工程师时常遭遇的窘境。
就在这时,pyttsx3 像一位可靠的老同事登场了:它不需要任何网络连接,直接调用你电脑上已有的语音合成引擎,在 Windows 上调用 SAPI5,在 macOS 上调用 NSSpeechSynthesizer,在 Linux 上调用 espeak-ng,把文字变成声音。整个过程在一秒内完成,完全离线。
pyttsx3 由印度开发者 Natesh M Bhat 创建,最初是为了解决 Python 2/3 时代缺乏好用的离线 TTS 库的问题。2017 年左右,Python 3 生态中的离线语音库几乎空白,而彼时主流的 GTTS(Google Text-to-Speech)需要联网,且会把用户文本发送到 Google 服务器——这在隐私合规要求日益严格的金融、医疗、教育场景中是致命的缺陷。
作者用了一个聪明的思路:不做自己的语音合成引擎,而是做一个跨平台的统一封装层。pyttsx3 本身不产生任何语音,而是探测当前操作系统上已安装的 TTS 引擎(Windows SAPI5、macOS NSSpeechSynthesizer、Linux espeak),然后提供一个统一的 Python API 供开发者调用。这种"桥梁"模式让它规避了语音合成的核心难点,同时获得了跨 OS 的能力。
这个项目从 2017 年维护至今,2025 年 7 月刚发布 v2.99 版本,PyPI 下载量突破 1900 万次,月均下载接近百万——在一个"大家都用云服务"的时代,这个数字说明离线 TTS 有着稳定而持久的需求。
你可以把 pyttsx3 想象成一个万能遥控器。你的电脑里其实已经住着好几个语音助手(Windows 的小娜、macOS 的 Siri 底层、Linux 的 espeak),但它们藏在系统深处,普通人很难直接调用。pyttsx3 就像一个通用遥控器,能同时控制这些不同品牌的语音设备,用统一的按钮(engine.say())来操控它们。
这个比喻的局限性在于:这些内置引擎的语音质量参差不齐,espeak 的机械感最强,SAPI5 在 Windows 上的效果相对自然。选择哪个引擎,用户并没有太多话语权,取决于操作系统自带什么。
import pyttsx3
pyttsx3.speak("Hello, this is your computer speaking.")
这一行代码完成了初始化引擎、朗读文本、释放资源的全部流程。对快速脚本、一次性任务而言,非常实用。
import pyttsx3
engine = pyttsx3.init()
# 语速控制(默认约200字/分钟)
rate = engine.getProperty('rate')
engine.setProperty('rate', 150) # 放慢一点
# 音量控制(0.0~1.0)
engine.setProperty('volume', 0.9)
# 切换嗓音(0=男声,1=女声)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
engine.say("Hello World!")
engine.runAndWait()
engine.save_to_file('Hello World', 'output.mp3')
engine.runAndWait()
在 Linux 上确保已安装 espeak-ng。转换速度极快——实测 1800 字文本在约 2 秒内生成 10 分钟音频。
pyttsx3 还提供了事件钩子,可以监听"开始说""说完""出错"等状态,方便集成到 GUI 应用中:
def on_start(name):
print(f'开始朗读: {name}')
engine.connect('started-utterance', on_start)
engine.say("Hello")
engine.runAndWait()
pyttsx3 的代码结构非常清晰,总共只有约 600 行核心代码,分三层:
pyttsx3/
├── engine.py # 核心 Engine 类,事件系统,队列管理
├── driver.py # 驱动代理层,按 OS 选择具体驱动
└── drivers/
├── sapi5.py # Windows SAPI5 驱动
├── nsss.py # macOS NSSpeechSynthesizer 驱动
├── espeak.py # Linux espeak 驱动
├── avspeech.py # macOS AVSpeechSynthesizer 驱动(实验性)
└── _espeak.py # espeak 共享实现
Engine 类是整个库的中央调度器。它维护一个事件队列(runAndWait() 驱动事件循环),通过 DriverProxy 动态加载对应操作系统的 TTS 驱动。驱动层负责将统一的 Python API 翻译为各 OS 的原生 TTS SDK 调用。
这种架构的优势是新增一个 TTS 引擎的成本极低——只需写一个驱动类,实现 say()、stop()、getProperty()、setProperty() 等接口,就能接入整个生态。
| 操作系统 | 底层引擎 | 额外依赖 | 语音自然度 |
|---|---|---|---|
| Windows | SAPI5 | comtypes, pywin32 | ★★★★ |
| macOS | NSSpeechSynthesizer | pyobjc-framework-cocoa | ★★★★ |
| macOS(实验) | AVSpeechSynthesizer | pyobjc-framework-AVFoundation | ★★★ |
| Linux | espeak-ng | espeak-ng, libespeak1 | ★★ |
macOS 的坑:如果你用的是 macOS 14+ 且安装了 pyobjc 9.0 以前的版本,init() 会崩溃。解决方案是 pip install 'pyobjc>=9.0.1'。
Linux 的坑:大多数 Linux 发行版预装的是 espeak(不是 espeak-ng),音色差异较大。建议手动安装 espeak-ng:sudo apt install espeak-ng libespeak1。
pyttsx3 的最大局限是语音质量受限于操作系统内置引擎。在 espeak 下,合成音机械感明显,不适合面向用户的商业产品。如果你对语音的自然度、情感表达有更高要求,可以考虑:
另一个局限是语音数量有限。Windows SAPI5 通常只有 2~3 种内置嗓音,且不支持中文(中文 Windows 需额外安装中文语音包)。macOS 的嗓音库相对丰富,但 espeak 在 Linux 上基本只有英语和一些欧洲语言。
在数据隐私法规(GDPR、CCPA、《个人信息保护法》)日益严格的背景下,本地离线 TTS 有着不可替代的价值:
在这些场景下,pyttsx3 虽然语音质量不够惊艳,但它解决了"有没有"的问题,而且集成成本极低——一个 pip install pyttsx3 就能解决。
pip install pyttsx3
# Linux 额外安装
sudo apt update && sudo apt install espeak-ng libespeak1
# macOS 修复(可选)
pip install 'pyobjc>=9.0.1'
完整文档:https://pyttsx3.readthedocs.io