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

Python语音助手无法接收语音命令问题求助

问题诊断与修复方案

核心问题分析

你的语音助手反复输出“Say that again”,说明语音识别环节持续失败,同时greetMe模块本身存在依赖缺失问题,即使移到主文件也会影响功能触发。

一、语音识别失败的解决步骤

  1. 麦克风权限检查
    确保Python程序有权限访问麦克风:

    • Windows:设置-隐私和安全性-麦克风,允许桌面应用访问麦克风
    • macOS:系统设置-隐私与安全性-麦克风,勾选终端/IDE的权限
  2. 适配环境噪音
    当前代码里的energy_threshold = 300可能不匹配你的环境噪音水平,建议添加环境噪音校准,并调整录音参数:

    with speech_recognition.Microphone() as source:
        print("Listening.....")
        r.adjust_for_ambient_noise(source, duration=1)  # 自动校准环境噪音阈值
        r.pause_threshold = 1
        audio = r.listen(source, timeout=5, phrase_time_limit=4)  # 调整超时参数,给足说话时间
    
    • adjust_for_ambient_noise会根据当前环境自动设置合适的能量阈值,避免因噪音导致识别失败
    • 延长timeout时间,防止还没说话就触发超时
  3. 网络与语音清晰度检查

    • recognize_google依赖网络,确保你的网络连接正常
    • 说话时靠近麦克风,发音清晰,尽量在安静环境测试

二、greetMe模块的修复

你的greetMe.py存在依赖缺失问题,直接导入会报错,修正如下:

# greetMe.py
import datetime

def greetMe(engine):
    hour = int(datetime.datetime.now().hour)
    if 0 <= hour <= 12:
        engine.say("Good Morning,sir")
    elif 12 < hour <= 18:
        engine.say("Good Afternoon,sir")
    else:
        engine.say("Good Evening,sir")
    engine.say("Please tell me, How can I help you ?")
    engine.runAndWait()

主文件调用时传递已初始化的engine实例,避免重复初始化:

# 主文件中唤醒后的调用部分
if "wake up" in query:
    greetMe(engine)

三、主文件的优化调整

  1. 将greetMe的导入移到文件顶部,避免循环内重复导入:
    from greetme import greetMe
    
  2. 细化异常捕获,明确识别失败的原因:
    try:
        print("Understanding..")
        query = r.recognize_google(audio, language='en-in')
        print(f"You Said: {query}\n")
    except sr.UnknownValueError:
        print("Say that again")
        return "None"
    except sr.RequestError:
        print("Could not connect to Google Speech Recognition service")
        return "None"
    

修正后的完整主文件示例

import speech_recognition as sr
import pyttsx3
from greetme import greetMe

engine = pyttsx3.init("sapi5")
voices = engine.getProperty("voices")
engine.setProperty("voice", voices[0].id)
engine.setProperty("rate", 170)

def speak(audio):
    engine.say(audio)
    engine.runAndWait()

def takeCommand():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening.....")
        r.adjust_for_ambient_noise(source, duration=1)
        r.pause_threshold = 1
        try:
            audio = r.listen(source, timeout=5, phrase_time_limit=4)
        except sr.WaitTimeoutError:
            print("No speech detected")
            return "None"

    try:
        print("Understanding..")
        query = r.recognize_google(audio, language='en-in')
        print(f"You Said: {query}\n")
    except sr.UnknownValueError:
        print("Say that again")
        return "None"
    except sr.RequestError:
        print("Could not connect to Google Speech Recognition service")
        return "None"
    return query

if __name__ == "__main__":
    while True:
        query = takeCommand().lower()
        if "wake up" in query:
            greetMe(engine)
            while True:
                query = takeCommand().lower()
                if "go to sleep" in query:
                    speak("Ok sir, You can call me anytime")
                    break

内容的提问来源于stack exchange,提问作者muteeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:56:24