08-24 一条快车道成片同时犯了三四个「说修过又复发」的问题。顺着一条条挖到根、 都在真库 / 真 ffmpeg / 真数据上量过。下面一张表看完——现象 → 根因 → 修复 → 状态。
口径 2026-08-27
express 快车道产线
store-workbench
内部台账 · noindex
状态口径:绿=已修复已上线 · 黄=部分/靠持续采集 · 紫=外部依赖。「改在」列是修复的 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 |
这两个问题看着不相干,其实是同一件事:这家店登记的主播底片是发布过的成片,不是原始录像。
sw_assets.status: ready→failed,
资产行和视频都没删,随时改回 ready 还原。
check_plate_subtitle.py 检出即红)修的。
两条血泪教训:①别用自动擦除(三道机检全绿,照样把「手」抹平错 4 个版本)——验收拦截才是可靠防线;
②量字幕上沿要量黑描边不是白字(差约一个描边宽)。express 缺这套闸,所以复发。
10f88b1)后,用全新提单真产一条「原木奶油风」(job 2640e8e4,确跑在修复代码上),ASR 词级起点 vs 成片 alignment cue 起点逐段核——8/8 段全部 ≤0.24s、平均 0.13s(修复前中段最坏 ~1.7s)。这是本批首条在真实成片上端到端验过的修复,不是只离线验。