数字我 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,366 @@
|
||||
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 late-Qin realism, subtle film grain, physically plausible human and terrain scale. Materials: rammed earth, aged timber, hemp, low-sheen silk, leather, lacquered lamellar armor, wooden carts, bronze and iron tools; Qin equipment uses black, dark umber and restrained cinnabar, never fantasy all-black armor. Composition: cinematic 16:9 landscape with clear foreground, middle ground and background; leave a quiet area of sky, earth, wall or water for later webpage overlay; use natural faces and distinct silhouettes. Constraints: no baked-in text, readable banners, names, subtitles, logo or watermark; violence through movement, damaged equipment and consequences, never gore. Avoid: terracotta statues as living soldiers, clone-face armies, 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, fantasy creatures, magic or anime.`
|
||||
|
||||
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 late-Qin battle story frame, 16:9 landscape. Primary request: ${request} ${VISUAL_BASE}`,
|
||||
visualInference,
|
||||
refinementPrompt: ''
|
||||
}
|
||||
}
|
||||
|
||||
const packs = [
|
||||
{
|
||||
dir: '蒙恬北击匈奴(略取河南地)',
|
||||
event: {
|
||||
canonicalName: '蒙恬北击匈奴(略取河南地)',
|
||||
aliases: ['蒙恬北击胡', '蒙恬略取河南地', '秦北击匈奴'],
|
||||
era: '秦始皇三十二年',
|
||||
date: '公元前215年',
|
||||
place: '秦帝国北部边地与河南地(今河套一带)',
|
||||
summary: '秦始皇因“亡秦者胡也”命蒙恬发兵三十万北击匈奴,秦军略取河南地。'
|
||||
},
|
||||
narration: {
|
||||
language: 'zh-CN', estimatedSeconds: 76,
|
||||
fullText: '公元前二一五年,燕人卢生从海上归来,献上一句“亡秦者胡也”。秦始皇把“胡”理解为北方匈奴,于是命蒙恬发兵三十万北上。对普通戍卒而言,他们未必听过那句谶语,只知道军令已下,要离开关中,穿过干旱的北地。蒙恬率军向河南地推进,把匈奴势力逐出黄河河套以南地区。《史记》只留下“北击胡,略取河南地”九个字,没有记录一场可以被命名的决战,也没有给出双方伤亡。真正改变边疆的,是大军、粮车和戍守体系持续向北移动。秦在北线赢得了土地,却也把三十万人的劳役与补给压在帝国最远的边缘。'
|
||||
},
|
||||
scenes: [
|
||||
{
|
||||
id: '01', title: '谶语入宫', timePlace: '公元前215年,秦都咸阳', purpose: '交代北征决策的史书记载,不把谶语表现成神迹。',
|
||||
narration: '卢生献上“亡秦者胡也”。始皇把“胡”理解为匈奴,北征由此发端。',
|
||||
overlay: { heading: '谶语入宫', line: '一句含混的话,被读成了三十万人的军令。' },
|
||||
people: [
|
||||
{ name: '秦始皇', office: '皇帝', action: '听取图书之语,决定北击匈奴' },
|
||||
{ name: '卢生', office: '燕人方士', action: '奏录图书“亡秦者胡也”' }
|
||||
],
|
||||
image: image('01-prophecy-at-court', '咸阳一座克制的秦代殿室内,卢生呈上一卷竹简,秦始皇与群臣审视,窗外是冷灰天光,没有发光文字或神异景象。', 'Interior of a restrained late-Qin audience hall in Xianyang. Lu Sheng, a travel-worn middle-aged East Asian man in plain hemp and dark robe, presents a closed bamboo-slip bundle with both hands; no writing is visible. Qin Shi Huang, mature East Asian ruler in austere black-brown court robes and a simple period-appropriate headpiece, studies him from a low raised platform while a few officials stand apart. Cold daylight enters from one side, leaving calm negative space on a rammed-earth wall; political unease, not supernatural spectacle.', '人物站位、殿室形制、竹简封闭状态与冷光为视觉重构;史料只载卢生奏图书及其语。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
},
|
||||
{
|
||||
id: '02', title: '三十万北上', timePlace: '秦始皇三十二年,关中通往北地的道路', purpose: '把“发兵三十万”落到征发、运输与普通士卒身上。',
|
||||
narration: '蒙恬奉命发兵三十万。人马与粮车沿北地道路拉成长线,军令离宫廷越来越远。',
|
||||
overlay: { heading: '三十万北上', line: '史书写的是数字,路上走的是一个个具体的人。' },
|
||||
people: [
|
||||
{ name: '蒙恬', office: '秦将军', action: '统率北征军' },
|
||||
{ name: '秦军戍卒', office: '征发士卒', action: '随军北上并承担行军、护粮与戍守' }
|
||||
],
|
||||
image: image('02-army-marches-north', '黄土高地的长坡上,蒙恬在前景观察北上队伍,秦军步卒、骑兵与粮车分层延伸到远处,人数庞大但比例真实。', 'Vast but physically plausible northbound Qin column crossing a dry loess ridge. Meng Tian, a weathered East Asian commander in his forties with tied hair, short moustache, dark lacquered lamellar armor and plain brown-black cloak, watches from a foreground rise. Infantry files, modest cavalry, pack animals and wooden grain carts follow separate tracks into the middle distance; emphasize logistics and fatigue rather than a parade. Pale open sky provides overlay space.', '具体路线、队列编组、蒙恬外貌与粮车层次为视觉补全;“三十万”与蒙恬统兵有史载。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
},
|
||||
{
|
||||
id: '03', title: '北击于河', timePlace: '河南地南缘,黄河沿岸', purpose: '呈现北击行动,但不虚构某场有名称、有精确阵形的决战。',
|
||||
narration: '北线没有留下单一决战的名字。秦军沿河推进,迫使匈奴骑队向北撤离。',
|
||||
overlay: { heading: '北击于河', line: '不是一场被命名的大会战,而是一条战线持续北移。' },
|
||||
people: [
|
||||
{ name: '蒙恬', office: '秦将军', action: '指挥秦军沿河南地推进' },
|
||||
{ name: '匈奴骑队', office: '北方游牧武装', action: '在秦军推进压力下向北转移;具体首领不明' }
|
||||
],
|
||||
image: image('03-drive-across-the-river-loop', '黄河弯道旁的开阔草原上,秦军盾弩阵稳步推进,远处匈奴骑队转向北方,蒙恬从侧后方观察,不表现虚构单挑。', 'Wide Yellow River bend and open grassland at the southern edge of the Ordos loop. Qin crossbowmen and shield infantry advance in disciplined, human-scale groups while a distant Xiongnu mounted formation turns away across higher ground, preserving mobility rather than charging theatrically. Meng Tian, matching scene 02, observes from the flank beside aides. Dust, cold wind, no named duel, no giant clash, no readable standards.', '黄河视角、兵种配置、骑队撤离方向与同框关系为合理视觉推演;史料仅载北击胡、略取河南地。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
},
|
||||
{
|
||||
id: '04', title: '河南地易手', timePlace: '战后,河南地', purpose: '以驻防与补给收束“略取河南地”,提示边功伴随长期成本。',
|
||||
narration: '秦军略取河南地。新营垒和粮道留在河套,而北征的代价也从战场转成了长期戍守。',
|
||||
overlay: { heading: '河南地易手', line: '土地向北扩了一段,补给线也被拉长了一段。' },
|
||||
people: [
|
||||
{ name: '蒙恬', office: '秦将军', action: '主持新占地区的军队部署' },
|
||||
{ name: '秦军戍卒与民夫', office: '边地驻防及运输人员', action: '修整营垒、转运粮草;具体编制不明' }
|
||||
],
|
||||
image: image('04-henan-land-held', '河套暮色中,一座朴素秦军营垒正在搭建,戍卒修补栅栏、民夫卸下粮袋,蒙恬远望黄河与北方草地,没有凯旋仪式。', 'Quiet dusk after the campaign in the Henan lands. A modest Qin frontier encampment of timber palisades, earthworks and low tents takes shape beside the river plain. Soldiers repair defenses while laborers unload grain sacks from wooden carts; tired horses drink nearby. Meng Tian, same identity, stands on an earth bank facing the northern grassland, with no triumphal pose. Warm last light under a large subdued sky, the cost of holding territory visible in routine work.', '营垒、粮运、暮色与蒙恬远望为视觉补全;“略取河南地”是史实,具体驻防画面不作制度细节断言。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
}
|
||||
],
|
||||
bgm: {
|
||||
catalogId: 'zhanzhen:baideng#0', title: '白登之围', version: '电影级配乐·仅取无主唱草原器乐 stem', status: 'pending-export', pathOrUrl: '',
|
||||
usage: '保留低沉草原长音、风声质感与稀疏鼓点,删除全部歌词、人物主题和“白登”专属声音;第三幕略加强节奏,结尾回到补给与戍守的冷静。',
|
||||
reason: '项目尚无蒙恬北征专属曲;此曲属于项目自生成的北方草原战事音乐,抽取无主唱器乐层后可复用,仓库内暂无成品音频。',
|
||||
cues: [
|
||||
{ from: '00:00', to: '00:19', scene: '01', direction: '极低配器,避免把谶语神秘化。' },
|
||||
{ from: '00:19', to: '00:38', scene: '02', direction: '加入行军脉冲,突出漫长队列与补给。' },
|
||||
{ from: '00:38', to: '00:57', scene: '03', direction: '短促加强节奏,不做英雄式爆点。' },
|
||||
{ from: '00:57', to: '01:16', scene: '04', direction: '撤去主鼓,仅留低弦、风感和稀疏金石音。' }
|
||||
]
|
||||
},
|
||||
sources: [
|
||||
{ claim: '卢生奏“亡秦者胡也”、始皇命蒙恬发兵三十万北击胡并略取河南地', citation: '《史记·秦始皇本纪》卷六', url: 'https://zh.wikisource.org/zh-hans/史记/卷006' }
|
||||
],
|
||||
blacklist: [
|
||||
'把谶语画成发光神书、天降文字或确定预言;它只是史书记载中的政治触发点',
|
||||
'虚构一场有名称、精确日期、精确伤亡或单挑过程的“河南地决战”',
|
||||
'把秦军三十万理解为单个镜头必须出现三十万人,或给匈奴编造对等精确兵力',
|
||||
'把“河南地”误解为今天河南省;此处指黄河河套以南地区',
|
||||
'现代文字、字幕、书法、地图箭头、Logo、水印或可读军旗',
|
||||
'秦兵陶俑化、克隆脸、玄幻黑甲、后世盔甲建筑、火器爆炸或血腥尸山'
|
||||
]
|
||||
},
|
||||
{
|
||||
dir: '章邯骊山徒破周章',
|
||||
event: {
|
||||
canonicalName: '章邯骊山徒破周章',
|
||||
aliases: ['章邯赦骊山徒', '戏之战', '章邯破周章'],
|
||||
era: '秦二世二年冬',
|
||||
date: '公元前208年',
|
||||
place: '戏及咸阳东部、骊山一带',
|
||||
summary: '周章军西至戏、逼近咸阳;少府章邯请赦骊山刑徒并授兵,率临时编成的秦军击破周章。'
|
||||
},
|
||||
narration: {
|
||||
language: 'zh-CN', estimatedSeconds: 79,
|
||||
fullText: '公元前二〇八年冬,陈胜派出的周章一路向西,军队已到戏,逼近秦都咸阳。《史记》说其兵数十万,秦二世大惊,问群臣怎么办,朝堂一时无人能答。少府章邯站了出来。他原本掌管宫廷财政与官府手工业,不是统兵将领,却看见了咸阳眼前唯一还来得及动员的人:骊山刑徒。章邯请求赦免这些正在服役的囚徒,发给兵器,让他们立刻迎敌。二世大赦,使章邯统领这支临时军队。昨天还拿着土筐和工具的人,今天被编入军阵。史书没有留下戏地交战的阵形和伤亡,只记章邯击破周章,迫使其败走。这场胜利暂时解除了咸阳之危,也暴露了秦帝国已经必须靠刑徒组成最后的野战军。'
|
||||
},
|
||||
scenes: [
|
||||
{
|
||||
id: '01', title: '周章兵至戏', timePlace: '公元前208年冬,戏与咸阳以东', purpose: '建立周章军逼近秦都的速度与压力,不把“数十万”当作精确点数。',
|
||||
narration: '周章军西入至戏,距离咸阳已经不远。秦廷第一次直接听见关东起义军逼近都城。',
|
||||
overlay: { heading: '周章兵至戏', line: '关东的火,已经烧到咸阳门外。' },
|
||||
people: [
|
||||
{ name: '周章', office: '陈胜所遣将领', action: '率起义军西进至戏' },
|
||||
{ name: '周章军', office: '反秦军', action: '逼近咸阳;史载“兵数十万”' }
|
||||
],
|
||||
image: image('01-zhou-zhang-reaches-xi', '冬日黄土原上,周章站在行军队伍前观察通往咸阳的道路,反秦军由不同衣着和简陋装备的人组成,远处可见关中驿路烟尘。', 'Winter loess plain near Xi east of Xianyang. Zhou Zhang, a sturdy East Asian rebel commander in his forties wearing worn mixed armor and a dark cloth cloak, surveys the westward road from a low ridge. Behind him stretches a large, uneven rebel host: farmers, former conscripts and armed followers with mismatched shields, spears and supply carts, visibly formidable but not an impossible digital swarm. Distant road dust points toward the capital; no city skyline fantasy, no readable banners.', '周章外貌、军队成分、视野与行军队列为视觉重构;西至戏及“兵数十万”见史载,人数不作精确可视化。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
},
|
||||
{
|
||||
id: '02', title: '少府献策', timePlace: '秦都咸阳,秦二世朝廷', purpose: '突出章邯由少府转为领兵者的关键提议。',
|
||||
narration: '二世问群臣“奈何”。少府章邯答:近县征兵已来不及,骊山刑徒很多,请赦免并授兵。',
|
||||
overlay: { heading: '少府献策', line: '常规征兵来不及,唯一现成的人力在骊山。' },
|
||||
people: [
|
||||
{ name: '秦二世', office: '皇帝', action: '惊问群臣并接受章邯建议' },
|
||||
{ name: '章邯', office: '少府', action: '请赦骊山徒、授兵迎敌' },
|
||||
{ name: '秦廷群臣', office: '公卿', action: '面对周章逼近未能提出对策' }
|
||||
],
|
||||
image: image('02-zhang-han-proposes-pardon', '昏暗秦廷内,章邯从沉默群臣中上前陈策,秦二世坐在上方急切注视,地上展开的只是无字木牍与军报,不出现后世地图。', 'Tense late-Qin court in Xianyang. Zhang Han, an alert middle-aged East Asian official in restrained dark-brown administrative robes rather than general armor, steps forward from a line of silent ministers and addresses Qin Er Shi. The young emperor sits rigidly on a modest raised platform in austere robes, alarm visible without caricature. An attendant holds sealed wooden reports with no visible writing; empty rammed-earth wall and shadow dominate the frame. Political emergency, no ornate Forbidden City grandeur.', '人物神态、朝堂空间与军报道具为视觉补全;二世问计、群臣无对、章邯请赦授兵有史载。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
},
|
||||
{
|
||||
id: '03', title: '刑徒授兵', timePlace: '骊山役所', purpose: '把大赦与临时编军呈现为制度性转换,不浪漫化刑徒处境。',
|
||||
narration: '赦令下达。骊山刑徒放下土筐和工具,领取盾矛,在秦吏监督下匆忙编伍。',
|
||||
overlay: { heading: '刑徒授兵', line: '赦免不是回家,而是把工具换成兵器。' },
|
||||
people: [
|
||||
{ name: '章邯', office: '少府、临时领军者', action: '组织刑徒授兵编伍' },
|
||||
{ name: '骊山刑徒', office: '服役囚徒', action: '获赦后被授兵迎战周章' },
|
||||
{ name: '秦吏', office: '役所与军队管理人员', action: '核验并组织发放兵器;具体流程为视觉重构' }
|
||||
],
|
||||
image: image('03-convicts-receive-arms', '骊山脚下的役所空地上,疲惫刑徒排队放下土筐、领取盾和矛,章邯已换上实用甲胄在一旁组织,陵园只以远处土木工地暗示。', 'Open work yard at the foot of Lishan. Exhausted adult convicts in worn hemp clothing set down earth baskets, wooden shovels and carrying poles, then receive practical shields and spears from Qin storekeepers; show uncertainty, fatigue and coercion rather than celebratory enlistment. Zhang Han now wears simple functional lacquered armor over official clothing and organizes rough files with a few officers. The imperial tomb works are only distant earthworks and scaffolds, never a fantasy mausoleum or visible terracotta army.', '授兵流程、刑徒衣着、章邯换甲及工地形态为视觉补全;赦骊山徒、授兵、使章邯将有史载。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
},
|
||||
{
|
||||
id: '04', title: '破军而走', timePlace: '戏附近,交战后段', purpose: '忠实呈现“击破周章军而走”,避免编造战术细节与夸张屠杀。',
|
||||
narration: '章邯率临时编成的秦军迎战。周章军被击破向东败走,咸阳的危机暂时解除。',
|
||||
overlay: { heading: '破军而走', line: '秦赢回了时间,也暴露了自己还能动用什么。' },
|
||||
people: [
|
||||
{ name: '章邯', office: '秦军将领', action: '率骊山徒组成的军队击破周章' },
|
||||
{ name: '周章', office: '反秦将领', action: '军败后撤;本幕不延伸其后续结局' },
|
||||
{ name: '骊山徒军', office: '秦军临时兵员', action: '参与交战并取得胜势' }
|
||||
],
|
||||
image: image('04-rebels-retreat-from-xi', '戏附近尘土弥漫的战场上,章邯指挥刚编成的盾矛军稳住阵线,周章军向远处有序转为溃退,地面有丢弃器械但不见尸山。', 'Late phase of fighting near Xi on a dusty winter plain. Zhang Han, matching scene 03, directs a rough but holding Qin shield-and-spear line made from newly armed convicts. In the middle distance Zhou Zhang, matching scene 01, turns his fragmented forces eastward into retreat; broken carts, dropped shields and snapped spear shafts show collapse without gore. Avoid depicting a specific undocumented trick, formation or duel. Wide oblique view, capital-safe relief mixed with exhaustion, quiet sky for overlay.', '阵线形态、撤退方向、交战器械与两将同框为视觉推演;史料只明确章邯击破周章军而走。'),
|
||||
sources: ['《史记·秦始皇本纪》卷六']
|
||||
}
|
||||
],
|
||||
bgm: {
|
||||
catalogId: 'zhanzhen:julu#1', title: '巨鹿之战', version: '王离版·仅取无主唱器乐 stem', status: 'pending-export', pathOrUrl: '',
|
||||
usage: '只复用下沉的大提琴、低频与稀疏打击层,删除王离歌词与巨鹿专属声场;第二幕短暂收空,第三幕加入粗粝节奏,结尾不作胜利凯歌。',
|
||||
reason: '项目尚无周章之战专属曲;王离版属于项目自生成的秦末军团主题,其下沉质感能连接“临时续命”与后续巨鹿崩解,仓库内暂无成品音频。',
|
||||
cues: [
|
||||
{ from: '00:00', to: '00:20', scene: '01', direction: '低频压迫建立逼都危机。' },
|
||||
{ from: '00:20', to: '00:40', scene: '02', direction: '撤去鼓点,以一条低弦托住朝堂问答。' },
|
||||
{ from: '00:40', to: '01:00', scene: '03', direction: '加入木质敲击和不整齐行军节拍。' },
|
||||
{ from: '01:00', to: '01:19', scene: '04', direction: '短促加强后迅速下坠,提示这只是暂时解围。' }
|
||||
]
|
||||
},
|
||||
sources: [
|
||||
{ claim: '周章西至戏、二世问计、章邯请赦骊山徒授兵并击破周章', citation: '《史记·秦始皇本纪》卷六', url: 'https://zh.wikisource.org/zh-hans/史记/卷006' },
|
||||
{ claim: '周章为陈胜所遣将领及其西进背景', citation: '《史记·陈涉世家》卷四十八', url: 'https://zh.wikisource.org/zh-hans/史记/卷048' }
|
||||
],
|
||||
blacklist: [
|
||||
'把少府章邯画成一开始就是世袭大将;他以少府身份献策并由此领军',
|
||||
'把骊山刑徒浪漫化为自愿效忠、整齐精锐,或画成秦始皇陵兵马俑复活',
|
||||
'虚构戏地精确阵形、伏击计谋、单挑、双方伤亡和一日内完整战斗过程',
|
||||
'把周章在后续战败后的结局直接画进本次“破军而走”现场',
|
||||
'现代文字、字幕、书法、地图箭头、Logo、水印或可读军旗',
|
||||
'后世盔甲建筑、龙袍冕旒、火器爆炸、玄幻法术、克隆脸或血腥尸山'
|
||||
]
|
||||
},
|
||||
{
|
||||
dir: '巨鹿之战(破釜沉舟)',
|
||||
event: {
|
||||
canonicalName: '巨鹿之战(破釜沉舟)',
|
||||
aliases: ['钜鹿之战', '破釜沉舟', '项羽救赵'],
|
||||
era: '秦二世三年',
|
||||
date: '公元前207年',
|
||||
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-city-and-supply-corridor', '高处俯瞰钜鹿夯土城、王离围城营垒与通向南方棘原的夹墙甬道,粮车正在通道中运行,三层空间关系清楚但不像现代地图。', 'Elevated oblique view across the Julu battlefield on the Hebei plain. A compact rammed-earth city with worn timber gates sits under tight Qin siege lines led by Wang Li; southward, a long protected supply corridor formed by parallel low earth walls guides grain carts toward the siege camps, visually linking to Zhang Han’s distant field encampment at Jiyuan. Inside the city, sparse defenders are visible without individual close-ups. Make geography legible through natural terrain and depth, never as a modern map or infographic.', '古城、营垒、甬道和棘原军营的同框空间关系为视觉重构;王离围城、章邯军棘原及筑甬道输粟有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七', '《史记·张耳陈余列传》卷八十九']
|
||||
},
|
||||
{
|
||||
id: '02', title: '斩宋义夺军', timePlace: '安阳,楚军停驻期间', purpose: '交代项羽如何从次将成为实际主帅;克制表现帐中处决。',
|
||||
narration: '宋义在安阳停留四十六日。项羽入帐杀宋义,楚怀王随后任命项羽为上将军。',
|
||||
overlay: { heading: '斩宋义夺军', line: '救赵之前,楚军先换了主帅。' },
|
||||
people: [
|
||||
{ name: '项羽', office: '楚军次将,后为上将军', action: '帐中杀宋义并取得救赵军指挥权' },
|
||||
{ name: '宋义', office: '楚上将军、卿子冠军', action: '停军安阳四十六日,后被项羽所杀' },
|
||||
{ name: '楚军将领', office: '救赵军军官', action: '在权力骤变后接受项羽指挥' }
|
||||
],
|
||||
image: image('02-command-changes-at-anyang', '寒雨后的楚军营帐内,项羽持未出鞘佩剑站在倒下的案几旁,宋义已不在正面视野,诸将震惊而沉默,画面以权力更替而非斩首血腥为中心。', 'Inside a rain-darkened Chu command tent at Anyang after the decisive confrontation. 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, stands beside an overturned command table, one hand on a sheathed sword. Song Yi is implied only by an abandoned official cap and screened attendants at the far edge, no severed head or gore. Shocked Chu officers hold still as authority shifts. Cold wet camp visible through the open flap; tense, contained political violence.', '帐内位置、倒案、佩剑和以冠帽暗示宋义结局均为克制视觉重构;停安阳四十六日、项羽帐中斩宋义及继任有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七']
|
||||
},
|
||||
{
|
||||
id: '03', title: '渡河破釜', timePlace: '钜鹿外围河道,决战前', purpose: '呈现破釜沉舟的完整行动,不把它简化成只砸一口锅的摆拍。',
|
||||
narration: '英布、蒲将军先率二万人渡河。项羽随后引全军渡河,沉船、破釜、烧庐,只带三日粮。',
|
||||
overlay: { heading: '渡河破釜', line: '船沉、釜破、庐烧,退路被主动从军中拿走。' },
|
||||
people: [
|
||||
{ name: '项羽', office: '楚上将军', action: '率楚军主力渡河并下达绝退行动' },
|
||||
{ name: '英布', office: '当阳君、楚军先遣将领', action: '与蒲将军率二万先渡河击秦' },
|
||||
{ name: '蒲将军', office: '楚军先遣将领', action: '与英布率二万先渡河' }
|
||||
],
|
||||
image: image('03-cross-river-break-cauldrons', '河滩上楚军完成渡河,士卒凿沉木船、砸破陶釜并拆烧临时庐舍,项羽在高处监督向前集结,动作真实且无夸张火海。', 'Broad riverbank after the Chu crossing. Soldiers deliberately hole and push simple wooden boats into the water, smash clay cooking cauldrons with stones, and burn a few rough shelters in controlled low flames; others shoulder only small three-day ration bundles and form for the advance. Xiang Yu, same identity as scene 02, stands on a low bank directing the forward assembly. Show purposeful discipline and unease, not a festival bonfire. No readable banners, no huge explosion, no modern bridge.', '具体河岸、船型、破釜动作、三日粮包与火势为视觉补全;沉船、破釜甑、烧庐舍、持三日粮有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七']
|
||||
},
|
||||
{
|
||||
id: '04', title: '九战绝甬道', timePlace: '钜鹿城外及秦军甬道', purpose: '把胜负关键落在连续交战与切断补给,不虚构单次冲锋即结束全役。',
|
||||
narration: '楚军与秦军九战,反复截断甬道。粮车停住,王离围城军逐渐失去补给,攻守由此逆转。',
|
||||
overlay: { heading: '九战绝甬道', line: '真正被击中的,是围城军赖以维持的粮道。' },
|
||||
people: [
|
||||
{ name: '项羽', office: '楚上将军', action: '率军九战并绝秦军甬道' },
|
||||
{ name: '王离', office: '秦军前线主将', action: '围城军在粮道被断后陷入乏食' },
|
||||
{ name: '楚军与秦军士卒', office: '交战双方', action: '围绕甬道反复争夺' }
|
||||
],
|
||||
image: image('04-nine-battles-cut-the-corridor', '破损甬道旁,楚军越过倒塌土墙截住粮车,项羽指向前方组织推进;王离的秦军在远处回防,连续争夺通过尘土与多处旧损表现。', 'Decisive fighting around the Qin supply corridor. Sections of the parallel earth walls are breached; Chu spear-and-shield groups surge through to halt grain carts while Qin defenders pivot from the siege lines to protect the route. Xiang Yu, same face and armor, directs from the active middle ground without superhero posing. Repeated prior clashes are suggested by repaired walls, several old breaks, abandoned cart wheels and trampled earth, not nine simultaneous cloned battles. Dynamic wide frame, non-graphic action, Julu city distant in haze.', '九次交战以多处新旧破损压缩表现,具体突破点、粮车位置与项羽指挥姿态为视觉推演;“九战,绝其甬道”有史载。'),
|
||||
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-wang-li-captured', '楚军辕门前,王离卸下兵器被看守但未受羞辱,项羽站在营内接受战报,数名诸侯将领低身进入;远处钜鹿城门开启,守军与百姓谨慎走出。', 'After the collapse of the Qin siege army, outside the Chu command gate. Wang Li, an older East Asian Qin commander in damaged but dignified dark lamellar armor, has surrendered his sword and stands guarded, not bound, kneeling or humiliated. Xiang Yu, consistent with prior scenes, receives reports inside the gate while several allied lords enter deeply bowed and hesitant, conveying “dare not look up” without a mass worship spectacle. Far behind, Julu’s gate opens and thin defenders emerge. Quiet aftermath, scattered weapons, no portrayal of Su Jiao’s corpse or She Jian’s death.', '王离交剑、诸侯人数与姿态、城门开启及解围后的同框为视觉补全;杀苏角、虏王离、涉间不降自尽、诸侯膝行与围解均有史载。'),
|
||||
sources: ['《史记·项羽本纪》卷七', '《史记·张耳陈余列传》卷八十九']
|
||||
}
|
||||
],
|
||||
bgm: {
|
||||
catalogId: 'zhanzhen:julu#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/史记/卷089' },
|
||||
{ claim: '王离为王翦之孙、王贲之子及其兵败被俘', citation: '《史记·白起王翦列传》卷七十三', url: 'https://zh.wikisource.org/zh-hans/史记/卷073' }
|
||||
],
|
||||
blacklist: [
|
||||
'把章邯和王离混成同一位前线主将;王离围城,章邯驻棘原并负责后援粮道',
|
||||
'宣称秦军总数为四十万;正史无钜鹿秦军总兵力,二十余万是后来章邯降卒数据',
|
||||
'把安阳寒雨当成钜鹿决战当天的天气,或把天气写成胜负关键',
|
||||
'把破釜沉舟画成项羽独自砸一口锅,忽略沉船、烧庐、持三日粮与全军行动',
|
||||
'把新安坑杀二十余万降卒、章邯洹水投降直接混进钜鹿决战当天',
|
||||
'把古钜鹿位置断言为今天巨鹿县唯一确定地点;项目采用平乡一带但注明有异说',
|
||||
'现代文字、字幕、地图箭头、Logo、水印、可读军旗、后世盔甲建筑、火器爆炸或血腥尸山'
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
function renderMarkdown(pack) {
|
||||
const lines = [
|
||||
`# ${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) {
|
||||
lines.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((person) => `${person.name}(${person.office};${person.action})`).join(';')}`,
|
||||
`- 史料:${scene.sources.join(';')}`, '',
|
||||
'生成提示词:', '', '```text', scene.image.prompt, '```', ''
|
||||
)
|
||||
}
|
||||
lines.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((cue) => `| ${cue.from}–${cue.to} | ${cue.scene} | ${cue.direction} |`), '',
|
||||
'## 史料来源', '',
|
||||
...pack.sources.map((source) => `- ${source.claim}:[${source.citation}](${source.url})`), '',
|
||||
'## 禁区与误读防护', '',
|
||||
...pack.blacklist.map((item) => `- ${item}`), '',
|
||||
'## 交付检查', '',
|
||||
'- [ ] 每幕 PNG 原图存在且为 16:9',
|
||||
'- [ ] 每幕 WebP 交付图存在且为 16:9',
|
||||
'- [x] 旁白、页面文案、人物标签、提示词、视觉推演和史料齐全',
|
||||
`- [${pack.bgm.status === 'ready' ? 'x' : ' '}] BGM 已导出并填写可用路径`,
|
||||
'- [ ] `manifest.json` 与本说明中的文件名全部校验通过', ''
|
||||
)
|
||||
return `${lines.join('\n')}\n`
|
||||
}
|
||||
|
||||
for (const pack of packs) {
|
||||
const packDir = path.join(outputRoot, pack.dir)
|
||||
if (fs.existsSync(packDir)) throw new Error(`Refusing to overwrite existing package: ${packDir}`)
|
||||
fs.mkdirSync(path.join(packDir, '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(packDir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`)
|
||||
fs.writeFileSync(path.join(packDir, '素材说明.md'), renderMarkdown(pack))
|
||||
}
|
||||
|
||||
console.log(`Generated ${packs.length} Qin gap packages under ${outputRoot}`)
|
||||
Reference in New Issue
Block a user