
pyttsx3 默认不支持直接导出 mp3 等音频格式,`save_to_file()` 需配合兼容的 tts 驱动(如 `nsss` 在 macos 上仅支持播放,不支持录音),导致调用后程序挂起;正确做法是切换至支持文件导出的驱动(如 `espeak`)或改用 `gtts` 等替代方案。
pyttsx3 是一个纯 Python 的离线文本转语音库,跨平台兼容性好,但其文件导出能力高度依赖底层 TTS 驱动。在 macOS(尤其是 Apple Silicon)上,默认使用的 nsss 驱动(基于 Apple’s NSSpeechSynthesizer)仅支持实时语音播放,不支持录音或写入文件——这正是 save_to_file() 调用后程序无限挂起(hang)的根本原因。即使预先创建空 .mp3 文件,也无法绕过该驱动限制。
✅ 正确解决路径如下:
1. 检查并切换可用驱动(推荐 Linux/macOS 用户)
import pyttsx3
# 查看所有可用驱动
engines = pyttsx3.engines
print("Available engines:", engines) # 通常为 ['nsss'](macOS)、['espeak'](Linux)、['sapi5'](Windows)
# 显式指定 espeak(需提前安装)——macOS 需通过 Homebrew 安装:
# brew install espeak
engine = pyttsx3.init(driverName='espeak') # 强制使用 espeak
engine.save_to_file('Hello, this is saved!', 'output.mp3')
engine.runAndWait() # ✅ 此时将成功生成 MP3 文件⚠️ 注意:espeak 在 macOS 上默认不带 MP3 编码支持,生成的是 WAV 文件(如 output.wav)。若需 MP3,需额外用 ffmpeg 转换:ffmpeg -i output.wav -codec:a libmp3lame -qscale:a 2 output.mp3
2. 替代方案:使用 gTTS(在线,支持 MP3 原生导出)
若对离线无硬性要求,gTTS(Google Text-to-Speech)更简单可靠:
from gtts import gTTS
tts = gTTS('Hey', lang='en', slow=False)
tts.save('hey.mp3') # ✅ 直接生成标准 MP3,无需 runAndWait()✅ 优势:免配置、格式原生支持、音质更自然;⚠️ 缺点:需网络连接,有调用频率限制。
3. 进阶:macOS 下结合 say 命令 + afconvert
利用系统命令行工具实现离线高质量导出(无需第三方 Python 包):
import subprocess import os text = "Hey" temp_aiff = "temp.aiff" output_mp3 = "hey.mp3" # 使用 macOS 内置 say 命令生成 AIFF subprocess.run(['say', '-o', temp_aiff, text]) # 转换为 MP3(需系统自带 afconvert) subprocess.run(['afconvert', '-f', 'MP4F', '-d', 'aac', temp_aiff, output_mp3]) # 清理临时文件 os.remove(temp_aiff)
? 总结建议:
- ❌ 不要对 pyttsx3 + nsss 驱动抱有 save_to_file() 生成 MP3 的期望;
- ✅ macOS 用户优先尝试 espeak(WAV 输出)或系统 say + afconvert 组合;
- ✅ 快速验证/原型开发可直接选用 gTTS;
- 所有方案均需确保目标路径有写入权限,且文件扩展名与实际编码匹配(如 espeak 输出 .wav,勿强行命名 .mp3)。










