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

Python语音助手跨文件调用Feature.py函数功能失效求助

Python语音助手拆分代码故障修复方案

1. 核心问题:@functools.lru_cache() 错误使用

故障原因

lru_cache仅支持传入可哈希参数的函数,类实例方法默认传入的self(类实例本身)不可哈希;且__init__、listen、takecommand这类需要实时执行的方法加缓存后,仅首次调用会正常执行,后续调用全部返回历史结果,直接导致功能无响应。

修复方案

删除HoverAssist类下所有方法的@functools.lru_cache()装饰器。

2. 核心问题:Webopener调用逻辑错误

故障原因

Feature.py中Webopener是普通函数,webopen是其内部嵌套方法,Main.py直接调用Webopener.webopen()无法访问到内部方法,会触发属性不存在报错。

修复方案

修改Feature.py的Webopener相关代码,将webopen提为顶层函数:

# Feature.py 调整后代码
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
def webopen(query):
    for j in search(query=query, tld="co.in", num=1, stop=1, pause=1):
        webbrowser.open(j)

同步修改Main.py对应调用逻辑:

elif 'open' in query.lower():
    from Feature import webopen
    query = query.replace("open", "")
    query = query.replace("chrome", "")
    self.speak(f"Opening {query} ")
    webopen(query=query)

3. 核心问题:Reminder线程未启动

故障原因

Main.py中创建Reminder线程后仅赋值给变量,未调用start()方法,线程不会实际运行。

修复方案

修改对应代码:

h = threading.Thread(target=lambda: Reminder(tt, name))
h.start() # 新增该行启动线程

4. 核心问题:关闭摄像头逻辑错误

故障原因

cv2.destroyAllWindows()是cv2模块的全局方法,不属于VideoCapture实例对象,调用self.capture.destroyAllWindows()会触发属性报错。

修复方案

修改Main.py中关闭摄像头的代码:

elif 'close camera' in query:
    self.capture.release()
    cv2.destroyAllWindows() # 替换原self.capture.destroyAllWindows()

5. 逻辑漏洞:wish方法判断错误

故障原因

原代码判断写为elif hour > 12 and hour >15,12-15点的时间段无法匹配到下午问候,会直接走傍晚逻辑。

修复方案

调整判断逻辑:

def wish(self, hour):
    if 0 < hour < 12:
        self.speak('Good Morning')
    elif 12 <= hour < 15:
        self.speak('Good Afternoon')
    else:
        self.speak('Good Evening')

6. 可选优化:统一语音识别逻辑

Feature.py中的takecommand方法未设置phrase_time_limit参数,会出现长时间等待录音的问题,可修改为和Main.py一致的逻辑:

def takecommand():
    listener = sr.Recognizer()
    command = ""
    try:
        with sr.Microphone() as source:
            voice = listener.listen(source, phrase_time_limit=4)
            command = listener.recognize_google(voice)
            print(f"User Said: {command}")
            print("                                      ")
    except sr.WaitTimeoutError:
        pass
    except sr.UnknownValueError:
        pass
    except sr.RequestError:
        print("Network error.")
    return command.lower()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:48:03