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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:24:03