唱出來的那一段
用 MiniMax H3 做完整一首歌的唱歌對嘴 MV: 106 秒、30 段、同一套造型、同一個房間。 這份筆記只講三個真正的邊界—— 其餘都可以自由發揮,而我們一開始以為不行。
成品先看
Output能做到這件事的關鍵,是 H3 的音訊與畫面同源。
把歌曲片段當參考音餵進去,模型會重新唱一遍並讓嘴型跟著它自己的發音走—— 所以嘴型天生就對,不需要事後對嘴。代價是它唱的是它自己的聲音, 所以成品音軌要換回原曲;而兩者的時間軸實測只差 +11.6ms,直接對貼就好。
先講結論:只有三個邊界
TL;DR| # | 邊界 | 做錯的症狀 | 怎麼守 |
|---|---|---|---|
| 1 | 切段邊界與提示 | 模型開始亂唱:唱完手上的字之後自己編(「輕輕的躍躍起」「都抓牢的緊」) | 歌詞一定要寫進提示詞;段落切在句邊界、句尾不可留太多空白 |
| 2 | Shot 有重抽成本 | 同樣配置,有的 take 唱得很好、有的亂唱 | 照音樂放切點,然後多給一次重抽預算(實測良率 2/4) |
| 3 | 段長上限 | 8 秒之後嘴型與音軌來回擺動 ±900ms | 一段 ≤11.5 秒(277 幀);硬上限 15.08 秒(362 幀) |
其餘都是自由的,而我們一開始以為不行。
鏡頭可以自由運動、段內可以切鏡、人物的姿態可以每段不同、 間奏可以延續主歌的分鏡——這些都不是邊界。 一整天下來我們自己加了七條不存在的限制, 每一條都讓畫面更呆板一點,而沒有一條是量測要求的。
邊界一:切段與提示,避免亂唱
Boundary 1機制:模型的目標是把提示詞裡的歌詞唱完,它會把那些字 攤滿整支影片、完全不甩伴奏。所以:
| 句尾之後的空白 | 結果 |
|---|---|
| 0.09 秒 | 全段可用(旋律偏差 0.094 半音) |
| 0.38 秒 | 可用 |
| 1.16 秒 | 2.7 秒之後開始崩 |
| 含下一句的起音 | 編造整句(重跑兩次都一樣,不是運氣) |
邊界二:Shot 是「半個邊界」
Boundary 2H3 支援在單次生成內切鏡——提示詞寫 [Shot 2] At 00:03.040, …
就會在那個時間點換鏡。切點精度非常好:
| seed | 實際切點 | 偏移 | 內容(字數比) |
|---|---|---|---|
| 20801 | 3.042s | +2ms | 1.286 ✗ 亂唱 |
| 31101 | 2.917s | −123ms | 1.071 ✓ |
| 42202 | 3.042s | +2ms | 1.071 ✓ |
| 53303 | 2.917s | −123ms | 1.214 ✗ 亂唱 |
切點準(±3 幀),但內容良率掉到 2/4。
同配置不放 Shot 是 2/2。所以 Shot 不是不能用,而是 抽卡成本集中在這裡——這就是「半個邊界」。 對策不是禁用它,是為有切點的段多給一次重抽預算, 然後用「字數有沒有變多」自動擋門。
⚠️ 反過來的錯也要避免:不要為了省抽卡把切點搬到短段。 音樂上長段才有空間放切點,經濟上短段的抽卡便宜—— 兩者方向相反,而照音樂放才是對的。
邊界三:段長不能超過多少
Boundary 3| 段長 | 幀數 | 訓練區間內 | 嘴型與音軌的偏移 |
|---|---|---|---|
| 7.29 秒 | 175 | ✓ | +11.6ms 全程不變 |
| 11.54 秒 | 277 | ✓ | +11.6ms 全程不變 |
| 16.50 秒 | 396 | ✗ 超出 34 幀 | 擺動 ±900ms |
0, 0, 0, 0, −627, −882, +12, −801 (ms)——
會漂走、又對回來、再漂走。單向累積可以用固定補償表修,來回擺動不行,
只能縮短段長避開。
而這與切鏡無關:不放 Shot 的版本同樣超標,歸因已分離。
此外,段長超標時會有一個很容易誤判的副作用:音高看起來偏差 4~6 個半音, 像是整段走音。實際上那是時間漂移的投影——同一個時刻比對到了不同的音。 病因是時間,症狀顯示在音高上。
有問題的樣子
Failures下面四個都不是上述三個邊界造成的——它們是內容設計與抽卡的問題, 而它們的共同點是:所有自動指標都是綠的。
30 段跨 106 秒,守得住什麼
Consistency
| 項目 | |
|---|---|
| 守住 | 睡衣、髮飾、項鍊、臉、髮型、牆上燈飾、檯燈、窗外夜景、平板、糖果罐 30 段沒有一段換衣服(靠臉部特寫+全身造型圖兩張參考圖) |
| 守不住 | ① 房間佈局會漂——窗戶方位在段間換邊、床的朝向跟著變。
場景鎖鎖住「有哪些東西」,沒鎖住「它們在哪」。 ② 個別運鏡仍會把景別拉得比預期遠。 |
怎麼復現
Reproduce先分清楚:哪些是工具,哪些是人耳就夠。
下面第 1 步與第 5 步用到的是輔助工具,不是必要條件—— 它們存在的理由是「這條產線是無人看管自動跑的」。 如果你是人在剪,用耳朵切歌就夠了: 句子在哪裡結束、尾音之後留了多少空白、模型有沒有唱出多餘的字, 這三件事人耳一聽就知道,而它們正好就是三個邊界要守的東西。
我們用的工具是 QwenASR + Qwen3-ForcedAligner 的字級對齊 (取句邊界)與辨識(驗收字數)。 若你需要自動化「切點驗證」或「有沒有亂唱」, 任何有字級對齊能力的辨識模型都可以替代—— 重點不是哪一個模型,是時間戳與文字要分開拿: 時間戳用對齊結果,文字用歌詞原文(辨識器會把「星星糖糖」聽成「星星堂堂」, 拿它的輸出當字幕就錯了)。
1. 取句邊界。(人耳可替代) 用強制對齊取每句的起訖,不要餵 context (辨識器會幻覺、把時間軸整個爆掉)。再與音高/VAD 交叉檢查, 特別是「兩句連續無停頓」的地方——那裡對齊器會把前句尾音算給後句開頭。 人在剪的話:直接聽,句子結束的位置人耳比對齊器準, 而且不會犯「把尾音歸給下一句」這種錯。
2. 排切段表。 一段 ≤277 幀;段尾不可觸及下一句首字; 句尾之後的空白越小越好;音檔長度=影片幀數對應的整數 samples(用 WAV 不要 MP3); 下一段的起點=上一段的實際結束點。
3. 鎖身分。 兩張參考圖——臉部特寫(臉的細節來自構圖不是解析度) +全身造型圖(純色背景)。場景用第二主體鎖住。
4. 生成。 每段給一個運鏡意圖;需要段內切鏡就給 ≥2 個 Shot (只有 1 個 Shot 時模型不理時間戳)。長片一定要在採樣與解碼之間清一次 VRAM。
5. 驗收。(人耳/人眼可替代)四個維度:旋律(音高形狀偏差 <0.5 半音)、 時間軸(能量包絡分段互相關 ±80ms)、內容(字數比 ≤1.20 且無連續編造)、 解剖(人眼數肢體,沒有腳本可以代替)。不合格換 seed 重抽。
6. 接間奏。 用上一段的末幀往下接,不生音訊 (成品音軌用原曲,間奏段的音訊從來不會被用到)。 接縫從 52 倍基準降到 5 倍。記得給正向動作,不要只寫「不要唱歌」。
7. 拼接與後製。 音軌用原曲整段直貼。 拼接前逐段核對實際幀數——少一幀,它之後全部相對音軌漂移,而成品不會報錯。 最後超解析度放大、燒字幕(時間戳用對齊結果、文字用歌詞原文)。
一句話版本。
歌詞要寫進提示詞;一段 10~15 秒、切在句邊界、句尾不要留空白。 剩下的都可以自由發揮。
而這三件事人耳都聽得出來—— 字級對齊與 ASR 驗收是為了「沒有人看著也能跑」而存在的, 不是這件事的門檻。