Skip to content

超长音频(≥4h)在 ASR 上传阶段必然失败:idle_timeout 硬编码 300s 且该失败不重试(实测 17502s/494MB 两次同因) #181

Description

@zj1123581321

结论

超长音频(今天实测 17502 秒 / 494 MB)在 ASR 上传阶段稳定失败:
某一帧 ws.send 阻塞超过 SDK 的 idle_timeout=300s,抛
AsrError("timeout", "发送音频帧超过 idle_timeout")。

两个叠加问题让它必然失败、且现有重试预算完全没生效:

  1. VTA 从不传 idle_timeout,用的是 SDK 硬编码默认值 300s
    (transcriber/capswriter_client.py 的 sdk_kwargs 只有 encoding / seg_duration /
    seg_overlap / on_progress / deadline_total)。SDK 两个入口
    transcribe_file / transcribe_file_sync 都接受 idle_timeout 参数(默认 300.0)。
  2. 该 AsrError 的 retryable 不为真,而 transcribe_file 判
    should_retry = exc.retryable is True,于是配置的 capswriter.max_retries=5
    一次都没用上——日志里每次都是 尝试 1/5 直接终态。

证据(生产实测,2026-10-06,n305 video-transcript-api,ASR 侧 ws://192.168.31.222:6016)

live-recorder 任务 787644a07c9348b588d4b84e60336ae8(标题「清月已经不困了」,
518 MB / 17501.67 秒 = 4 小时 51 分)。同一天两次独立提交,两次同因失败:

第一次 VTA 任务 task_369063edafc64d14a77bbdc4d23c5ec3:

11:04:17 开始转录文件: data/temp/task_task_369063.../清月已经不困了.mp4 (尝试 1/5)
11:04:17 capswriter_start attempt=1/5 media=... duration=17501.673354 deadline_total=70126.693416
11:15:25 ERROR 转录文件失败: data/temp/task_task_369063.../清月已经不困了.mp4,
         code=timeout, 原因: 发送音频帧超过 idle_timeout
11:15:25 RuntimeError: 转录文件失败: ..., code=timeout, 原因: 发送音频帧超过 idle_timeout
[perf] task_369063... | transcription: 668092ms (FAILED: 转录文件失败...)
任务状态更新: task_369063... -> failed

第二次(并发已归零,单独跑)VTA 任务 task_6c1c8f5858bb465fbf04522177f4a0da:

11:52:10 capswriter_start attempt=1/5 media=... duration=17501.673354 deadline_total=70126.693416
12:02:29 ERROR 转录文件失败: ..., code=timeout, 原因: 发送音频帧超过 idle_timeout
[perf] task_6c1c8f58... | transcription: 618856ms

与并发无关:第二次是在 VTA 队列空、无其他转录任务时单独跑的,仍在上传阶段卡死。
失败耗时稳定在 10-11 分钟,与「本地准备(转码/分片) + 一次 300s idle 超时」吻合。

同一文件 2026-10-03 首次提交也是 转录文件失败(当时错误详情未落进通知文本)。

影响面与边界

同批重跑对照(live-recorder 生产库 23 个历史失败样本,2026-10-06 重提交):

音频时长 结果
8129s / 8364s / 9225s / 9388s / 9417s / 9457s / 9613s / 9864s / 12618s / 12900s 全部成功
17502s(4.86 小时,494 MB) 两次均失败

即失败阈值落在 12900s(3.6 小时)与 17502s(4.86 小时)之间,且表现为
「同一天两次都一样」,不是偶发抖动。直播录制场景里 5 小时以上的场次并不罕见。

建议修法(供参考,落点与取舍请本仓拍板)

  1. 主修:sdk_kwargs 显式传 idle_timeout,取值与 deadline_total 同阶
    (例如按 duration 比例给,或至少给到分钟级),让「单帧发送超时」不再先于
    「总预算」把任务打死。当前 70126s 的总预算在这条路径上根本没机会用上。
  2. 配套:timeout 类失败是否该进 max_retries 重试。注意重试只有在 1 落地后才有意义
    (同样大小、同样服务端背压下,原样重试仍会卡在同一处);若采纳 1,重试可作为兜底而非主修。
  3. 备选:调小 seg_duration 以缩短单帧发送时间,缓解 TCP 背压下的单帧阻塞。
    需评估对 ASR 精度与总耗时的影响,不建议无评估直接改生产配置。

关联

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working优先级:P1影响开发/验收/交付效率,或阻塞上游流程落点:他仓真身在别的仓,本仓只做跟踪,等上游修

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions