流水線:從劇本解析到角色一致性管理)
簡介這款一站式AI短劇生產(chǎn)工具面向短視頻創(chuàng)作者、直播運(yùn)營者以及有二次開發(fā)需求的程序員輸入劇本后即可自動完成智能分鏡、角色/場景/道具一致性管理并延伸支持自動剪輯、標(biāo)題封面生成與多平臺發(fā)布幫助用戶從創(chuàng)意輸入直達(dá)成品輸出大幅降低視頻內(nèi)容生產(chǎn)門檻。壓縮包共777個文件以Python腳本、TypeScript/TSX前端代碼和Markdown文檔為主體輔以CSS樣式、CSV配置、SQL數(shù)據(jù)及Docker、GitHub Actions等工程化配置既覆蓋后端算法、前端交互也提供了完善的部署與協(xié)作支撐整體大小僅2.93MB。目前已有237人學(xué)習(xí)下載。借助源碼、配置與文檔可深入理解分鏡生成、素材一致性控制、平臺熱門監(jiān)控等核心模塊的實(shí)現(xiàn)思路清晰的目錄結(jié)構(gòu)與插件機(jī)制也便于開發(fā)者快速定位關(guān)鍵代碼、按需進(jìn)行DIY擴(kuò)展或?qū)⑵湔线M(jìn)自己的AI剪輯與發(fā)布系統(tǒng)中。1. AI 短劇生產(chǎn)的第一道坎不是生成模型是鏡頭間的一致性一批做豎屏短劇、微短劇的創(chuàng)作者正在把同一件事變成日常劇本寫完丟給大模型出分鏡、出畫面。真正把人卡住的不是生成模型而是角色、場景、道具在鏡頭之間說變就變。這套打包好的生產(chǎn)工具 A.zip就是把「劇本輸入 → 智能分鏡 → 角色_場景_道具一致性管理」串成一條可重復(fù)跑的流水線。拆完之后我的感受是它不是一個一鍵出片的魔法盒而是一套把 AI 短劇從依賴運(yùn)氣變成可復(fù)現(xiàn)工程的操作規(guī)范。它能解決的痛點(diǎn)是同一張臉、同一件外套、同一把道具刀在第 3 集還能對得上。適合已經(jīng)會跑 AI 繪畫或視頻模型、但被多鏡頭一致性反復(fù)折磨的剪輯、編劇和獨(dú)立開發(fā)者。2. 劇本輸入到智能分鏡解析器與鏡頭規(guī)則怎么搭2.1 劇本輸入層先把自然語言改造成結(jié)構(gòu)化文本很多人在試過 AI 短劇工具后都會說“提示詞越寫越玄學(xué)”核心原因其實(shí)是劇本格式太自由。大模型讀散文沒問題但分鏡腳本需要穩(wěn)定字段哪一場、誰出場、做什么動作、說什么臺詞。A.zip 里的解析器默認(rèn)吃的不是純散文而是一種輕標(biāo)記劇本看起來像這樣場景夜市大排檔 角色張強(qiáng)小蕓 動作張強(qiáng)把烤串放到鐵盤上抬頭看向小蕓。 臺詞張強(qiáng)“你今天怎么跑這來了” 動作小蕓低頭不接話把手機(jī)屏幕轉(zhuǎn)向張強(qiáng)。這套標(biāo)記結(jié)構(gòu)一共就四類場景、角色、動作、臺詞。好處是任何編劇都能在十分鐘里改完不需要學(xué) XML 或 YAML。解析器會按行讀取遇到“場景”就開新場遇到“動作”就把下一句臺詞掛到當(dāng)前場景下。你要是愿意也可以把它理解成一種極簡的 DSL只服務(wù)于分鏡這個場景。import json def parse_script(text): scenes [] current None for line in text.splitlines(): line line.strip() if not line: continue if line.startswith(場景): current {scene: line[2:].strip(), shots: []} scenes.append(current) elif line.startswith(角色) and current is not None: current.setdefault(roles, []).append(line[2:].strip()) elif line.startswith(動作) and current is not None: current[shots].append({action: line[2:].strip(), line: }) elif line.startswith(臺詞) and current is not None: speaker, content line[2:].split(, 1) current[shots][-1][line] f{speaker}: {content} return scenes這段代碼的邏輯很直白按行掃描用行首關(guān)鍵字做分支臺詞行里用中文冒號切出說話人和內(nèi)容。這里有兩個值得留意的細(xì)節(jié)。第一“動作”和“臺詞”是一對多的關(guān)系所以把臺詞掛到最近一個“動作”上連續(xù)兩段臺詞也只更新同一鏡頭的臺詞字段第二角色列表用setdefault收集避免同一場戲里重復(fù)列表。如果你的劇本還會用到畫外音、閃回、夢境這類元素在解析器里加分支也不復(fù)雜后續(xù)分鏡規(guī)則會讀取同樣的字段不會破壞整條鏈路。2.2 智能分鏡規(guī)則景別、時長和鏡頭邏輯解析出場景和動作之后下一步是把一場戲拆成可生成的鏡頭。A.zip 里的分鏡腳本采用了一套短視頻節(jié)奏規(guī)則每秒 24 幀固定每個鏡頭時長按臺詞字?jǐn)?shù)估算景別則由動作類型推導(dǎo)。動作越碎鏡頭越短說話越多鏡頭越長。豎屏短劇和橫屏長劇最大的差異就在這里——豎屏更依賴近景和特寫全景太多會讓手機(jī)屏幕顯得空。動作類型默認(rèn)景別建議時長對話中景3 ~ 5 秒情緒反應(yīng)低頭、沉默近景特寫2 ~ 3 秒走位、進(jìn)場、出場全景3 ~ 4 秒打斗、追逐等強(qiáng)動作中近景切換1 ~ 2 秒分鏡腳本對這些默認(rèn)參數(shù)開放。比如把max_dialogue_duration改成 6長臺詞鏡頭就會被再拆一次避免一個鏡頭里嘴型和語音對不上。計算時長時按中文語速每分鐘 240 字左右估算一句話 30 字原本大約 7.5 秒但豎屏短劇對節(jié)奏要求更緊腳本里默認(rèn)再乘 0.8 的壓縮系數(shù)。DEFAULT_FPS 24 # 豎屏輸出統(tǒng)一用 24 幀 def estimate_duration(line: str) - float: if not line: return 2.0 content line.split(: , 1)[-1] words len(content) raw words / 240 * 60 # 每秒 4 字 return round(min(max(raw * 0.8, 1.0), 5.0), 1) def split_into_shots(scene) - list: shots [] for idx, item in enumerate(scene[shots]): d estimate_duration(item[line]) if d 4.0: left { order: idx * 2, action: item[action], line: item[line], duration: round(d / 2, 1), } right { order: idx * 2 1, action: item[action], line: , duration: round(d / 2, 1), } shots.extend([left, right]) else: item[order] idx item[duration] d shots.append(item) return shots這段腳本的意義在于讓每個鏡頭都帶一個可計算的時長字段。你后面接 AI 視頻生成時把duration乘以 24就知道需要生成多少幀如果模型一次只能生成 4 秒那 7 秒的鏡頭就必須拆成兩段再進(jìn)剪輯臺拼接。參數(shù) 0.8 是給豎屏短劇的節(jié)奏壓縮系數(shù)做橫屏長劇的人可以改回 1.0。另外duration帶小數(shù)是為了后面拼接時間線方便不是筆誤。2.3 把分鏡表輸出成 JSON給生成端定數(shù)據(jù)接口分鏡規(guī)則確定之后腳本會把整個劇本輸出成一份storyboard.json。這個文件是 A.zip 里所有一致性管理模塊的數(shù)據(jù)源頭。它的格式有點(diǎn)像剪輯軟件的時間線雛形每個鏡頭固定一個order后續(xù)角色卡、場景庫、道具列表都會拿scene_id和order做外鍵關(guān)聯(lián)。{ project: 夜排檔, fps: 24, aspect: 9:16, scenes: [ { scene_id: 1, scene: 夜市大排檔, roles: [張強(qiáng), 小蕓], shots: [ { order: 1, action: 張強(qiáng)把烤串放到鐵盤上抬頭看向小蕓。, line: 張強(qiáng): 你今天怎么跑這來了, duration: 1.8, camera: 中景, camera_move: 固定, transition: cut } ] } ] }和 2.1 里那張解析表相比這版 JSON 多加了camera、camera_move、transition三個字段。camera是景別camera_move表示固定鏡頭還是緩慢推進(jìn)transition是切鏡方式默認(rèn)cut情緒轉(zhuǎn)折時可以用overlap或shake。這些字段不是給分鏡腳本看的是給下游繪圖和剪輯階段用的。AI 剪輯拿到這份 JSON可以直接按order排序生成時間線和字幕軌。你手動改 JSON 也可以但我更推薦直接改 md 源文件再重新運(yùn)行腳本。因為手動改 JSON 容易改著改著就跟角色卡里的場景名對不上回頭排查又是一輪折騰。保持“源文件 → 生成 JSON”的單向數(shù)據(jù)流能少踩很多坑。2.4 智能分鏡的邊界哪些必須人工復(fù)核這里要潑一盆冷水這套智能分鏡本質(zhì)是機(jī)械規(guī)則不對“敘事情緒”負(fù)責(zé)。動作密集的場景它會把鏡頭拆得很碎但一個關(guān)鍵反轉(zhuǎn)鏡頭比如女主發(fā)現(xiàn)自己被騙時那個停頓規(guī)則可能只給一個 2 秒中景。編劇的直覺在這里比算法可靠。我習(xí)慣的做法是生成storyboard.json后先做一次“撫摸式審查”只看鏡頭拆得夠不夠、情緒重場有沒有被切碎。重點(diǎn)檢查duration小于 1.2 秒的鏡頭太短的鏡頭塞進(jìn) AI 視頻模型通常會被拒絕生成。分鏡腳本里一般會有--min-duration這類參數(shù)但人工調(diào)整后的 JSON 一定要回寫不要下次重新生成又覆蓋掉。3. 角色、場景、道具一致性管理用 token、seed 和配置模板鎖住畫面3.1 一致性管理為什么不能只靠提示詞生成式 AI 的文本提示詞本身就不穩(wěn)定同一句“穿黑色皮衣的年輕男人”不同步數(shù)、不同模型版本生成出來的臉完全不一樣。短劇是一集一集生產(chǎn)的只靠文字描述約束角色等于讓演員每場戲換個頭。A.zip 的一致性管理拆成三層角色卡負(fù)責(zé)臉和體型場景庫負(fù)責(zé)環(huán)境底色道具清單負(fù)責(zé)關(guān)鍵物品。底層邏輯是把“高變化的文本描述”換成“低變化的結(jié)構(gòu)化標(biāo)識”。角色臉上的特征會被壓縮到 token 和 LoRA 里環(huán)境信息會被壓縮到場景 seed 和參考圖里道具則是通過引用固定圖像來約束。這三層互相獨(dú)立又通過scene_id關(guān)聯(lián)到分鏡 JSON。改一層不會影響另外兩層這就是它比單條長提示詞更可控的原因。3.2 角色卡配置seed、LoRA 與觸發(fā)器怎么配合A.zip 的configs/characters目錄下默認(rèn)放了角色卡模板。把一張卡拆開看長這樣{ id: zhang_qiang, name: 張強(qiáng), trigger: zhangqiang, lora: models/lora/zhangqiang_v1.safetensors, base_seed: 20240813, init_image: assets/zhang_qiang_face.png, template_prompt: 1man, solo, looking at viewer, upper body, wearing black leather jacket, negative_prompt: blurry, bad face, deformed hands, multiple people, wardrobe: { scene_1: [black leather jacket, jeans], scene_2: [white tshirt, jeans] } }trigger是給模型的身份詞lora指向角色專用的低秩微調(diào)文件base_seed是生成首張定妝照時用的隨機(jī)數(shù)種子init_image是人工挑選的正面參考圖用于后續(xù) IP-Adapter 或 reference-only 控制。wardrobe按場景區(qū)分服裝等于把服裝從角色外貌里單獨(dú)摘出來了。拼提示詞時腳本會把 trigger、場景描述、道具描述按固定順序拼成一個長句。順序錯了很容易出問題因為模型會優(yōu)先響應(yīng)靠前的 token。實(shí)際實(shí)現(xiàn)如下def build_prompt(role_card, scene, props, wardrobe_keyscene_1): base role_card[template_prompt] outfit role_card[wardrobe].get(wardrobe_key, ) scene_text scene.get(base_prompt, ) prop_text , .join(props) return f{role_card[trigger]}, {outfit}, {scene_text}, {prop_text}, {base}這個拼接函數(shù)最大的價值是讓“人和場景”分開控制。trigger永遠(yuǎn)放在第一位模型優(yōu)先匹配角色身份場景只是背景道具放中間重要性高于 base 里的籠統(tǒng)描述。如果某一場景里角色服裝變化過大優(yōu)先檢查wardrobe_key有沒有傳對而不是去調(diào) LoRA 權(quán)重。LoRA 權(quán)重一般壓在 0.6 到 0.9 之間太低臉沒特征太高動態(tài)和姿勢會僵硬。3.3 場景庫與道具清單把容易漂移的視覺元素外部化場景和道具如果都寫進(jìn)角色 prompt角色卡會被撐爆。這個資源包里把場景拆分成了scene_library.json和props.json。每個場景有一條base_prompt和一個base_seed每次生成同一場景時復(fù)用同一個 seed環(huán)境構(gòu)圖就能穩(wěn)定住。道具則按場景分組只保留劇情上必須出現(xiàn)且不能變樣的物品比如定情信物、兇器、招牌。{ scene_library: { 夜市大排檔: { base_prompt: night market, steam, warm neon lights, outdoor stalls, depth of field, base_seed: 555111, ref_image: assets/scene_night_market.png } }, props: { 夜市大排檔: [ { name: 不銹鋼烤盤, ref_image: assets/prop_tray.png, mandatory: true }, { name: 手機(jī)屏幕, ref_image: assets/prop_phone_screen.png, mandatory: true } ] } }注意mandatory字段。普通水杯、雨傘這類裝飾性道具不需要進(jìn)列表但劇情反轉(zhuǎn)里那個手機(jī)屏幕必須進(jìn)去。我一般會把所有關(guān)鍵道具單獨(dú)生成一張參考圖再用 IP-Adapter 或 ControlNet 把它塞進(jìn)畫面。不加參考圖的話鏡頭 A 里的手機(jī)是貼了鋼化膜的鏡頭 B 里可能就變成新款折疊屏觀眾一眼就能看出來。3.4 跨模型遷移時的一致性策略開源模型生態(tài)更新很快上個月還在用 SD 1.5下個月就可能切到 SDXL 或新的視頻模型。token 和 LoRA 不一定能跨模型直接用。我見過的穩(wěn)妥做法是先找出角色卡里的init_image用目標(biāo)模型跑一次定妝照再把新出的定妝照作為下一階段的參考圖。這樣既保留原角色特征又適應(yīng)新模型的畫風(fēng)。另一個技巧是用首幀做鏡頭間校準(zhǔn)。同一場戲里先把第一個鏡頭的生成結(jié)果第一幀存下來傳進(jìn)下一個鏡頭當(dāng) reference能明顯減少動作捕捉的漂移。但這個方法有副作用如果前面鏡頭已經(jīng)是糊的后面會一路糊下去。所以做批量生成時基線鏡頭必須人工確認(rèn)清晰才允許作為后續(xù) reference。4. 把 A.zip 跑起來目錄結(jié)構(gòu)、依賴安裝與首個測試案例4.1 解壓之后先看什么下載 A.zip 后第一件事不是雙擊運(yùn)行而是先確認(rèn)目錄。這個壓縮包內(nèi)部組織和常見開源工程一致scripts 放解析和拼接腳本configs 放角色和場景配置workflow 放 ComfyUI 或類似圖形工作流的導(dǎo)出文件docs 放使用說明。我建議解壓后先翻一遍docs/quickstart.md因為不同版本對 Python 版本的要求有差異。目錄/文件作用常見坑scripts/storyboard.py劇本解析與分鏡輸出依賴 openpyxl 時需先安裝scripts/prompt_builder.py按 JSON 配置拼生成提示詞讀不到 configs 路徑會報錯configs/characters/角色卡一人一個 JSON文件名不要帶中文configs/scene_library.json場景底圖和固定 seed修改后要重新生成 storyboardworkflow/圖形化工作流文件版本不同可能導(dǎo)入失敗docs/參數(shù)說明和排錯手冊優(yōu)先看這一份還有一個容易忽略的點(diǎn)解壓后不要直接把 scripts 目錄單獨(dú)拷出去用。腳本里通常用了相對路徑讀取configs/脫離頂層目錄會立刻報FileNotFoundError。我基本都會把整個包留在一個固定工作目錄再用cd進(jìn)根目錄執(zhí)行不搞散裝。4.2 依賴安裝不同系統(tǒng)的差異cd A.zip 的展開目錄 python -m venv .venv source .venv/bin/activate # Windows 下是 .venv\Scripts\activate pip install -r requirements.txt先用虛擬環(huán)境隔離依賴是避免污染系統(tǒng) Python 的習(xí)慣。requirements.txt 里一般只有 json、Pillow、numpy 這類基礎(chǔ)庫安裝很快。Windows 上如果python -m venv后激活失敗檢查是不是用了 Windows Store 的 python 別名macOS 的 Apple Silicon 機(jī)器如果跑模型需要給 PyTorch 設(shè)置PYTORCH_ENABLE_MPS_FALLBACK1否則某些算子在 MPS 后端會直接崩。Linux 服務(wù)器則要留意顯卡驅(qū)動驅(qū)動不對時pip install成功也沒用。4.3 從劇本到首版分鏡命令與預(yù)期輸出我在自己的目錄里建了一個test/文件夾放了一個三行劇本然后跑腳本驗證整條鏈路。下面這個命令串就是最基礎(chǔ)的操作流。python scripts/storyboard.py --input test/script.md --output test/storyboard.json python scripts/prompt_builder.py --storyboard test/storyboard.json --out test/prompts.txtstoryboard.py輸出的是結(jié)構(gòu)化 JSONprompt_builder.py再把角色卡、場景庫、道具清單合并成每個鏡頭的完整英文提示詞。跑完之后prompts.txt里大約是這樣一個行zhangqiang, black leather jacket, night market, steam, warm neon lights, stainless steel tray, mobile phone screen, 1man, solo, looking at viewer...這一行會被直接喂給生成模型。注意 prompt 的第一個詞是zhangqiang而不是場景這是角色優(yōu)先級的設(shè)計。如果兩個腳本都能正常退出說明 A.zip 在你機(jī)器上的鏈路是通的。之后你只需要改劇本和配置不再需要碰這段流程。4.4 參數(shù)怎么調(diào)分辨率、幀率、鏡頭數(shù)量、采樣步數(shù)跑通首版之后就需要開始調(diào)參了。豎屏短劇輸出端最常見的分辨率是 720×1280 和 1080×1920。分辨率太高視頻生成模型一次推理的時間和顯存占用都會翻倍太低轉(zhuǎn)場后細(xì)節(jié)會糊。A.zip 默認(rèn)配置是 720×1280對大多數(shù)開源視頻模型是安全值。參數(shù)默認(rèn)值建議范圍影響resolution720x1280720x1280 ~ 1080x1920顯存不足時先降這里fps2416 / 24部分模型只用 24 訓(xùn)練sample_steps2020 ~ 30過高會放大角色特征偏差cfg_scale5.05.0 ~ 7.0過高表情僵硬過低畫面發(fā)灰max_shot_duration4.02.0 ~ 5.0限制單鏡頭秒數(shù)采樣步數(shù)和一致性強(qiáng)相關(guān)。Stable Diffusion 系列一般 20 步出圖30 步細(xì)節(jié)好但容易把角色特征帶偏視頻模型里 CFG 通常建議 5 到 7數(shù)值太大會讓角色表情僵硬太小畫質(zhì)發(fā)灰。調(diào)整時每次只動一個變量不要同時改步數(shù)和 CFG否則翻車了不知道是該怪哪邊。5. 常見問題排查AI 短劇生產(chǎn)中最容易翻車的五個細(xì)節(jié)5.1 同一角色換個場景就換臉現(xiàn)象第一集男主的臉還能認(rèn)第二集同一角色五官完全變了一個人。更隱蔽的情況是單獨(dú)看每個鏡頭都正常但兩個鏡頭放一起對比就不像同一個人。原因角色卡里的 base_seed 沒被固定或者生成時隨機(jī)數(shù)被重置。很多 AI 視頻工具如果不顯式傳 seed每次調(diào)用都會起一個隨機(jī) seed人臉的細(xì)節(jié)就被隨機(jī)數(shù)帶著跑。解決把所有鏡頭的生成請求統(tǒng)一強(qiáng)制傳遞角色卡里的 base_seed。如果用 ComfyUI把 seed 節(jié)點(diǎn)接成固定值如果自己的腳本調(diào)用模型也要在參數(shù)里顯式傳。遇到必須換 seed 的場景至少保留 LoRA 和 trigger 不變并把新 seed 寫回角色卡的 sample 字段方便回溯。5.2 人沒走衣服走了現(xiàn)象長鏡頭里人物上半身保持穩(wěn)定但外套顏色從黑色慢慢變成深藍(lán)下一個鏡頭直接變成夾克。這個問題在 AI 短劇里比臉崩還常見因為服裝在 prompt 里的權(quán)重太靠后了。原因生成視頻模型對短鏡頭窗口內(nèi)的語義保持較好但跨越多個鏡頭時服裝描述在長提示詞里被稀釋。角色 trigger 是合成詞權(quán)重集中在臉部服裝只是籠統(tǒng)的文本標(biāo)簽。解決把 wardrobe 從角色卡里單獨(dú)拿出來作為每個鏡頭的固定前綴。我還會先用 ControlNet 的 openpose 約束身體姿態(tài)再讓局部重繪只處理臉部區(qū)域這樣衣服不會跟著表情一起變。關(guān)鍵場次的服裝可以先單獨(dú)生成一張平鋪圖通過 IP-Adapter 塞進(jìn)畫面的參考通道。5.3 智能分鏡把關(guān)鍵動作漏掉現(xiàn)象劇本里寫了“從兜里掏出手機(jī)”分鏡表里只有“抬頭看向小蕓”手機(jī)道具直接消失后面的反轉(zhuǎn)戲根本沒素材可用。原因解析器只認(rèn)“動作”關(guān)鍵字。如果劇本作者把動作寫進(jìn)了臺詞描述里例如“小蕓低頭將手機(jī)屏幕轉(zhuǎn)過來”寫在臺詞行里沒有單獨(dú)寫“動作小蕓把手機(jī)屏幕轉(zhuǎn)向張強(qiáng)”解析器就會忽略。解決寫劇本時把所有視覺信息都放到動作行。我一般會讓編劇先過一遍標(biāo)記規(guī)范分鏡腳本跑完后再逐場看 JSON 里 shots 的數(shù)量。如果某個情節(jié)節(jié)點(diǎn)在分鏡里找不到對應(yīng)鏡頭就去改源劇本不要直接往 JSON 里硬插。5.4 zip 里的腳本在別人機(jī)器上報錯現(xiàn)象在自己電腦上跑得好好的發(fā)給同事解壓后直接報ModuleNotFoundError: No module named openpyxl或者報FileNotFoundError: configs/characters/xxx.json。原因第一壓縮包里的 requirements.txt 沒有把環(huán)境鎖全第二對方用系統(tǒng) Python 直接跑沒進(jìn)虛擬環(huán)境第三對方從 zip 解壓后只在子目錄里執(zhí)行腳本相對路徑找不到 configs。解決接收方先執(zhí)行 4.2 的虛擬環(huán)境命令再跑pip install -r requirements.txt。路徑問題則統(tǒng)一從根目錄進(jìn)不要直接雙擊單個 py 文件。如果包作者沒提供 requirements.txt就用pip install openpyxl補(bǔ)上但要把這行注釋掉再提交避免別人每次都重裝。5.5 生成的成片時長對不上平臺規(guī)格現(xiàn)象單鏡頭生成 6 秒拼接后一條短劇總時長過長發(fā)出去因為時長問題被平臺限流或者是鏡頭之間出現(xiàn)明顯跳躍動作中斷。原因分鏡時長估算用了臺詞字?jǐn)?shù)但 AI 視頻模型一次只能生成 3 到 4 秒。硬拼時長會讓動作在中間出現(xiàn)跳躍平臺側(cè)的節(jié)奏要求也沒被考慮進(jìn)去。解決給storyboard.json里的 duration 字段設(shè)上限 4 秒超過的鏡頭拆兩段。豎屏短劇的切鏡本來就頻繁觀眾對 1 到 2 秒的跳切接受度很高。拆完鏡頭后在剪輯臺用疊化或變速接一下比強(qiáng)行讓模型生成 6 秒要穩(wěn)定得多。6. 進(jìn)階用法給角色做“配方”再批量驗證一致性6.1 把單集劇本變成系列“配方”微短劇真正的常量是一致性所以我會在 A.zip 基礎(chǔ)上再建一個series_recipe.json把每一集需要的角色狀態(tài)、場景變化、道具位置都記錄進(jìn)去。第一集定妝后固定角色 token LoRA 基礎(chǔ) seed第二集只改 trigger 和服裝其他全部繼承。這樣跨集生成時角色底子不會漂。6.2 用批量圖像相似度腳本驗證輸出人眼檢查幾十張定妝圖太慢我一般跑一遍相似度腳本把同角色在不同場景下的定妝圖兩兩比較輸出平均差異分。低于閾值直接判為存疑再人工復(fù)查。下面這段代碼是從包里常用做法摘出來的import os import numpy as np from PIL import Image def compare_dir(role_dir, threshold0.2): imgs sorted(os.listdir(role_dir)) scores [] for i in range(len(imgs) - 1): path_a os.path.join(role_dir, imgs[i]) path_b os.path.join(role_dir, imgs[i 1]) a np.array(Image.open(path_a).convert(RGB).resize((256, 256)), dtypenp.float32) b np.array(Image.open(path_b).convert(RGB).resize((256, 256)), dtypenp.float32) diff np.mean(np.abs(a - b)) / 255.0 scores.append(diff) return scores這個腳本把相鄰鏡頭定妝圖縮到 256×256再計算像素平均絕對差。差異值小于 0.1 說明畫面非常接近0.1 到 0.2 算正常范圍超過 0.2 就需要重新生成或排查是不是場景光線干擾過大。它不能替代肉眼但能快速篩出明顯翻車的鏡頭。肉眼復(fù)查時只看超閾值的那幾張圖精力就能集中在最要命的地方。6.3 我的收工習(xí)慣現(xiàn)在我每次做完一集都會把角色卡、場景庫、storyboard.json 三件套打包回一個 zip文件名帶集數(shù)和日期。遇到某張圖特別滿意就把那次的 seed、CFG、采樣器寫進(jìn)角色卡的 sample 字段當(dāng)作下一集的對齊基準(zhǔn)。這個習(xí)慣救了我好幾次尤其隔兩周再繼續(xù)做同一部短劇模型版本都更新了沒有基準(zhǔn)參數(shù)就只能從頭試錯。從那以后我每次開新集都強(qiáng)制走一遍“解析劇本 → 生成 storyboard → 對比定妝圖 → 鎖定參數(shù)”的流程。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取