影片生成台
只做一件事:讓已經定死的畫面動起來,並且留下可追溯的記錄。
影片模型在這裡負責三件事:動作、運鏡,以及把旁白唸出來。主體長相、服裝、場景、色板、光線、構圖、螢幕文字在 S1/S2 已經鎖死,這一層不允許重新創作。它一旦開始"發揮",整條片子的一致性就崩了。
旁白不再走獨立配音。 台詞寫進提示詞,由模型直接唸——這是這套流程和傳統做法最大的不同,也是這一層最需要盯的地方。
一、進來的前提
四樣東西缺一不可,缺一樣就退回上一段:
| 要件 | 在哪 | 缺了會怎樣 |
|---|---|---|
03-生成清單.md | short-video-prompt 產出,且 G2 已過 | 不知道該出幾段、每段多長 |
| 每段台詞原文 | 清單的逐段提示詞裡 | 模型不知道唸什麼,會自己編 |
| 資產圖 / 首幀 | 04-素材/01-資產圖/、04-素材/02-首幀/ | 主體每段一個樣 |
KIE_API_KEY | 環境變數 | 提交不了任務 |
沒有首幀不等於不能做:純氛圍、空鏡、轉場可以直接文生。但有主體出現的段落必須有圖,這是硬線。
沒有台詞的段落可以不做旁白,比如空鏡、純音樂段。但一旦這段要說話,台詞就必須進提示詞——這是現在唯一的聲音來源。
二、三種模式,互斥不可混用
平台一個請求只能選一種,字段越界就變成另一個模式,任務會直接失敗。
| 模式 | 必填 | 什麼時候用 | 明確禁止 |
|---|---|---|---|
text 文生 | prompt | 空鏡、氛圍、純背景光效、轉場 | 帶 first_frame_url / last_frame_url |
first 首幀圖生 | prompt + first_frame_url | 預設走這個:需要鎖定起始構圖 | 帶 last_frame_url |
first-last 首尾幀 | prompt + 首幀 + 末幀 | 需要同時鎖起始和結束、保證相鄰段能接 | — |
清單裡的「參考圖」模式怎麼落
short-video-prompt 的清單模式列可能是「首尾幀 / 參考圖 / 文生」。當前模型沒有參考圖模式——reference_image_urls 這類字段在這個模型上不開放。所以要做一次映射:
| 清單寫的是 | 實際提交成 | 說明 |
|---|---|---|
| 首尾幀 | first-last | 直通 |
| 參考圖 | first | 把參考圖當首幀用,鎖起始構圖 |
| 文生 | text | 直通,但只對無主體鏡頭成立 |
這一步不是妥協,是能力邊界。 如果某段確實需要"參考圖鎖主體 + 自由構圖",只能靠首幀把構圖也一起鎖掉,或者回到 S2 改切段。
三、參數口徑
| 參數 | 取值 | 預設 | 說明 |
|---|---|---|---|
duration | 4–15 整數秒 | 5 | 超 15 拆鏡,低於 4 交後期做動效或裁切 |
aspect_ratio | 9:16 / 16:9 / 1:1 / 3:4 / 4:3 / 21:9 / adaptive | 9:16 | adaptive 只給文生,圖生必須寫死比例 |
resolution | 480p / 720p | 480p | 預設控制生成成本;需要正式交付清晰度時顯式傳 720p |
generate_audio | true / false | true | 不能關。旁白就在這條音軌裡,關了等於沒聲音 |
web_search | true / false | false | 只對文生可用,一般不用 |
三條容易踩的:
- 比例必須與實際輸出一致。模型返回明顯不符比例或帶黑邊的結果,判質量失敗,不許 letterbox 之後當成片交上去。
- 音頻必須開。旁白、環境音全在這一軌裡。只有純空鏡確實不需要聲音時才用
--no-audio。 duration寫整數。傳 5.5 會被拒。
四、七步流程
① 讀清單 → ② 定模式 → ③ 寫影片提示詞 → ④ 提交 → ⑤ 輪詢下載 → ⑥ 媒體體檢 → ⑦ 抽幀質檢
① 讀清單,先判能不能跑
逐段核對三件事,對不上就停下來問,不要猜:
- 每段的
duration是否在 4–15 之間(超了先拆) - 聲明的首幀檔案是否真的存在
- 引用的素材編號是否都在資產清單裡
② 定模式
按第二節的表逐段定,一整個項目盡量統一。混用不是錯誤,但混用會讓相鄰段銜接更難看。
③ 寫影片提示詞
按 references/video-prompt.md 的七段結構寫。兩條核心:
- 只描述"變化",不重新描述"是什麼"。 首幀已經給了模型產品長什麼樣,提示詞再描述一遍,等於讓它按文字重畫,一致性立刻丟。
- 台詞照抄稿子,一字不改。 旁白現在由模型直接唸,台詞原文必須進提示詞。改一個字,字幕就對不上音。
④ 提交
python scripts/kie_seedance.py create \
--prompt "…" --mode first \
--first 04-素材/02-首幀/S01_f01_v1.png \
--duration 6 --out 04-素材/03-片段/S01_v1.mp4 --wait
提交成功後立刻把 taskId 和指紋寫進台賬,再去做別的事。先做後記,中途斷了就找不回來。
④-2 整條片子批次跑(預設 5 路並發)
一段一段序列跑,6 段就是半小時以上,而且大部分時間在等。批次並發跑,總時長約等於最慢的那一段。
# 先預演,把拼裝好的請求體看一眼
python scripts/kie_seedance.py batch --tasks tasks.json --out-dir 04-素材/03-片段 --dry-run
# 確認後真跑,預設 5 段同時
python scripts/kie_seedance.py batch --tasks tasks.json --out-dir 04-素材/03-片段
# 被限流就降
python scripts/kie_seedance.py batch --tasks tasks.json --out-dir 04-素材/03-片段 --concurrency 2
任務表格式見 assets/batch-tasks-example.json,每段一條,mode / first / last / duration / prompt 含義與單條命令一致。
並發不是越快越好,它有個真實的坑:台賬會被寫亂。
5 段同時跑完,如果每段一結束就去改 00-生成台賬.md,五次寫入會互相覆蓋,最後只剩一段的記錄。正確做法是:
① 批次跑完,收下匯總裡的 items(已按清單順序排好)
② 一次性回寫台賬:五段一起寫,而不是跑一段寫一段
③ 回寫後立刻核對:清單幾段,台賬就該有幾行
如果你更想邊跑邊記,那就把並發降到 1——序列 + 邊跑邊記,是唯一不會寫亂的方式。這個取捨自己定,但不能既並發又零散寫。
被限流的表現是 code != 200 或 HTTP 429,不是"畫面變差"。看到這類報錯先降並發,不要改提示詞。
失敗不中斷:一段掛了,其餘照跑,最後看匯總裡的 failed。想要"一錯就停"加 --stop-on-error,它會停止提交新任務,已經在跑的不受影響。
⑤ 輪詢下載
--wait 會一直等到下載完成。也可以分開做:create 拿到 taskId → wait --task-id。
輪詢間隔從 6 秒起逐步拉長到 30 秒,上限 15 分鐘。超時不代表失敗,先查狀態再決定。
⑥ 媒體體檢(腳本判)
# 有台詞的段:音軌必須存在
python scripts/inspect_clip.py --file 04-素材/03-片段/S01_v1.mp4 \
--ratio 9:16 --duration 6 --expect-audio
# 無台詞的空鏡:應當沒有音軌
python scripts/inspect_clip.py --file S02_v1.mp4 --no-expect-audio
查五件客觀事實:檔案在不在、大小是否正常、時長對不對、比例對不對、音軌在不在。通過只說明"下到了能播的檔案",不說明畫面能用,更不說明台詞唸對了。
音軌這一項現在比以前重要:旁白就在這條音軌裡。沒有音軌 = 這段沒聲音,等於廢片;有音軌但唸錯字,腳本查不出來,只能聽。
⑦ 抽幀質檢 + 聽聲(人判)
畫面:抽至少三個點(開頭、中段、結尾),按 references/clip-review.md 的七項看。
聲音:旁白現在由模型唸,所以每一段帶台詞的片段必須聽一遍,對照原稿核三件事:
| 聽什麼 | 判據 |
|---|---|
| 有沒有漏句 | 原稿幾句,就應聽到幾句 |
| 有沒有唸錯字 | 關鍵詞、品牌名、數字對不對 |
| 有沒有多餘聲音 | 不該出現的配樂、旁人、雜音 |
唸的和稿子不一致時,不要將就。 兩種處理:重出這一段,或改字幕去貼合實際唸的內容。唯一不能做的是照原稿打字幕——觀眾聽到的和看到的對不上,比唸錯本身更傷。
這一項必須聽。含糊關鍵字可重複轉寫至少三次輔助比對,逐句人工終審後把結論寫入 04-素材/00-台詞定案.json;見 references/clip-review.md。
五、三層狀態,別混成一個
| 狀態 | 誰判 | 含義 |
|---|---|---|
| 媒體通過 | 腳本 | 檔案完整、參數符合、音軌在 |
| 畫面通過 | 人看 | 主體沒變、沒畸形、能接上下一段 |
| 台詞通過 | 人聽 | 台詞唸全了,關鍵詞沒唸錯 |
三個都過,狀態才能寫「質量通過」。
把"下載完成"當"可用",是這條鏈上最常見的錯誤——片子進了剪輯台才發現第 4 段主體變了,前面白拼。現在多了一層:畫面都對、台詞唸錯一個字,整段還是廢的,因為字幕沒法對。
台詞這層最容易被跳過,因為它需要安靜地戴耳機聽,而不是掃一眼。
六、台賬:寫在 04-素材/00-生成台賬.md
一段一行,記六項:請求指紋、模式、taskId、狀態、輸出檔案、失敗原因。
台賬的作用不是留檔,是防重複提交。同一條片子隔一天回來接著做,讀台賬就知道哪段已完成、哪段提交過沒下載、哪段失敗過。
規則見 references/task-ledger.md,四條摘要:
- 狀態是「質量通過」且檔案在 → 跳過
- 有 taskId 且狀態是「等待中 / 生成中」→ 只查詢,不新建
- 狀態是「生成成功,待下載」→ 只下載;URL 過期就查同一 taskId 換新 URL
- 狀態是「失敗」→ 不自動重提,等用戶明確說重做
七、失敗怎麼處理
先定位是哪一層壞的,再決定改什麼。 別一上來就改提示詞。
| 現象 | 病根 | 改哪裡 |
|---|---|---|
| 主體變形、產品變樣 | 沒有首幀,或首幀本身就不對 | 補首幀 / 換首幀 |
| 畫面抖、閃爍 | 動作寫得太多 | 刪到只剩一個動作 |
| 文字錯亂、多出手指 | 要求模型寫文字/複雜手部動作 | 文字交後期,手部動作簡化 |
| 比例不對、帶黑邊 | 參數與返回不符 | 判失敗,重出,不裁黑邊 |
| 段與段接不上 | 末幀與下一段首幀不一致 | 用首尾幀模式,或補交接幀 |
| 漏唸、只唸半句 | 該段台詞字數超出鏡長 | 砍台詞,或把這一段拆兩段 |
| 唸錯字、唸成別的詞 | 生僻字、多音字、品牌名夾在長句裡 | 換成常用說法;品牌名單獨成句 |
| 台詞被配樂蓋住 | 提示詞沒寫"無配樂"或不蓋人聲 | 補一句聲音約束,重出 |
| 完全沒聲音 | 誤用了 --no-audio,或音頻沒開 | 檢查提交參數,重出 |
| 提交就報錯 / 429 | 並發放太高被限流 | --concurrency 2 重跑,別改提示詞 |
| 同一段反覆失敗 | 有多個變數同時變 | 一次只改一個變數 |
台詞類問題佔了一半以上。 這類問題的共同點是:畫面看著挺好,只有聽才發現。所以每段必須聽完再定通過。
返修時一次只改一個變數。同時改提示詞、時長和首幀,即使成功了也不知道是哪個起了作用,下次同樣的問題還會再犯。
詳細診斷見 references/clip-review.md。
八、邊界
- 不重新設計視覺:主體、場景、色板、光線在 S2 已鎖定,這裡只讓它們動起來
- 不改台詞文本:原稿怎麼寫就怎麼唸。要改詞,回 S1/S2 改,不在這裡臨時調整
- 不做字幕:文字一律後期疊。模型可以"唸"中文,但不能"寫"中文
- 不修音頻:唸錯的段落只能重出,或改字幕去貼合。這裡不混音、不補錄
- 不做剪輯:不拼段、不卡點、不調色,那是 S4
- 不判斷"好不好看":只判斷"能不能用"。觀感是審片環節的事
- 不承諾一次就過:生成是機率事件,2–4 個候選是常態,不是失敗
九、參考資料
| 檔案 | 什麼時候讀 |
|---|---|
references/api-and-modes.md | 查介面、參數、三模式字段、錯誤響應時 |
references/video-prompt.md | 寫影片提示詞、改提示詞時 |
references/task-ledger.md | 建台賬、續做、判斷該不該重提時 |
references/clip-review.md | 抽幀質檢、判失敗、決定返修方向時 |
| references/assembly-ops.md | S4 拼接、字幕與混音的 FFmpeg 實施細節 |
assets/gen-ledger-template.md | 建台賬時 |
| assets/dialogue-final-template.json | 記錄定版台詞、轉寫輔助和人工終審時 |
assets/batch-tasks-example.json | 批次跑清單時 |
腳本:
| 腳本 | 用途 |
|---|---|
scripts/kie_seedance.py | 提交 / 批次 / 查詢 / 等待下載 / 上傳參考幀 |
scripts/inspect_clip.py | 媒體體檢(需要 ffprobe) |