
pyttsx3 默认不支持直接导出 mp3 等音频格式,`save_to_file()` 需配合 `say()` 调用且必须在 `runandwait()` 前触发;仅调用 `save_to_file()` 会导致事件循环阻塞而无限挂起。
pyttsx3 是一个轻量级、离线的 Python 文本转语音库,但它本身并不具备音频编码能力——它依赖系统 TTS 引擎(如 macOS 的 nsss、Windows 的 SAPI5、Linux 的 espeak)进行语音合成。关键在于:save_to_file() 并非独立录音功能,而是将同一段语音任务同时发送给“播放设备”和“文件写入器”,因此它必须与 say() 配合使用,且所有 say() 和 save_to_file() 调用都需在 runAndWait() 之前注册。
✅ 正确用法(必须同时包含 say() 和 save_to_file()):
import pyttsx3
engine = pyttsx3.init()
# 设置语速、音量等(可选)
engine.setProperty('rate', 150)
engine.setProperty('volume', 0.9)
# 同时触发语音播放 + 文件保存(注意:text 参数需一致)
engine.say('Hey') # 播放语音(可选,但推荐保留)
engine.save_to_file('Hey', 'hey.mp3') # 写入文件(路径需有写权限)
# ⚠️ 必须调用 runAndWait() 才会真正执行上述两个任务
engine.runAndWait()❌ 错误写法(导致挂起):
engine.save_to_file('Hey', 'hey.mp3')
engine.runAndWait() # ❌ 缺少 say() → 无语音任务提交 → runAndWait() 等待永不结束? 补充说明:
- 文件格式限制:pyttsx3 通过系统引擎生成的是原始 PCM 或平台特定格式(如 macOS 的 .aiff),不原生生成 MP3。你指定 'hey.mp3' 仅是文件名,实际内容可能是未压缩的 AIFF(macOS)或 WAV(Windows)。若需 MP3,需后续用 pydub + ffmpeg 转码;
- Apple Silicon/macOS 注意事项:nsss 引擎默认不支持直接写文件,但 save_to_file() 在较新版本中已兼容。确保使用 pyttsx3>=2.90,并避免在沙盒环境(如某些 IDE 终端)中运行——建议在系统终端执行;
- 路径权限:确保目标目录可写(例如避免写入 /System/ 或只读挂载点),推荐使用绝对路径或 os.path.join(os.getcwd(), 'hey.mp3');
- 多任务安全:每个 runAndWait() 对应一次完整语音队列执行。若需连续保存多段,应分多次调用 say()+save_to_file()+runAndWait(),或统一添加后一次性执行。
? 总结:save_to_file() 不是录音 API,而是 say() 的“并行输出”扩展。牢记三要素——先 say()、再 save_to_file()、最后 runAndWait() ——即可稳定导出语音文件。










