唱出來的那一段

用 MiniMax H3 做完整一首歌的唱歌對嘴 MV106 秒、30 段、同一套造型、同一個房間。 這份筆記只講三個真正的邊界—— 其餘都可以自由發揮,而我們一開始以為不行。

Part 4 · 先讀前三篇 模型配置、工作流差別、提示詞欄位結構、構圖與景別規則在 《MiniMax H3 本地實測》《影片產線實測》; 時間與加速在 《縮短時間的可能》。 本篇只談唱歌
2026-08-06 RTX 5090 ComfyUI 本地 106 秒 / 30 段 內部技術筆記

成品先看

Output
《星星糖糖》全曲 105.958 秒 · 30 段接成 · 1968×1104 原畫質(放 YouTube,站上不壓縮)。 音軌是原曲整段直貼、從未切開;畫面 30 段分別生成。 21 句字幕的時間戳來自字級強制對齊、文字用歌詞原文。

能做到這件事的關鍵,是 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 秒之後開始崩
含下一句的起音編造整句(重跑兩次都一樣,不是運氣)
最容易踩的一個 用強制對齊(FA)取句邊界時,兩句連續無停頓處會把前句尾音算給後句開頭。 照抄那個時間戳去切,段尾就含了下一句的起音 → 模型看到音檔有第四句、 歌詞只給三句 → 它把不存在的字編出來。 FA 不能單獨用,要跟 VAD/音高交叉檢查。
亂唱的那一支
亂唱的樣子。ASR 聽到「這柳葉彎彎彎,星星糖糖甜甜,都抓牢的緊」—— 最後五個字是編出來的。判準是「字數有沒有變多」,不是「辨識準不準」: 唱歌咬字讓 ASR 天生不準(它連原曲都聽成「星星堂堂」), 所以要抓的是總量變多連續編造一段,兩個都要看。
還有一種「間隙」不是間隙 哼唱(「嗯嗯嗯~」)在 FA 眼裡是間隙——因為 ASR 認不出無字音節。 直接對那段音訊做辨識,聽到的是持續的「啊啊啊…」,那裡有人聲FA 的間隙是「辨識器的沉默」,不是「音樂的沉默」; 照間隙處理會讓模型在原曲正在唱的地方閉著嘴。

邊界二:Shot 是「半個邊界」

Boundary 2

H3 支援在單次生成內切鏡——提示詞寫 [Shot 2] At 00:03.040, … 就會在那個時間點換鏡。切點精度非常好

四個 seed,同一個指定切點 3.040s
seed實際切點偏移內容(字數比)
208013.042s+2ms1.286 ✗ 亂唱
311012.917s−123ms1.071 ✓
422023.042s+2ms1.071 ✓
533032.917s−123ms1.214 ✗ 亂唱

切點準(±3 幀),但內容良率掉到 2/4。

同配置不放 Shot 是 2/2。所以 Shot 不是不能用,而是 抽卡成本集中在這裡——這就是「半個邊界」。 對策不是禁用它,是為有切點的段多給一次重抽預算, 然後用「字數有沒有變多」自動擋門。

⚠️ 反過來的錯也要避免:不要為了省抽卡把切點搬到短段。 音樂上長段才有空間放切點,經濟上短段的抽卡便宜—— 兩者方向相反,而照音樂放才是對的。

邊界三:段長不能超過多少

Boundary 3
官方訓練區間 124~362 幀(24fps)
段長幀數訓練區間內嘴型與音軌的偏移
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

下面四個都不是上述三個邊界造成的——它們是內容設計與抽卡的問題, 而它們的共同點是:所有自動指標都是綠的。

場景與歌詞牴觸
① 內容跟歌詞牴觸。 上排是第一版:白天教室、水手服。 而歌詞是「窩在被子裡滑手機/就我一個人賴在家/追劇追到眼皮重/ 抱著枕頭笑一笑/晚安了」——整首歌在床上、夜晚、家裡。 歌詞說「不出門也沒關係」,我們把她放在必須出門才會到的地方。 當時旋律偏差 0.09 半音、字數比 1.000、接縫 4.62、服裝一致性 2.4, 每一項都通過。因為那些指標量的都是「內部一致性」, 而一致地錯,在儀器上跟一致地對長得一模一樣。 下排是照歌詞重做的版本。
間奏的無聲歌詞
② 間奏在唱「無聲歌詞」。 上排是舊版:4.5 秒的間奏裡嘴一直開合, 可是那段沒有人聲。原因是間奏段用上一段的末幀接續, 而唱歌段的末幀嘴正張開在一個字的中間—— 「平順地接一張開的嘴」就是「繼續做唱歌的嘴型」。 寫「絕對不要做出唱歌嘴型」沒有用,那是否定式提示詞, 打不過首幀這個硬條件。下排是修好的: 把嘴型寫成軌跡(「在最初幾幀內自然閉合」,與張開的首幀相容), 並給一個正向動作(閉上眼睛靠向抱枕再睜開)。
三隻腳
③ 三隻腳。 抱膝而坐讓大腿、小腿、膝蓋全部折疊重疊; 加上奶油色襪子與奶油色被子撞色——一片被子皺褶被解讀成一條穿襪子的腿。 配色是分割陷阱,不只是美學問題。 診斷法:看它何時出現。第 0 幀就在=初始生成的錯(換 seed); 中途長出來=漂移或運鏡累積(縮短段長)。這支是第 0 幀就在。
兩個人
④ 換個 seed 變成兩個人。 同樣的姿態與寬取景,換 seed 之後 第 0 幀出現兩張臉。換 seed 換掉的是「哪一種錯」,不是「有沒有錯」—— 兩支寬取景版本都在第 0 幀出錯而錯法不同, 所以風險因子是畫面裡有多少身體需要被畫對,不是特定 seed 的運氣。
收緊取景之後
解法在鏡頭,不在姿態。 一開始的想法是「禁止拍腿」, 但那是用限制換安全,會讓身體語言整體變少。 真正的槓桿是收緊取景:頭肩佔畫面一半以上時,腿根本不入鏡, 不入鏡的肢體不會被畫錯,而姿態一個字都不用改。 12 幀密掃全部乾淨。

30 段跨 106 秒,守得住什麼

Consistency
30 段中央幀
30 段各取中央幀。A=主歌、B=副歌、C=副歌重複與尾段。
誠實版
項目
守住 睡衣、髮飾、項鍊、臉、髮型、牆上燈飾、檯燈、窗外夜景、平板、糖果罐
30 段沒有一段換衣服(靠臉部特寫+全身造型圖兩張參考圖)
守不住 房間佈局會漂——窗戶方位在段間換邊、床的朝向跟著變。 場景鎖鎖住「有哪些東西」,沒鎖住「它們在哪」
② 個別運鏡仍會把景別拉得比預期遠。
一個指標的邊界 這一段的亮度全距 51.5、飽和全距 61.6,比日間場景大很多。 但那不是缺陷:歌詞明確寫著「窩在被子裡滑手機」, 所以暖檯燈/手機白光/平板藍光三種光源輪替是內容要求的儀器測不到內容,所以也不該讓儀器替內容做判斷。

怎麼復現

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 驗收是為了「沒有人看著也能跑」而存在的, 不是這件事的門檻。