数字我 Digital Me:全量入库(大文件走 Git LFS)
nginx serve /uploads direct (audio speed) / patch-nginx (push) Failing after 1m34s
nginx serve /uploads direct (audio speed) / patch-nginx (push) Failing after 1m34s
This commit is contained in:
@@ -0,0 +1,233 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
||||
const outputRoot = path.join(repoRoot, '战役素材', '西汉')
|
||||
const VISUAL_BASE = `Style/medium: premium live-action Chinese historical film still, archaeology-inspired Chu-Han realism around 205–204 BCE, subtle film grain and physically plausible scale. Materials: rammed earth, aged timber, hemp, low-sheen silk, leather, lacquered lamellar armor, wooden carts, bronze and iron weapons; armies must have varied worn clothing rather than uniform costume-pageant outfits. Composition: cinematic 16:9 landscape with distinct foreground, middle ground and background; reserve quiet sky, wall, water or earth for webpage overlay. Constraints: no baked-in text, readable banners, names, subtitles, logo or watermark; violence through movement, broken equipment and consequences, never gore. Avoid: clone-face armies, fantasy armor, later Han/Tang/Song/Ming/Qing armor or architecture, imperial yellow dragon robes, bead-curtain crowns, Forbidden City, modern maps, UI arrows, firearms, cannons, explosions, samurai armor, European plate armor, magic, anime or body piles.`
|
||||
|
||||
function image(file, alt, request, visualInference) {
|
||||
return { original: `images/${file}.png`, delivery: `images/${file}.webp`, alt, prompt: `Use case: historical-scene. Asset type: Digital Me Chu-Han battle story frame, 16:9 landscape. Primary request: ${request} ${VISUAL_BASE}`, visualInference, refinementPrompt: '' }
|
||||
}
|
||||
|
||||
const packs = [
|
||||
{
|
||||
dir: '彭城之战(项羽三万破汉军)',
|
||||
event: {
|
||||
canonicalName: '彭城之战(项羽三万破汉军)', aliases: ['彭城之战', '睢水之战', '彭城大败'], era: '楚汉战争', date: '公元前205年四月',
|
||||
place: '彭城及谷水、泗水、灵壁东睢水一线(今江苏徐州至安徽灵璧一带)',
|
||||
summary: '刘邦率五诸侯联军入彭城后松懈,项羽自齐地率精兵三万回击,晨战至日中即大破汉军,并追至睢水。'
|
||||
},
|
||||
narration: {
|
||||
language: 'zh-CN', estimatedSeconds: 88,
|
||||
fullText: '公元前二〇五年,项羽北上攻齐,刘邦趁彭城空虚,统合五路诸侯军东进。《史记》记这支联军共有五十六万。汉军进入彭城后收取财货,日日置酒高会,胜利仿佛已经结束。项羽没有带回全部楚军,而是留下诸将继续攻齐,亲率精兵三万,由鲁地南下,经胡陵快速回援。清晨,楚军从萧县方向突击汉军,战到日中,庞大的联军已经全面崩溃。败兵先拥入谷水、泗水,楚军又追至灵壁以东的睢水。河流截住退路,史书用“睢水为之不流”形容伤亡之重。刘邦被楚军数重包围,忽有西北大风扬沙折木,楚军阵势一时混乱,他才带数十骑逃走。彭城让项羽以三万精兵夺回都城,也让刘邦失去父母妻子和大批诸侯盟军;但他仍退往荥阳,楚汉战争并未结束。'
|
||||
},
|
||||
scenes: [
|
||||
{
|
||||
id: '01', title: '入城高会', timePlace: '公元前205年四月,彭城', purpose: '表现汉军占领彭城后的松懈,为项羽突袭建立前因。',
|
||||
narration: '刘邦率五诸侯联军进入彭城。军中收取财货,日日置酒高会,防备逐渐松弛。',
|
||||
overlay: { heading: '入城高会', line: '五十六万人的胜势,在都城里先变成了松懈。' },
|
||||
people: [
|
||||
{ name: '刘邦', office: '汉王', action: '统合五诸侯军进入彭城' },
|
||||
{ name: '五诸侯联军', office: '汉方联军', action: '占领彭城;史载合计五十六万,具体五诸侯身份存争' }
|
||||
],
|
||||
image: image('01-feast-in-pengcheng', '彭城内的楚王宫外院,刘邦与数名诸侯将领在简朴长案旁饮宴,院外汉军搬运箱笼、卸下甲胄休息,城防显得松散但不铺陈奢靡后宫。', 'Courtyard inside captured Pengcheng. Liu Bang, a pragmatic middle-aged East Asian ruler with weathered face, thin moustache and short beard, wears a dark Han king robe over light practical armor and sits at a low wooden table with several allied lords. Cups, food vessels and unopened chests suggest a victory feast; outside the gate mixed allied soldiers unload goods, rest without helmets and leave watch posts thin. Show complacency and dispersed attention, not a decadent fantasy palace or sexualized captives.', '宴席位置、财货箱笼、卸甲与守备松散为视觉重构;入城后收货宝、日置酒高会有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七', '《史记·高祖本纪》卷八']
|
||||
},
|
||||
{
|
||||
id: '02', title: '三万回师', timePlace: '齐地至鲁、胡陵方向', purpose: '突出项羽舍大军、以精兵和速度回援彭城。',
|
||||
narration: '项羽留下诸将继续攻齐,自己只带精兵三万,从鲁地经胡陵昼夜南下。',
|
||||
overlay: { heading: '三万回师', line: '他没有比人数,而是先和时间赛跑。' },
|
||||
people: [
|
||||
{ name: '项羽', office: '西楚霸王', action: '自率精兵三万回援彭城' },
|
||||
{ name: '楚军精兵', office: '快速回师部队', action: '由齐地南经鲁、胡陵方向进军' }
|
||||
],
|
||||
image: image('02-thirty-thousand-return', '黎明前的鲁地道路上,项羽骑在队伍前方,楚军精兵以紧凑长列快速南下,骑兵、步卒和少量粮车比例可信,远处仍是夜色。', 'Pre-dawn road through the Lu region. Xiang Yu, a powerful young East Asian commander in his mid-twenties with broad shoulders, tied hair, weathered face and practical dark Chu lamellar armor with muted red-brown cloth, rides at the leading edge of a compact fast-moving column. Selected infantry and cavalry move south in disciplined files with only light baggage and a few carts; tired torchlight fades into cold dawn. Convey speed, selection and urgency, not a gigantic parade or impossible cavalry-only army.', '具体道路、昼夜节奏、兵种与轻装辎重为视觉补全;项羽自将精兵三万南从鲁出胡陵有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七']
|
||||
},
|
||||
{
|
||||
id: '03', title: '晨击日破', timePlace: '萧县至彭城一线,清晨至日中', purpose: '表现楚军快速冲击与联军指挥崩解,不把“以少胜多”变成超人单骑。',
|
||||
narration: '项羽从萧县方向清晨发起攻击。战到日中,联军各部互相挤压,彭城防线已经崩溃。',
|
||||
overlay: { heading: '晨击日破', line: '半日之间,人数优势变成了互相阻塞的退路。' },
|
||||
people: [
|
||||
{ name: '项羽', office: '西楚霸王、楚军主帅', action: '亲自指挥晨击并夺回彭城' },
|
||||
{ name: '刘邦', office: '汉王、联军主帅', action: '在突袭中组织失效并转入撤退' },
|
||||
{ name: '汉诸侯联军', office: '临时联盟军队', action: '遭快速突击后瓦解' }
|
||||
],
|
||||
image: image('03-dawn-strike-noon-rout', '彭城西侧平原上,项羽在楚军冲击中指挥推进,汉诸侯联军不同装束的部队在狭窄道路和营门间互相阻塞,破损车阵显示崩溃但不见尸山。', 'Morning assault outside Pengcheng. Xiang Yu, same identity as scene 02, directs compact Chu shock groups through the gaps of a sprawling allied camp. Han contingents in visibly different regional clothing attempt to turn, form ranks and retreat through the same narrow camp entrances, creating command breakdown rather than cowardly caricature. Liu Bang appears farther back on horseback trying to withdraw with guards. Broken wagons and abandoned drums suggest collapse; wide diagonal action, no superhero leap, no body piles.', '营门、道路阻塞、各部装束与两位主帅的同框为视觉推演;晨击至日中大破汉军见史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七', '《史记·高祖本纪》卷八']
|
||||
},
|
||||
{
|
||||
id: '04', title: '退至睢水', timePlace: '灵壁东睢水沿岸', purpose: '呈现地形把溃退扩大为灾难,对惨烈数字保持克制。',
|
||||
narration: '败军越过谷水、泗水,仍被追到睢水。河岸拥塞,退路在水边彻底断裂。',
|
||||
overlay: { heading: '退至睢水', line: '战败先发生在军阵里,灾难随后发生在河岸。' },
|
||||
people: [
|
||||
{ name: '汉军败卒', office: '汉与诸侯联军士卒', action: '被追至睢水,争渡中伤亡惨重' },
|
||||
{ name: '楚军追兵', office: '项羽所部', action: '沿谷水、泗水追击至睢水' }
|
||||
],
|
||||
image: image('04-rout-at-sui-river', '睢水岸边,汉军败卒被堵在浅滩和毁坏车辆之间,有人涉水、有人抛下盾牌,楚军追兵在远处止步列阵,水面没有漂尸特写。', 'Wide riverbank at the Sui River during the rout. Disordered Han and allied soldiers crowd around broken carts and narrow shallows, some wading chest-deep, others dropping shields to seek another crossing. Chu pursuit formations remain in the middle distance pressing forward, not committing graphic slaughter in the foreground. Use churned water, abandoned equipment and panic to convey the historical catastrophe; no visible corpses, no red river, no drowning close-ups. Flat gray daylight and broad water provide restrained negative space.', '渡点、浅滩深度、败军器械与追兵距离为视觉补全;追至灵壁东睢水、汉卒大批入水有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七', '《史记·高祖本纪》卷八']
|
||||
},
|
||||
{
|
||||
id: '05', title: '大风脱围', timePlace: '睢水战场外缘,溃败后', purpose: '表现史载西北大风造成楚军短暂混乱、刘邦数十骑逃脱,并交代战略后果。',
|
||||
narration: '刘邦被数重包围时,西北大风扬沙折木,楚军一时散乱。他带数十骑逃出,父母妻子却落入楚军。',
|
||||
overlay: { heading: '大风脱围', line: '项羽赢下彭城,刘邦却还活着离开了。' },
|
||||
people: [
|
||||
{ name: '刘邦', office: '汉王', action: '借楚军受风沙扰乱之机率数十骑逃脱' },
|
||||
{ name: '楚军', office: '追击军队', action: '突遇西北大风后阵势短暂混乱' },
|
||||
{ name: '吕雉与刘太公', office: '汉王妻与父', action: '在彭城败后被楚军俘获;不虚构本幕相见' }
|
||||
],
|
||||
image: image('05-wind-opens-an-escape', '西北大风卷起黄尘和折枝,刘邦与数十骑从混乱的楚军包围边缘疾驰而出,远处楚军遮目稳马,画面不把自然风表现成神术。', 'A violent natural northwest wind sweeps dust, loose thatch and broken branches across the edge of the battlefield. Liu Bang, consistent with scene 01, escapes with a visibly small group of several dozen riders through a temporary opening; farther back Chu soldiers shield their eyes and control startled horses as formations blur. No magical aura, no lightning, no divine intervention. Wide lateral movement and low visibility, the escape narrow and exhausted rather than triumphant.', '骑行路线、沙尘密度、具体包围缺口与折枝为视觉重构;西北大风使楚军大乱、汉王以数十骑遁有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七']
|
||||
}
|
||||
],
|
||||
bgm: {
|
||||
catalogId: 'zhanzhen:pengcheng#0', title: '彭城之战', version: '电影级配乐·建议使用无主唱器乐 stem', status: 'pending-export', pathOrUrl: '',
|
||||
usage: '第一幕压低节奏表现虚浮安逸,第二幕建立快速行军脉冲,第三幕形成唯一爆发,第四幕撤去英雄动机,仅留低频与水声,最后用风沙和残余低弦收束;删除歌词与品牌尾签。',
|
||||
reason: '项目内与彭城直接绑定的自生成音乐,项羽三万回师与半日击溃的上扬结构契合五幕推进;仓库内暂无成品音频。',
|
||||
cues: [
|
||||
{ from: '00:00', to: '00:18', scene: '01', direction: '宴饮器物声下压,保持不祥静态。' },
|
||||
{ from: '00:18', to: '00:36', scene: '02', direction: '加入快速但克制的行军脉冲。' },
|
||||
{ from: '00:36', to: '00:54', scene: '03', direction: '全曲唯一爆发,随后立刻失稳。' },
|
||||
{ from: '00:54', to: '01:12', scene: '04', direction: '撤去英雄旋律,以低频、水声和碎裂节奏表现溃退。' },
|
||||
{ from: '01:12', to: '01:30', scene: '05', direction: '风声覆盖鼓点,留下未结束的悬念。' }
|
||||
]
|
||||
},
|
||||
sources: [
|
||||
{ claim: '五诸侯兵力、入彭城高会、项羽三万回师、晨击日破、睢水追击与大风脱围', citation: '《史记·项羽本纪》卷七', url: 'https://zh.wikisource.org/zh-hans/史记/卷007' },
|
||||
{ claim: '刘邦入彭城、睢水大败、家属被俘及诸侯复归楚', citation: '《史记·高祖本纪》卷八', url: 'https://zh.wikisource.org/zh-hans/史记/卷008' }
|
||||
],
|
||||
blacklist: [
|
||||
'把汉军五十六万与楚军三万理解为可逐人核验的现代统计;按《史记》记数并注明联军性质',
|
||||
'把项羽三万全部画成重骑兵;原文只称“精兵”,不明言单一兵种',
|
||||
'把睢水惨败画成血河、尸山或近景溺亡奇观',
|
||||
'把西北大风写成项羽或刘邦召来的神迹,或夸大为龙卷风和雷电法术',
|
||||
'虚构五诸侯确定名单、楚汉将领单挑或一支军旗决定胜负',
|
||||
'现代文字、字幕、地图箭头、Logo、水印、后世盔甲建筑、火器爆炸或动漫画风'
|
||||
]
|
||||
},
|
||||
{
|
||||
dir: '井陉之战(背水一战)',
|
||||
event: {
|
||||
canonicalName: '井陉之战(背水一战)', aliases: ['井陉口之战', '背水一战', '韩信破赵'], era: '楚汉战争', date: '公元前204年',
|
||||
place: '井陉口、赵军营壁及泜水一带(今河北井陉附近;部分水系地望存争)',
|
||||
summary: '韩信、张耳东下井陉,以万人背水列阵、二千轻骑乘赵军空营拔帜易帜,夹击破赵,斩陈馀并擒赵王歇。'
|
||||
},
|
||||
narration: {
|
||||
language: 'zh-CN', estimatedSeconds: 89,
|
||||
fullText: '公元前二〇四年,韩信与张耳率军东下井陉攻赵。赵王歇、成安君陈馀在井陉口聚兵,号称二十万。广武君李左车建议拨三万奇兵绕道切断汉军辎重,再深沟高垒拒战;陈馀自称义兵不用诈谋,没有采纳。韩信派人侦察,确认赵军不用此计,才敢继续入陉。他先选二千轻骑,每人持一面赤帜,从小路隐蔽在山后;又让一万人先出井陉口,背水列阵。天明,韩信打出主将旗鼓诱赵军出营争夺。双方久战,汉军佯弃旗鼓退向水边,背水士卒无路可退,人人死战。赵军倾巢追击时,二千轻骑驰入空营,拔去赵旗,换上汉军赤帜。赵军回望营垒,误以为主将已被擒,阵势顿乱。汉军前后夹击,大破赵军,斩陈馀、擒赵王歇。背水并非孤注一掷,而是与侦察、诱敌和拔帜奇兵同时咬合的一整套部署。'
|
||||
},
|
||||
scenes: [
|
||||
{
|
||||
id: '01', title: '上策不用', timePlace: '井陉口赵军营帐', purpose: '交代李左车断粮建议与陈馀拒绝,为韩信敢于入陉建立情报前提。',
|
||||
narration: '李左车建议以三万奇兵切断汉军辎重,再坚营不战。陈馀拒绝了这套诈谋。',
|
||||
overlay: { heading: '上策不用', line: '井陉最危险的那条路,赵军主动让了出来。' },
|
||||
people: [
|
||||
{ name: '李左车', office: '赵广武君', action: '献奇兵绝辎重、深沟高垒之策' },
|
||||
{ name: '陈馀', office: '赵成安君、前线主帅', action: '以义兵不用诈谋为由拒绝' },
|
||||
{ name: '赵王歇', office: '赵王', action: '名义统帅,在军中' }
|
||||
],
|
||||
image: image('01-li-zuoche-plan-rejected', '赵军营帐中,李左车用无字木筹和几只石块指示狭道与粮车,陈馀端坐听取却抬手拒绝,赵王歇在侧,不出现现代沙盘地图。', 'Inside the Zhao command tent near Jingxing Pass. Li Zuoche, an older East Asian strategist in plain layered robes, uses blank wooden counters, cord and a few stones on a rough table to explain a narrow route and baggage column without a drawn map. Chen Yu, a dignified middle-aged Confucian commander in restrained Zhao armor and robe, raises one hand to reject the proposal; Zhao King Xie listens from the side. The disagreement is controlled and intellectual, not shouting. Open flap reveals steep valley walls and fortified camp.', '木筹示意、人物神态、营帐与山谷同框为视觉补全;李左车献断粮策、陈馀不用有史载。'),
|
||||
sources: ['《史记·淮阴侯列传》卷九十二']
|
||||
},
|
||||
{
|
||||
id: '02', title: '背水列阵', timePlace: '井陉口外临水地带,夜末', purpose: '呈现万人先行背水布阵,同时说明这只是整体部署的一部分。',
|
||||
narration: '韩信让一万人先出井陉口,背水列阵。赵军从营垒远望,见此布置大笑。',
|
||||
overlay: { heading: '背水列阵', line: '后面是水,但真正的退路被放在了敌营里。' },
|
||||
people: [
|
||||
{ name: '韩信', office: '汉左丞相、前线主帅', action: '命万人背水列阵' },
|
||||
{ name: '张耳', office: '汉将', action: '与韩信共同东击赵' },
|
||||
{ name: '汉军步卒', office: '背水本阵', action: '临水列阵并准备承受赵军主攻' }
|
||||
],
|
||||
image: image('02-formation-against-water', '黎明前河岸上,韩信在侧后方检查万人背水阵,步卒以盾矛列出层次,后方水面紧贴阵线,远处赵军营壁在山口高处。', 'Before dawn beside an unnamed river near Jingxing. Han Xin, a lean East Asian commander in his early thirties with composed face, tied hair, neat moustache, dark practical Han lamellar armor and muted red cloak, inspects a broad infantry formation whose backs are visibly close to the water. Zhang Er stands with aides farther along the bank. Shield and spear ranks are tense and imperfect, not identical clones; across the valley Zhao campfires and ramparts look down from higher ground. Strategic wide shot, cold blue-gray morning.', '具体水岸、阵列宽度、韩信与张耳站位为视觉补全;万人先行、出背水陈及赵军望见大笑有史载。'),
|
||||
sources: ['《史记·淮阴侯列传》卷九十二']
|
||||
},
|
||||
{
|
||||
id: '03', title: '弃旗诱出', timePlace: '平旦,井陉口与赵营之间', purpose: '表现韩信以主将旗鼓诱赵军空营逐利,并与背水本阵衔接。',
|
||||
narration: '天明,韩信打出主将旗鼓出井陉口。久战后汉军佯弃旗鼓退向水边,赵军空营追击。',
|
||||
overlay: { heading: '弃旗诱出', line: '被丢下的旗鼓,不是败象,而是让赵营变空的诱饵。' },
|
||||
people: [
|
||||
{ name: '韩信', office: '汉左丞相', action: '建大将旗鼓诱赵军出壁,并佯退水上军' },
|
||||
{ name: '陈馀', office: '赵军主帅', action: '开壁出击并争夺汉军旗鼓' },
|
||||
{ name: '汉军背水阵', office: '本阵步卒', action: '接纳退回部队并殊死抵抗' }
|
||||
],
|
||||
image: image('03-banners-abandoned-as-bait', '井陉口外战场上,汉军把主将旗鼓留在破损车阵旁向河岸撤回,赵军从打开的营门争相追出,韩信在退却队列中回望控制节奏。', 'Battlefield between Jingxing Pass and the Zhao camp at first light. Han troops deliberately abandon large command drums and plain, unreadable standard poles beside a broken wagon line while falling back toward the riverside formation. Zhao forces stream from their opened fortified gate to seize the apparent prizes, leaving the camp visibly thin. Han Xin, same identity as scene 02, rides within the controlled withdrawal and looks back, directing rather than panicking. Dynamic deep composition; standards carry solid muted color only, no symbols or writing.', '弃置位置、赵军出营规模、韩信回望与车阵为视觉重构;建大将旗鼓、佯弃鼓旗、赵空壁争夺有史载。'),
|
||||
sources: ['《史记·淮阴侯列传》卷九十二']
|
||||
},
|
||||
{
|
||||
id: '04', title: '拔帜易帜', timePlace: '赵军空营与萆山间道', purpose: '呈现二千轻骑乘虚入营换旗这一攻心枢纽。',
|
||||
narration: '二千轻骑从山间小路驰入空营,拔去赵旗,遍立汉军赤帜。赵军回望时,看到营垒已经变色。',
|
||||
overlay: { heading: '拔帜易帜', line: '真正击垮赵军的,是回头那一眼。' },
|
||||
people: [
|
||||
{ name: '汉军轻骑', office: '二千奇兵', action: '由间道隐蔽,乘赵军空营拔帜立赤帜' },
|
||||
{ name: '韩信', office: '汉军主帅', action: '预先部署二千轻骑执行攻心奇袭;本人不在营内' }
|
||||
],
|
||||
image: image('04-cavalry-switches-standards', '赵军空营内,汉军轻骑翻越低矮营壁,拔下素色赵旗并竖起无字赤帜,营外山道仍有骑兵进入,远方战场上的赵军开始回望。', 'Inside the nearly empty Zhao fortified camp. Han light cavalry dismount and climb low earth-and-timber ramparts, pulling down plain Zhao-colored standards and raising many solid red Han standards with absolutely no writing or symbols. More riders enter through a rear mountain path; abandoned tents and tether rails show the garrison rushed out. Far across the valley, small Zhao formations begin turning back toward the transformed camp. Emphasize coordinated infiltration and psychological shock, not a flag-waving celebration.', '营壁高度、旗色分布、入营路径与远方回望为视觉重构;二千轻骑从间道入空壁、拔赵旗立汉赤帜有史载。'),
|
||||
sources: ['《史记·淮阴侯列传》卷九十二']
|
||||
},
|
||||
{
|
||||
id: '05', title: '夹击破赵', timePlace: '赵营与泜水一线,战斗终局', purpose: '交代赵军心理崩溃、汉军夹击和战果,并保留李左车被礼待的余韵。',
|
||||
narration: '赵军见满营赤帜,以为主将已失,顿时溃乱。汉军前后夹击,斩陈馀、擒赵王歇。',
|
||||
overlay: { heading: '夹击破赵', line: '背水阵守住正面,营中的赤帜从背后击垮军心。' },
|
||||
people: [
|
||||
{ name: '韩信', office: '汉军主帅', action: '完成前后夹击并战后师事李左车' },
|
||||
{ name: '陈馀', office: '赵成安君', action: '兵败,后在泜水被斩;不作血腥近景' },
|
||||
{ name: '赵王歇', office: '赵王', action: '战败被擒' },
|
||||
{ name: '李左车', office: '赵广武君', action: '被俘后获韩信解缚礼待' }
|
||||
],
|
||||
image: image('05-zhao-defeated-li-honored', '战后赵营外,赵王歇站立交出佩剑,韩信命士卒为李左车解开绳索并让座,远处汉军赤帜遍布营壁,陈馀之死不在画面中。', 'Restrained aftermath outside the captured Zhao camp. Zhao King Xie stands upright surrendering his sheathed sword to guards, neither bound nor humiliated. Han Xin, consistent face and armor, gestures for soldiers to remove a simple rope from the wrists of the older strategist Li Zuoche and offers him a place beside a low camp table, foreshadowing respectful consultation. Zhang Er observes. Solid red standards line the ramparts in the distance without marks. Chen Yu’s death is not shown. Quiet exhaustion and strategic respect, no mass kneeling or triumphal spectacle.', '赵王交剑、李左车解缚让座与人物同框为视觉重构;擒赵王、勿杀李左车并解缚师事有史载,陈馀之死只用文案交代。'),
|
||||
sources: ['《史记·淮阴侯列传》卷九十二', '《史记·张耳陈余列传》卷八十九']
|
||||
}
|
||||
],
|
||||
bgm: {
|
||||
catalogId: 'zhanzhen:jingxing#0', title: '井陉之战', version: '电影级配乐·建议使用无主唱器乐 stem', status: 'pending-export', pathOrUrl: '',
|
||||
usage: '保留算盘般的冷钢琴动机、绷紧低弦与一次深鼓;第一幕极冷,第二幕压住不爆,第三幕收窄,第四幕在赤帜立起时形成唯一精准爆点,第五幕重新冻结;删除歌词与品牌尾签。',
|
||||
reason: '项目内与井陉直接绑定的自生成音乐,其冷静算计和“赤帜一刻”单爆结构与五幕战术链完全对应;仓库内暂无成品音频。',
|
||||
cues: [
|
||||
{ from: '00:00', to: '00:18', scene: '01', direction: '以冷钢琴和单音低弦表现被拒绝的上策。' },
|
||||
{ from: '00:18', to: '00:36', scene: '02', direction: '加入持续低音,不做热血背水主题。' },
|
||||
{ from: '00:36', to: '00:54', scene: '03', direction: '抽掉鼓点,拉紧诱敌过程。' },
|
||||
{ from: '00:54', to: '01:12', scene: '04', direction: '赤帜立起时出现唯一短促爆点。' },
|
||||
{ from: '01:12', to: '01:30', scene: '05', direction: '迅速回到冷钢琴,以战后礼待收束。' }
|
||||
]
|
||||
},
|
||||
sources: [
|
||||
{ claim: '李左车献策、陈馀不用、万人背水、二千骑拔帜、夹击战果与韩信战后论兵', citation: '《史记·淮阴侯列传》卷九十二', url: 'https://zh.wikisource.org/zh-hans/史记/卷092' },
|
||||
{ claim: '张耳陈馀交恶背景及井陉战后陈馀、赵王结局互证', citation: '《史记·张耳陈余列传》卷八十九', url: 'https://zh.wikisource.org/zh-hans/史记/卷089' }
|
||||
],
|
||||
blacklist: [
|
||||
'把赵军“号称二十万”当作已核实实数;汉军总数也不可简单写成三万或数千的确定值',
|
||||
'只画背水列阵而忽略侦察、诱敌空营与二千轻骑拔帜的完整战术链',
|
||||
'把陈馀描写成不会打仗的丑角;他拒绝的是李左车的诈谋奇计,史书保留其决策理由',
|
||||
'在赤帜上生成可读“汉”字、现代军徽或统一印刷图案',
|
||||
'断言背水所临水体与泜水的现代精确位置,或制作无争议的现代路线图',
|
||||
'现代字幕、Logo、水印、后世盔甲建筑、火器爆炸、奇幻法术、动漫画风或血腥斩首'
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
function markdown(pack) {
|
||||
const out = [
|
||||
`# ${pack.event.canonicalName}|素材说明`, '', '## 事件边界', '',
|
||||
`- 规范事件名:${pack.event.canonicalName}`, `- 常用称呼:${pack.event.aliases.join('、')}`, `- 时代:${pack.event.era}`, `- 日期:${pack.event.date}`, `- 地点:${pack.event.place}`, `- 一句话结论:${pack.event.summary}`, '',
|
||||
'## 60–90 秒主旁白', '', pack.narration.fullText, '', '## 分幕素材', ''
|
||||
]
|
||||
for (const scene of pack.scenes) out.push(
|
||||
`### ${scene.id}|${scene.title}`, '', `- 时间地点:${scene.timePlace}`, `- 本幕作用:${scene.purpose}`, `- 分幕旁白:${scene.narration}`, `- 页面标题:${scene.overlay.heading}`, `- 页面短句:${scene.overlay.line}`,
|
||||
`- PNG:\`${scene.image.original}\``, `- WebP:\`${scene.image.delivery}\``, `- 替代文本:${scene.image.alt}`, `- 视觉推演边界:${scene.image.visualInference}`,
|
||||
`- 人物:${scene.people.map((p) => `${p.name}(${p.office};${p.action})`).join(';')}`, `- 史料:${scene.sources.join(';')}`, '', '生成提示词:', '', '```text', scene.image.prompt, '```', ''
|
||||
)
|
||||
out.push('## BGM 选曲', '', `- 项目曲目:\`${pack.bgm.catalogId}\`|${pack.bgm.title}|${pack.bgm.version}`, `- 状态:${pack.bgm.status}`, `- 用法:${pack.bgm.usage}`, `- 选择理由:${pack.bgm.reason}`, `- 音频路径或 URL:${pack.bgm.pathOrUrl || '仓库暂缺,待导出'}`, '', '| 时间 | 分幕 | 编排 |', '|---|---|---|', ...pack.bgm.cues.map((c) => `| ${c.from}–${c.to} | ${c.scene} | ${c.direction} |`), '', '## 史料来源', '', ...pack.sources.map((s) => `- ${s.claim}:[${s.citation}](${s.url})`), '', '## 禁区与误读防护', '', ...pack.blacklist.map((x) => `- ${x}`), '', '## 交付检查', '', '- [ ] 每幕 PNG 原图存在且为 16:9', '- [ ] 每幕 WebP 交付图存在且为 16:9', '- [x] 旁白、页面文案、人物标签、提示词、视觉推演和史料齐全', `- [${pack.bgm.status === 'ready' ? 'x' : ' '}] BGM 已导出并填写可用路径`, '- [ ] `manifest.json` 与本说明中的文件名全部校验通过', '')
|
||||
return `${out.join('\n')}\n`
|
||||
}
|
||||
|
||||
for (const pack of packs) {
|
||||
const dir = path.join(outputRoot, pack.dir)
|
||||
if (fs.existsSync(dir)) throw new Error(`Refusing to overwrite existing package: ${dir}`)
|
||||
fs.mkdirSync(path.join(dir, 'images'), { recursive: true })
|
||||
const manifest = { event: pack.event, narration: pack.narration, scenes: pack.scenes, bgm: pack.bgm, sources: pack.sources, blacklist: pack.blacklist }
|
||||
fs.writeFileSync(path.join(dir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`)
|
||||
fs.writeFileSync(path.join(dir, '素材说明.md'), markdown(pack))
|
||||
}
|
||||
|
||||
console.log(`Generated ${packs.length} Chu-Han battle packages under ${outputRoot}`)
|
||||
Reference in New Issue
Block a user