Skip to content

[asr] OpenRouter Whisper 长语音触发 15 秒全局超时 #721

@keli-wen

Description

@keli-wen

现象

我在使用 ASR 时遇到一个和长语音相关的超时问题。

背景:

  • 之前试过本地 Qwen ASR 1.7B,偶尔会有识别错误。
  • 后来换过 Qwen 0.7B ASR,基本不会 timeout,但识别效果一般。
  • 之后切到 OpenRouter 的 openai/whisper-large-v3-turbo,短一点的语音可以正常使用,但稍微长一点就会识别超时。

当前配置:

  • ASR 供应商:OpenRouter Whisper
  • Endpoint:https://openrouter.ai/api/v1
  • Model:openai/whisper-large-v3-turbo
  • API key 本身在其他请求里可用;短音频也能成功,所以不像是 key 或 endpoint 错误。

复现现象:

  • 短语音可以正常转写。
  • 稍微长一点的语音,录音能正常结束,但停止录音后卡在转写阶段,约 15 秒后失败。
  • 日志中可以看到 recorder 已释放,然后 whisper 全局超时 15 秒

相关日志片段:

2026-06-20T09:31:20.775532Z [INFO] [coord] hotkey pressed (mode=Toggle, phase=Listening)
2026-06-20T09:31:20.860231Z [INFO] [recorder] cpal Stream dropped (mic released)
2026-06-20T09:31:36.561286Z [ERROR] [coord] whisper 全局超时 15 秒
2026-06-20T09:31:36.562472Z [INFO] [coord] hotkey released (mode=Toggle, phase=Idle)

我的疑问:

  • 这个问题是否是因为 Whisper/OpenRouter 路径仍然使用固定的 COORDINATOR_GLOBAL_TIMEOUT_SECS = 15
  • OpenRouter 这类云端 batch ASR 会受网络抖动、排队、base64 body、分片数量影响,15 秒整体超时是不是太严格了?
  • 如果网络稍微 shake 一下就 error,而且失败后音频没有保留/没有 retry 入口,用户很难重新跑这一段,只能重新录,很难受。

相关上下文:

影响

  • 长一点的语音输入不稳定:短句可用,稍长就可能失败。
  • 失败原因对用户不直观,看起来像 provider/key 问题,但实际可能是客户端 timeout。
  • 失败后如果音频没有保留或不能从失败历史重试,用户只能重新录音。
  • 使用 OpenRouter Whisper Large V3 Turbo 作为高质量低成本 ASR 的体验会明显受影响。

建议接受标准

  • Whisper-compatible ASR,尤其是 OpenRouter Whisper 路径,不再使用固定 15 秒整体超时。
  • OpenRouter Whisper 根据音频长度、分片数量或 provider 类型使用动态 timeout,例如 max(30s, audio_seconds * factor + margin),或者至少允许长音频有更合理的总预算。
  • 日志中记录本次音频时长、分片数量、provider、timeout 秒数,方便判断是 provider 慢还是客户端超时。
  • OpenRouter 分片请求可以承受短暂网络抖动;如果失败,错误信息区分 provider HTTP error、network error、client timeout。
  • 转写失败时提供可用的重试路径:保留本次音频/PCM 到失败历史,或者至少在 debug/设置中允许保留并重新转写,避免用户必须重新录音。
  • 不回退 feat(asr): 支持 OpenRouter 作为 ASR 提供商 (#582) #591 已修复的 OpenRouter JSON + base64 请求格式。

TODO / 不确定项

  • 我还没有确认具体 release 版本号;从 UI 看已经有 OpenRouter Whisper preset,应该是包含 feat(asr): 支持 OpenRouter 作为 ASR 提供商 (#582) #591 的版本。
  • 我不确定当前失败后音频是否仍在内存中短暂存在,但 UI/历史里没有明显的重新转写入口。
  • 需要维护者确认 OpenRouter Whisper 路径当前是否确实被 COORDINATOR_GLOBAL_TIMEOUT_SECS = 15 包住,以及是否可以复用本地 Qwen ASR 的动态 timeout 思路。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions