Root cause report

这是两个问题,外加一个复验阻塞

Issue 01 是 Mai `voiceover_align` 任务失败。Issue 02 是字幕 CJK tofu。按原始 payload 重跑完整链时,又被 `voiceover_align` 卡在字幕前,这是 full-chain 验收的阻塞,不是第三个字幕 bug。

Mai task3898c18b
Subtitle skillv15
Rendi pathprimary
Report scopetest + prod evidence
Issue 01
业务失败
Mai `voiceover_align` 时长不满足
Callback
HTTP 200
`business_failed` 被 Mai 接住
Issue 02
PASS
字幕 v15 独立 Rendi 验证过
Full-chain rerun
BLOCKED
未跑到字幕步骤

问题一:Mai voiceover

任务 `3898c18b` 不是平台崩,也不是 callback 丢。agent 正常返回业务失败:第 2 段 ElevenLabs 候选音频都超过时长阈值。

问题二:字幕 CJK tofu

旧字幕 burn 继续用 `Montserrat`,韩文/日文字形缺失。`subtitle-burn-rendi v15` 已按语种改成 Noto CJK 字体,standalone 验证通过。

Issue 01 · Mai voiceover_align

ElevenLabs 给了音频,但都太长

这个任务没有 crash。Tobatsu agent 正常写了 `result.json`,发了失败 callback,然后调用 `tobatsu-agent fail`。真正卡住的是第 2 段的语音时长。

任务读数

Task
3898c18b-833c-4d08-9a1a-1d181dea43b9
Run
395f2bd4-8a63-4c49-b4e1-a0f5a298dca7
Workflow
`voiceover_align` snapshot `v5`
Terminal
task failed run success / exit 0
Callback
`delivery-failed` 返回 HTTP `200`,`accepted=true`

为什么不是别的问题

1
不是 runner crash
run 是 `success`,exit code 是 `0`。agent 自己给出失败结果。
2
不是 Rendi
任务在 final media / subtitle / Rendi composition 前就停了。
3
不是 callback
Mai 收到 `mai.delivery_result`,并标记为 `business_failed`。

第 2 段的时长阈值

源片第 2 段是 `6.8s-10.0s`,原始长度 `3.2s`。策略先扣掉 `0.35s` headroom,所以目标是 `2.85s`。最大比例是 `1.300`,候选音频不能超过约 `3.705s`。

allowed max
3.705s
candidate 0
3.788s
candidate 1
4.441s
candidate 2
4.049s
结论
这是 provider 输出不满足业务策略。失败信息是 `no TTS candidate fits segment 2: duration ratio 1.421 exceeds threshold 1.300`。
Issue 02 · subtitle-burn-rendi

tofu 的根因是 ASS 字体没换

旧输出里,韩文和日文字幕都还在用 `Montserrat`。这个字体没有 Hangul / Kana 字形,所以 libass 会画出缺字框。v15 在生成 ASS 时按语种替换 `Style.Fontname`。

Beforetofu risk
□ □ □ / □□□
Style: PopKara,Montserrat,96,...
fonts_used: ["Montserrat"]
After v15fixed
자재 옮기면 / 材だ自分の
KO: PopKara,Noto Sans CJK KR,96,...
JA: PopKara,Noto Sans CJK JP,96,...
KO validationRendi primary
Task
2d09513a-8785-4162-be89-671aeb95b78f
Fontname
`Noto Sans CJK KR`
Rendi
`24.685s`, fallback `false`
JA validationRendi primary
Task
d9168b1f-32b9-4408-a632-86220832f3d5
Fontname
`Noto Sans CJK JP`
Rendi
`22.490s`, fallback `false`
Full original payload rerun

按原始 payload 重跑,卡在字幕前

这次没有再偷跑 standalone。两个 payload 都从线上 task 拉回,补回真实 callback token;把 token 重新红掉后和 repro pack 对比,diff 是 0 行。结果是:`subtitle-burn-rendi v15` 已经进入 workspace,但 `voiceover_align` 先失败,所以没有新的 full-chain `final.ass`。

KO rerun

Original
ce64140e-7b4c-4026-a6e8-116d59964055
New task
d9b3a52a-c613-424c-bc1a-a45e473d4d5d
Materialized
`subtitle-burn-rendi v15`, package `3fbe84f2...`
Terminal
failed before subtitle callback 200
Why
segment 1 best ratio `1.324`; over current cap `1.3`, under payload `1.5`。

JA rerun

Original
6302c174-bebe-4b58-b479-bfd466de36f4
New task
382d55a7-05a4-4dab-ae29-ae9a461930f1
Materialized
`subtitle-burn-rendi v15`, package `3fbe84f2...`
Terminal
failed before subtitle callback 200
Why
segment 2 raw ratio about `1.411`; over current cap `1.3`, under payload `1.5`。

这里查到的新问题

payload says: retry_ratio_threshold = 1.5
current voiceover-align says: retry_ratio_threshold = 1.3 hard cap
result: fresh ElevenLabs candidates can fail before subtitle, even with the same historical payload.
这不是 subtitle v15 失败
两条完整 rerun 没有产出 final video / SRT / final.ass。要拿 full-chain 字幕证据,先要决定 `voiceover_align` 到底听 payload 的 `1.5`,还是继续坚持 v10 的 `1.3`。
Evidence index

证据放哪里

这里列的是可以复查的文件和 URL。需要看原始 payload、final ASS、callback body,就从这些路径进。

问题证据位置
Mai voiceover 失败归因短报告 /tmp/tobatsu-voiceover-3898-readback.md
Mai voiceover 主 artifact 根目录 https://cdn-tobatsu.funplus-marketing.ai/task-artifacts/3898c18b-833c-4d08-9a1a-1d181dea43b9/395f2bd4-8a63-4c49-b4e1-a0f5a298dca7/
Subtitle CJK 复现包 /tmp/cjk-tofu-payloads-20260528T040337Z
Subtitle CJK v15 standalone 验证报告 /tmp/subtitle-v15-cjk-validation-report.md
Full payload rerun 原始 payload 端到端重跑报告 /tmp/subtitle-v15-full-pipeline-rerun-report.md
Subtitle CJK KO final ASS https://cdn-tobatsu.funplus-marketing.ai/outputs/2d09513a-8785-4162-be89-671aeb95b78f/final-ass.txt
Subtitle CJK JA final ASS https://cdn-tobatsu.funplus-marketing.ai/outputs/d9168b1f-32b9-4408-a632-86220832f3d5/final-ass.txt
What to do next

后续不要混在一起处理

Mai voiceover
这是策略选择,不是平台修复。可以调 `max ratio`,也可以让 agent 给第 2 段换更短文案。改之前先确认业务能接受哪一种。
Subtitle CJK
v15 已在独立 Rendi primary 跑过。完整 payload 复验目前被 voiceover 阶段拦住,不能拿来否定 v15。

给下游的一句话

Mai: 失败是 ElevenLabs 候选音频超出时长阈值,callback 已正常送达。
Subtitle: tofu 是旧 ASS 字体问题,v15 standalone Rendi 实跑已过;full payload rerun 还卡在 voiceover 阶段。
Generated by Tobatsu v106 · visual-explain Source evidence: /tmp reports + Tobatsu API readback