You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:12:02