Python开发基础智能助手脚本无法响应执行命令问题求助
问题根因与修复方案
你这个脚本运行无响应、直接返回exit code 0的问题,核心是依赖缺失+逻辑错误共同导致的,以下是具体修复方案:
1. 先解决直接退出的根因
speech_recognition库调用麦克风必须依赖pyaudio库,大多数初学者只装了speechrecognition没装pyaudio,调用sr.Microphone时会静默失败直接退出,对应安装方法:
- Windows:直接跑
pip install pyaudio如果报错,先执行pip install pipwin再执行pipwin install pyaudio - Mac:先执行
brew install portaudio再执行pip install pyaudio - Linux:先执行
sudo apt-get install portaudio19-dev python3-pyaudio再执行pip install pyaudio
2. 修复现有代码的逻辑错误
你当前的代码还存在3个逻辑问题,就算依赖装完也没法正常响应命令:
- 唤醒词判断写在命令处理之后,等于唤醒词过滤完全不生效,你说
charlie time根本匹配不上命令规则 - 命令匹配用完全相等判断,你说
what time is it之类的自然表述根本触发不了对应功能 - 没有做语音包索引越界防护,部分系统只有1个默认语音包,调用
voices[1].id会直接报错退出
修复后的完整可运行代码
import datetime # 时钟功能 import pyjokes # 笑话功能 import pyttsx3 # 文字转语音 import speech_recognition as sr import wikipedia # 维基百科查询 # 初始化识别器 listener = sr.Recognizer() # 文字转语音函数 def talk(text): # 初始化语音引擎 engine = pyttsx3.init() # 设置语速 rate = engine.getProperty('rate') engine.setProperty('rate', 125) # 设置音量 volume = engine.getProperty('volume') engine.setProperty('volume', 1.0) # 设置语音性别,兼容只有单语音包的设备 voices = engine.getProperty('voices') engine.setProperty('voice', voices[1].id if len(voices)>=2 else voices[0].id) engine.say(text) engine.runAndWait() # 命令处理函数 def run_charlie(command): if 'hi' in command: print("hello") talk("hello") elif 'time' in command: time = datetime.datetime.now().strftime('%I:%M %p') print(f'当前时间:{time}') talk(f'Current time is {time}') elif 'who is' in command: person = command.replace('who is', '').strip() info = wikipedia.summary(person, sentences=1) print(info) talk(info) elif 'how are you' in command: talk('I am good, how are you?') elif 'joke' in command: joke = pyjokes.get_joke() print(joke) talk(joke) else: talk('Please say the command again.') # 主执行入口 if __name__ == "__main__": while True: try: with sr.Microphone() as source2: print('listening...') listener.adjust_for_ambient_noise(source2, duration=0.2) audio2 = listener.listen(source2) MyText = listener.recognize_google(audio2) MyText = MyText.lower() print(f"识别内容:{MyText}") # 先过滤唤醒词再处理命令 if 'charlie' in MyText: command = MyText.replace('charlie', '').strip() run_charlie(command) except sr.RequestError as e: print(f"无法请求识别服务: {e}(谷歌语音识别需要科学上网,可替换为离线/国内识别接口)") except sr.UnknownValueError: print("无法识别语音内容")
注意事项
- 运行时必须给终端/IDE开放麦克风权限,否则系统会拦截调用导致脚本退出
- 首次运行的前2秒是环境噪音校准阶段,属于正常情况,不要误以为卡住
- 谷歌语音识别需要外网访问权限,无法联网的可以替换为百度语音识别、CMU Sphinx等离线/国内识别方案
内容的提问来源于stack exchange,提问作者Cameron Sloan
相关产品推荐
相关产品推荐

