local proof / raw materials from worker3

这次把每段原片都摆出来

我前面没先把 worker3 的原始产物拉回来,这是错的。现在这页按真实文件链路贴:Seedance 原片、TTS、sync audio、lipsync 输出、final segment。当前结论要收窄:Seedance 请求确实传了 ref audio;后处理又丢掉原片音轨,贴了另一条 sync_audio,再跑第二层 lipsync。音画错位从这里开始。

当前结论

root cause

后处理改了音轨和时间

Seedance-2-Omni any2video 请求里有 ref_audio_url。它返回的 seedance.mp4 也自带音轨。后面我们又把它的音轨扔掉,另做 sync_audio,再跑第二层 lipsync。现在看的错位主要来自这一层。

proof direction

先按原片校准,再决定要不要换 TTS

无台词动作段直接拼原片。说话段先看 Seedance 原片的嘴和音是否已经自洽;如果要换成干净 TTS,必须按原片嘴部真实说话起点和时长处理,不能再用手写 offset 硬贴。

w1 / a0 是最简单的规则:无台词动作段直接整段拼 Seedance 原片。它不进 TTS,不进 lipsync,不替换音轨,不裁成别的节奏。

视频到底怎么出的

worker3 / out_plan_coord

不是本机凭空出的

当前 proof 的真实中间产物在 worker3:/tmp/kamila-hook-local-proof-agent-plan/out_plan_coord/。我已拉回本机:/tmp/kamila-hook-local-proof-agent-plan/worker3_out_plan_coord/

review target

这页只为定位后处理

每段都按同一顺序看:先看无音频原片,再听 TTS / sync audio,再看 lipsync 输出,最后看 final segment。哪里开始错,就在哪里修。

最终成片

当前坏 proof 最终片。它经过了第二次 lipsync 和后混音。
base 拼接版本。用于看进入最终混音前,段与段的拼接有没有已经错。
诊断候选:5 段 Seedance 原片直接拼,31.441s。它证明第二层 lipsync 不是必要条件;但如果最终要求使用干净 TTS,还需要单独处理 TTS 与原片嘴部节奏的差异。

当前不能再走的路

speech_start_offsetdelay_audio、手填 lipsync 坐标、第二次 sync-3 这一整层先停。它没有用 Scribe 或真实字级时间,只是在猜每句应该从哪里开始。

下一步由 %271 主导本地 proof:保留原片动作,重新判断每段应该用 Seedance 自带音,还是按真实嘴部区间贴干净 TTS。没有 owner 批准前,不动 template / snapshot / prod。

到底有没有传音频

Seedance request

有,传的是 ref_audio_url

以 s3 为例,s3_coach_surprised.seedance.request.json 里有 input.ref_audio_url[0],指向同段 Fish TTS wav。请求模型是 funpub-seedance-2-omni,实际响应里执行模型是 byte-seedance-2-omni-asset

second layer

后面又传了另一条音频给 lipsync

s3_coach_surprised.lipsync.request.json 里,video_url 是 Seedance 原片,audio_url 是后做的 sync_audio.wav。这就是第二次对口型层。

分段时间

Seedance 原片TTSsync audiolipsync 输出final segment先看什么
a0_silent_setup5.085s---5.033s滑冰动作和环境/foley 是否错位。
s1_coach_scolds6.083s3.622s3.772s3.792s3.800s教练说话是否一开始就对口型。
s2_kamila_replies7.082s5.573s6.023s6.042s6.037sK宝音频是否贴到了正确动作上。
s3_coach_surprised6.083s4.644s5.294s5.333s5.333s你指出 15-17s 没人动嘴,重点看这一段。
s4_kamila_close7.082s6.177s6.727s6.750s6.734s19s 后音频是否早于画面动作。

空白错位实测

这次本地 proof 没跑 Scribe。它拿 Fish TTS 的结果,再手写 speech_start_offset_secondssync_audio。下面是实际量出来的声音进入时间。s3 是最大问题:后处理音频比 Seedance 原片自己的声音早了 2.586 秒。

Seedance 原片声音进入TTS 声音进入sync_audio 声音进入sync_audio 相对 Seedance判断
s10.194s0.969s0.177s-0.017s接近原片,但这不是靠 Scribe 算的。
s21.264s0.722s0.453s-0.812s后处理声音早了。
s33.239s0.302s0.653s-2.586s明显错位。15-17s 的问题在这里。
s40.086s0.000s0.571s+0.485s后处理声音晚了。

逐段原片 / 音频 / 对口型 / 最终切片

原始请求也贴出来

Seedance requestLipsync request

这里主要给 %271 查“这段到底引用了哪条音频、哪个视频”。