MacBook Air M1 Sonoma下pyttsx3报objc未定义NameError的解决咨询
解决MacBook Air M1 Sonoma下pyttsx3的NameError问题
错误原因
- pyttsx3的macOS驱动(nsss)依赖
pyobjc库,未安装或安装不完整时会触发objc未定义的错误。 - 代码中存在函数嵌套定义问题:
speak函数内部又定义了一个同名的speak函数,导致pyttsx3的实现无法被正确调用,且作用域混乱。
修复步骤
1. 安装依赖库
在终端执行以下命令,安装pyttsx3所需的pyobjc相关依赖:
pip install pyobjc pyobjc-core pyobjc-framework-Cocoa
如果使用Python3,可替换为pip3。
2. 修正代码结构
移除函数嵌套的错误写法,重构speak函数,让NSSpeechSynthesizer和pyttsx3的实现逻辑清晰分离:
import NSSpeechSynthesizer import speech_recognition as sr import webbrowser import pywhatkit import yfinance as yf import pyjokes import wikipedia import datetime import pyttsx3 # 提前导入pyttsx3 # 语音转文本函数(保持原逻辑不变) def transform_audio_into_text(): r = sr.Recognizer() with sr.Microphone() as source: r.pause_threshold = 0.8 print("可以开始说话了") audio = r.listen(source) try: request = r.recognize_google(audio, language='es-PE') print("你的请求: " + request) return request except sr.UnknownValueError: print("我没听懂你说的") return "我还在等待..." except sr.RequestError: print("服务不可用") return "我还在等待..." except: print("出了点问题") return "我还在等待..." # 语音合成函数(重构后) def speak(message): # 优先使用NSSpeechSynthesizer try: synthesizer = NSSpeechSynthesizer.alloc().init() synthesizer.setVoice_("com.apple.speech.synthesis.voice.Monica") synthesizer.startSpeakingString_(message) while synthesizer.isSpeaking(): pass return except Exception as e: print(f"NSSpeechSynthesizer 错误: {e}") # 备选使用pyttsx3 try: engine = pyttsx3.init(driverName='nsss') engine.say(message) engine.runAndWait() except Exception as e: print(f"pyttsx3 错误: {e}")
额外说明
- 如果安装依赖后仍有问题,可尝试升级pyttsx3到最新版本:
pip install --upgrade pyttsx3 - M1芯片系统建议使用原生支持arm64的Python环境(如从Python官网下载的安装包),避免Rosetta转译带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Yeferson CV
相关产品推荐
相关产品推荐

