如何让Python函数触发一次后指定时间段内无法再次被调用?
问题原因
- 触发时机错误:你当前在获取
PartialResult(语音识别中间临时结果)时就调用main函数,中间结果在整句识别完成前会持续返回,内容高度相似甚至完全相同,自然会重复触发函数。 - 无防抖/去重逻辑:没有对重复指令、短时间内的重复调用做限制,只要匹配到关键词就执行。
修复方案
方案1(推荐):调整触发时机到整句识别完成后
主流语音识别框架中,AcceptWaveform返回True代表整句识别结束,此时返回的Result是最终确定的识别结果,不会重复返回,修改主循环逻辑如下:
import time import ast # 全局变量存储上次执行的时间和内容,用于冷却去重 last_exec_time = 0 last_exec_text = "" COOLDOWN_SECONDS = 5 # 冷却时长可自行调整,单位为秒 while True: data = q.get() if rec.AcceptWaveform(data): dicts = rec.Result() print(dicts) # 仅在整句识别完成后调用业务逻辑 main(dicts) else: dicts = rec.PartialResult() # 中间结果仅做调试用,不触发业务逻辑 # print(dicts) if dump_fn is not None: dump_fn.write(data)
方案2:添加冷却防抖逻辑
如果你的场景需要依赖中间结果做实时响应,保留原触发位置的同时,给main函数添加冷却判断即可,修改后的main函数如下:
def main(dicts): global last_exec_time, last_exec_text new_dicts = ast.literal_eval(dicts) text = new_dicts.get("partial", "") # 冷却判断:冷却时间内内容相似的请求直接跳过 current_time = time.time() if current_time - last_exec_time < COOLDOWN_SECONDS: # 判断当前内容和上次执行的内容是否高度相似 if text in last_exec_text or last_exec_text in text: return # 原有业务逻辑 if "what" in text: if "time" in text: time_get("time") # 执行成功后更新上次执行记录 last_exec_time = current_time last_exec_text = text elif "day" in text: time_get("day") last_exec_time = current_time last_exec_text = text
内容的提问来源于stack exchange,提问作者Cuber
相关产品推荐
相关产品推荐

