2026-08-24 → 08-27 · 短视频产线 badcase 复盘

视频 Badcase 台账:一条真片,挖出一整批坑

08-24 一条快车道成片同时犯了三四个「说修过又复发」的问题。顺着一条条挖到根、 都在真库 / 真 ffmpeg / 真数据上量过。下面一张表看完——现象 → 根因 → 修复 → 状态。

口径 2026-08-27 express 快车道产线 store-workbench 内部台账 · noindex
13
badcase 总数
9
已修复·已上线
2
部分/靠采集补
2
外部·已恢复/模型边界
◆ 元教训(这批坑的共同根) express 是 2026-08-15 新写的快车道,重写了出片功能,却没继承老复刻线(Workflow 仓) 踩坑攒下的防护——老线修过的坑,在 express 上原样复发。 已知复发点:①底片纯净库 + 字幕验收闸(老线 #206/#213)→ 字幕重叠; ②音轨格式统一后再拼 → 无声音;③动作闸不放行缺标注候选 → 画面对不上。
通则:改 express 任何一环之前,先查老复刻线在同一环有没有踩过坑、有没有防护,有就搬过来。

Badcase 全表

状态口径:绿=已修复已上线 · 黄=部分/靠持续采集 · 紫=外部依赖。「改在」列是修复的 PR / 位置。

#现象(看到什么)根因(为什么)修复(怎么修)状态改在
◆ 已修复·已上线
1 后面没声音成片音频流只有 ~7 秒,视频却 31 秒,后半段全程没声 音轨拼接把主播格 WAV素材格 MP3 混用 ffmpeg concat 解复用器——它要求同编码,混格式把后面的按第一个硬解,音轨只剩第一格。silencedetect 抓不到(是「音频流提前结束」不是静音)。 拼前把每格统一成 48k/立体声/PCM WAV;拼后核总长;交付前加「音频流时长 vs 视频时长」终检 已修上线 PR #562
io.concat_audio
2 同一个人前白后黄 / 一条片里换装跳戏主播白衬衫→黄裙,场景也变 这家店把成片(一条 44s 里就有多套衣服/多场景)登记成了出镜底片;而排主播镜时轮转用全部底片,一条片就混了不同衣服/场景。 ①一条片锁一条底片(job_id 播种,同片一致)②把脏底片软删移出出镜池(可回滚) 已修 PR #558
+ 底片软删
3 字幕重叠主播格从头到尾两层字幕叠着;素材格干净 两层:①express 字幕 overlay 用闭区间,相邻字幕在交界处同时显示一帧(切换闪);②主播底片本身烧死了原字幕/店招(成片当底片),再烧一层新字幕 = 全程双字幕。 ①overlay 改左闭右开(gte·lt),边界不再双显 ②脏底片软删移出池(底片烧死的字代码去不掉,只能换干净生料) 已修 PR #574
+ 底片软删
4 返修在「口播」这步崩溃重新制作显示不通过 / 生产会话中断 返修按剩余预算把目标时长压很短 → 兜底稿算出「需要字数 ≤ 0」→ 一条正文都不生成 → 空 body → 校验抛 缺 body 崩。全新提单目标时长足不触发,只有返修压短才踩 兜底稿保证至少一条正文,目标再短也不产空 body 已修上线 PR #568
fallback_draft
5 下午整批生成失败看板「云端·失败 / 生产会话中断」 工厂机 PRODUCER_ENGINE 跑的是老线 orchestrator 不是 express,死在老线独有的 fetch(下抖音源片被风控)/ cloud_tts。当天所有快车道修复在这台机器上根本没生效。 PRODUCER_ENGINE=express(一条 Fly secret) 已切上线 Fly secret
akke-video-worker
◆ 部分修复 · 靠持续采集补
6 画面和口播对不上讲铰链/台面,画面配了泛柜类或不相干工序 三叠加:①词表把「板材/封边」放错档 ②打分只看字面覆盖、不看画面在做什么 ③动作闸「候选缺标注就放行」的口子 ④库覆盖不足:柜类可用素材仅 109 段,其中台面 0 / 背板 0 / 滑轨 1——讲这些必然配不上。 词表归位 + 动作闸收紧(缺标注/对不上就退主播镜);收割机补柜类细工序素材(台面/铰链/滑轨…) 检索侧已修·覆盖靠采集 PR #529/#537
+ 收割机
7 柜类素材库不对口柜类只占 3%,是画面对题的天花板 库里柜类素材太少(109 段可用、细工序几乎空白)。收割机原本停摆(无效 GH_TOKEN → 私有仓 clone 失败 → 崩溃循环)+ 队列不自走。 换有效 token → 云端 nrt 跑通、写回库(柜类 109→180);队列自推进 + 每日定时采集(Workflow PR #245) 跑通·持续补 akke-broll-harvester
Workflow #245
◆ 外部依赖 · 已恢复
8 配音时「云端失败 / 心跳断了」生成口播这步挂 5 分钟 fal 配音服务短时抖动——n8n 窗口和 fal API 健康检查都秒回,卡在 fal 队列实际生成迟迟不回,拖断心跳判失败。间歇性、非常态。不是代码,也不是无声音那类问题。 有重试+退避兜短时抖动;等 fal 恢复即正常(实测已恢复,配音一次过) 外部·已恢复 fal / softie-n8n
◆ 08-25/26 复审新挖(好电印象白衫/黄裙两条)
9 画面飘黄团块 / 马赛克主播镜里一坨黄绿色团块飘动、一闪一闪,人物出现时明显 出镜源视频 8887.mp4(好电印象上传的黄裙书架底片)原始录制就烧死了这个飘动黄团块(像镜头反光/压缩坏块),口型+拼接如实保留。成片 vs 源同时刻并排坐实——团块两边都有。不是口型、不是代码、不是当天改动。 把脏源 8887 软删(sw_assets status ready→failed,带备份可回滚),出镜池只留干净的 99/101;建议好电印象重传干净版 已修(软删) sw_assets 软删
45a8668f
10 返修「越修越差」反馈画面对不上,返修后反而更不对题:「背板加厚」配了划纸箱的画面 返修反馈没指到时间点 → 定位不到格 → 兜底「整条重做」--from script 连稿子一起重写;新稿把匹配带偏(原稿「柜体背板直接上九毫米」配到真背板,重写成「背板加厚」后配到纸箱)。生成通道首版是好的,是返修通道把好片 roll 坏的。 无时间点的 visual_mismatch 改为重挑全部素材格 + 排除上一版用过的段--from plan),稿子/配音/主播镜不动;比整条重做省,且不带偏匹配。挑不到达标的退主播镜 已修上线 PR #606
revise/produce/daemon
11 手划过脸时手指消失人物手/手指划到嘴前,指尖变糊、半透明、和嘴唇糊在一起 fal 口型模型 lipsync-2-pro 逐帧重绘嘴部区域,手指挡到嘴前时被一起糊掉。源视频手指清晰(源 vs 成片已坐实),一过口型就化。是模型能力边界,不是代码、不是脏源。 不 hack 流水线(那是 whack-a-mole)。素材层规避:出镜底片别让人在嘴前比划手势(拍摄/选片避开);可选另排「手过嘴」上传检测闸 外部·模型边界 素材规避
lipsync-2-pro
12 结尾字幕和口播对不上字幕逐渐滞后口播,结尾差近一秒(13s滞后~0.2s→33s~0.8s) 用 ASR 词级时间戳坐实是逐渐累积漂移(时间轴慢~3%)。字幕烧在原始配音 cue 时间轴、视频每格 conform_frames 钉到整数帧,但主播格音轨用 fal 口型返回的原生时长(每格差最多 0.35s、偏短)——唯一没锁在原始时间轴上的就是它,主播镜越多累积越大。 conform_audio_seconds:拼音轨前把每格音轨也钉到和画面同样的帧时长(短补静音/长裁尾),音频/画面/字幕三条边界锁死同一轴;主播格内语音照旧对齐、只调尾部静音,不伤口型 已修上线 PR #609
io+produce
◆ 08-27 复审再挖(原木奶油风·已端到端验证)
13 中段字幕/画面比口播早 ~1.7s和 #12「结尾滞后」相反:这条是中段超前、头尾对齐,方向相反、不同根因、改的文件也不同 和 #12 不同轴。字幕断句 plan_cues 先按字数比例估每段时长、再逐点吸附最近静音(容差 1.2s)。字数估累积漂移,中段边界最坏偏近 2s,一超过容差就吸不到正确静音、退回偏掉的估计值。ASR 词级时间戳坐实。非回归:plan_cues 自 #333(08-15)没动,是 #562 补好音频 + broll 配上对题画面,把这个一直存在的估时误差从「听不见/看不见」显形。 逐点吸附改全局 DP 对齐:在「各段≈字数比例」约束下给每个边界挑单调静音、让全局段时长误差最小;退回估计值付软代价(等价老容差、但全局择优非逐点贪心),每边界只在估计 ±3s 内找静音挡跨句误吸。字幕和画面共用这组 cue、一起对齐。 已修上线·已验证 PR #634
steps.plan_cues

字幕重叠 & 前白后黄:同一个根 —— 底片不是「干净生料」

这两个问题看着不相干,其实是同一件事:这家店登记的主播底片是发布过的成片,不是原始录像。

⚠️ 底片审计结论(8 条 = 4 个视频各登记两次) 干净生料(留):小黄·白衬衫工厂(单场景无字幕)· 白裙·展厅(单场景无字幕)。
脏成片(已软删移出池,可回滚):44 秒多人多场景合集 · 黄裙带「有大有小」店招水印那条。
干净底片=本人对镜说话的原始录像,从没做过后期(无字幕/花字/店招/多场景)。 成片当底片 → express 再烧一层字幕就双层重叠、一条片里还换装。软删走 sw_assets.status: ready→failed, 资产行和视频都没删,随时改回 ready 还原。
◆ 历史借鉴(老线怎么修的) 老复刻线 2026-08-11 同样字幕叠加事故,用底片纯净库(入库预擦)+ 字幕验收闸check_plate_subtitle.py 检出即红)修的。 两条血泪教训:①别用自动擦除(三道机检全绿,照样把「手」抹平错 4 个版本)——验收拦截才是可靠防线; ②量字幕上沿要量黑描边不是白字(差约一个描边宽)。express 缺这套闸,所以复发。

部署 & 验证状态