漫剧(小说 / 网文 / 漫画改编)· 四站式流水线(novel-video-pipeline)
Overview
把一段文本故事(网文小说、漫画、原创剧本、童话绘本等)稳定地转化为可喂给文生视频模型的分镜提示词包 + 视觉参考图 + CC0 配音配乐,全程守住「不复制真实第三方版权形象」底线。默认面向漫剧(横屏 16:9 / 多集连载)产线,也可按需切换为儿童向漫剧、单集短视频等子类型。产线基调对标当下爆款漫剧的「强钩子 + 情绪拉扯 + 反转 + 爽点 + 集间悬念」节奏,但只取法其方法层骨架,角色 / 情节 / 画风一律原创。
流水线由四个顺序工作站组成,每站产出一份约定 JSON / 资源目录,下一站消费上一站产物。核心生产顺序:先建资产库(S2),再写分镜词(S3)——分镜只是把资产按镜头语言排布,确保角色一致性与场景空间连续。
S1 改编剧本 ──script.json──▶ S2 资产库 ──character_manifest + scene_manifest (+ visual_manifest)──▶ S3 分镜提示词 ──storyboard.json(引用资产+ref_images锚定)──▶ S4 音频 ──audio_manifest──▶ S5 合成 ──成片
- S1 改编剧本:把长篇/原文压缩成「教学或叙事价值骨架 + 节拍表」,输出
script.json(title / logline / characters / scenes / beats)。 - S2 资产库(先建):通读全局剧本,建立角色三视图资产(
character_manifest.json:visual_lock + front/side/back 三视图 + 锚定图包 + fixed_prompt)与场景正反打多视图资产(scene_manifest.json:axis_of_action + establishing/OTS A→B/reverse/insert),并配套拉取公共领域 / CC0 视觉参考图(visual_manifest.json)。套用 IP 防火墙负向词。这一步产出的就是「资产库」,供 S3 直接引用。 - S3 分镜提示词(基于资产库):把每个 beat 展开成镜头(shot),每条 shot 引用
character_ref(角色+视图)与scene_ref(场景+视图),从资产库锁定描述 + 运镜库(camera-movements.json)+ 平台预设拼出 prompt,注入negative_prompt,输出storyboard.json。 - S4 音频:为镜头匹配 CC0 BGM / 音效,输出
audio_manifest.json。 - S5 合成(闭环到成片):把 S3
storyboard.json(含ref_images锚定图)+ S4audio_manifest.json闭合成片——逐镜生图/图生视频(用ref_images锁脸)→ 音频对齐 → 剪辑拼接(按duration_s与aspect_ratio)→ 平台导出 → 一致性终检。详见references/s5-composite.md与scripts/build_ffmpeg_concat.py。
When To Use(触发)
- 用户给出一段故事/小说/网文/漫画/剧本,要「做成漫剧 / 短视频 / 分镜 / 动画」。
- 用户要「改编剧本、写分镜提示词、生成视频脚本、配画风、配音乐」。
- 用户需要任意单站产出(如只想要分镜提示词,或只想要公共领域参考图)。
- 用户对素材有「版权干净 / 可商用 / 零 IP 风险」硬要求。
工作流(Workflow)
全流程参考热门开源方案的编排思路,但代码自研、资产自包含:
- ViMax(MIT,~392 commits 的 S1→S4 编排流水线)→ 借鉴其「故事→分镜→视频」的阶段切分与产物契约。
- seedance-prompt-skill / ai-shortfilm-prompts(MIT)→ 借鉴其 SKILL 格式的提示词模板组织方式,作为 S3 底座。
- ArcReel(AGPL)→ 仅学架构,不抄代码(AGPL 传染性,禁止合入本 MIT 风格 skill)。 详见
references/architecture-licenses.md。
第 0 步 · 接收需求
确认四点:① 源故事(网文 / 漫画 / 原创剧本 / 贴文或给路径);② 目标平台(横屏漫剧默认 B站 / YouTube 向,见 assets/s3/platform-presets.json 的 bilibili;竖屏抖音 / 视频号向则用 douyin);③ 画风(国漫 / 水彩 / 写实 / 浮世绘 / 童书插画…);④ 子类型与受众(默认横屏 16:9 漫剧,对标爆款节奏但原创;若儿童向则额外强制 IP 防火墙 + 排除 mature 内容)。
第 1 站 · S1 改编剧本
- 载入
assets/s1/story-structure.md(三幕 / 节拍结构模板)+assets/s1/adaptation-method.md(压缩方法论:保留价值骨架、删冗、情绪曲线)。 - 按需填
assets/s1/beat-sheet.md(可填节拍表)。 - 参考
assets/s1/example-romeo-juliet.md、example-journey-to-west.md两个改编范例。 - 产出
script.json,字段见references/workflow.md§S1 契约。
第 2 站 · S2 资产库(先建,后写分镜)
- 通读 S1 全部 beats / characters / scenes,建立角色资产:载入
assets/s2/character-design.md,为每个主要角色产出character_manifest.json(visual_lock + fixed_prompt + 三视图 front/side/back + 锚定图包 ref_pack + 一致性规则)。 - 建立场景资产:载入
assets/s2/scene-multiview.md,为每个主要场景产出scene_manifest.json(geography + axis_of_action + views{establishing, ots_a, ots_b, reverse, insert})。 - 配套拉取 / 生成公共领域 / CC0 视觉参考图
visual_manifest.json(多画风:国漫 / 水彩 / 写实 / 童书插画 / Met 公版美术…),套用 IP 防火墙。 - 套用 IP 防火墙:
assets/s2/negative-ip.json+assets/s2/negative-ip-firewall.md。 - 许可闸门:仅收
Public Domain/CC0。角色 / 场景资产一律原创,禁止同名同设定照搬爆款(详见 IP 防火墙 §六)。
第 3 站 · S3 分镜提示词(基于资产库写)
-
载入
assets/s3/template-library.json(分镜模板库:镜头类型 / 景别 / 情绪)+assets/s3/camera-movements.json(运镜库:40+ 运镜 + 节拍→运镜映射 + 平台语法)+assets/s3/platform-presets.json(各平台 prompt 语法、宽高比、时长上限)+assets/s3/tag-stats.json(标签频率统计)+assets/s3/negative-quality.md(质量负向词)+assets/s2/negative-ip.json(IP 防火墙)。 -
每 beat → 至少一 shot;每条 shot 必带
character_ref与scene_ref(引用 S2 资产库),并从资产fixed_prompt取锁定角色描述;从camera-movements.json取 1 个主运镜(subject_aware_map 按 beat 类型推荐);必带negative_prompt(IP 防火墙 + 质量负向拼接)。 -
产出
storyboard.json:shots[{shot_id, beat_ref, character_ref[], scene_ref, ref_images[](可选·直连锚定图,见下方「参考图锚定」), camera_movement, shot_size, speed(可选·速度修饰 slow_motion 等,见 camera-movements.json 的 speed_modifiers), prompt, prompt_readable, negative_prompt, platform, aspect_ratio, duration_s, attribution}]。权力变化镜头用camera_movement: low_angle/high_angle+speed: "slow_motion"(写法见assets/s2/scene-multiview.md§三(补)权力轴)。参考图锚定(ref_images,跨镜一致性关键):
ref_images是每镜直连锚定图的列表,比纯文本fixed_prompt更稳(对齐即梦 @引用 / Runway Gen-4 单图锁脸)。每条为字符串,约定两种写法:① 资产引用令牌char:<char_id>:<ref_pack键或three_view键>/scene:<scene_id>:<view>(由脚本自动从character_manifest.ref_pack抽取,生成器再解析为真实图路径);② 直接图路径 / URL(如/assets/char_shen_zhao_face.png)。建议每角色配 2–3 张(正面近景/侧面/全身),即梦上限 9 张、Runway 单张即锁。build_storyboard.py默认自动把角色ref_pack抽成ref_images;也可在 S5 合成时直接喂给图生视频模型做锁脸/锁服装参考。 -
CC BY 4.0 数据须带 attribution(本库资产均为 PD/CC0,默认免署名;若引入外部 CC BY 数据则必须填 attribution)。
-
脚手架加速(可选):先建好 S1
script.json+ S2character_manifest.json/scene_manifest.json,运行python scripts/build_storyboard.py --project <DIR> --platform bilibili自动生成storyboard.json草稿(按 beat 自动填character_ref/scene_ref、从subject_aware_map选 1 主运镜、按 beat 类型选景别、拼接negative_prompt全覆盖 IP 令牌),再人工精修相机角度 / 情绪 / 台词 / 节奏。该脚本是「资产优先」顺序的自动落地,产出可被validate_pipeline.py直接通过。
第 4 站 · S4 音频
- 载入
assets/s4/audio-manifest.json(已拉取的 CC0 音频清单,含 BGM / 音效 / 情绪类别:ambient / cinematic / playful / tense / romantic / lullaby 等)。 - 按镜头情绪匹配:悬疑低音→反转段、温柔钢琴→温情段、whoosh→转场、lullaby→安睡段、cartoon bounce→活泼段。
- 产出
audio_manifest.json:items[{file, license, source, duration_ms}],仅 CC0。
第 5 站 · S5 合成(闭环到成片)
- 载入
references/s5-composite.md(S5 合成 SOP:五步闭环 + 工具矩阵 + 一致性终检清单)。 1.5 解析锚定图:运行python scripts/resolve_ref_images.py --project <DIR>,把每条 shot 的ref_images令牌(char:<id>:<key>/scene:<id>:<view>)展开为真实图路径,产出storyboard.resolved.json(未解析令牌保留原串并告警)。 - 逐镜生图 / 图生视频:以
storyboard.resolved.json的ref_images(已解析真实图)作为锁脸/锁服装参考,配合fixed_prompt+camera_movement+camera-movements.json的lens/stages喂给即梦 @引用 / Runway Gen-4 / Kling / Seedance 生成每段 clip。 - 音频对齐:按 beat 情绪从
audio_manifest.json(CC0)选 BGM,按duration_s裁音效。 - 剪辑拼接:运行
python scripts/build_ffmpeg_concat.py --project <DIR> --clips-dir <DIR>/clips生成 concat 列表与命令,按aspect_ratio(横屏 16:9)导出 1080p。 - 一致性终检:核对 §四清单(角色/场景/轴线/权力轴/时长/IP 防火墙/音频/比例)后再发布。
第 6 步 · 门禁校验(必做)
运行 scripts/validate_pipeline.py --project <DIR> --platform bilibili [--strict] [--content-rating {normal,child}],校验四站产物契约 + 五道质量闸门:S3 每条 shot 的 negative_prompt 必须覆盖 assets/s2/negative-ip.json 全部被屏蔽 IP 令牌(守住真实第三方版权形象刚需,缺失在 strict 下即失败);时长须落在 platform-presets.json 对应平台合法集、比例须匹配(横屏漫剧默认 16:9);S4 音频时长 0.3–180s(保留真实极短音效)。--strict 下 warn 也判失败。通过后才可进入视频合成。
内容分级(重要 · 默认不限制题材):门禁默认 --content-rating normal —— 不做任何内容分级限制,打斗 / 暴力 / 悬疑 / 暗黑等成人向题材均可正常产出,仅守版权 IP 防火墙与资产契约。儿童向产线才追加 --content-rating child(或旧别名 --child):强制 S1 含「价值收尾」类节拍、S3 覆盖儿童安全负向令牌(violence/gore/horror/blood/mature/nudity/weapon…)、扫描 beats 命中成熟内容(strict 下为失败)。即:--child 是纯可选的「儿童安全开关」,不传则漫剧内容完全自由,不会低龄化。
拉取脚本(零 IP 风险)
两个脚本仅标准库 + 系统 curl,无需 pip install:
# S2 视觉资产:OBI 公共领域多画风插画(含童书/国漫风)+ Openverse CC0 图 + Met 公版美术
python scripts/fetch_visual_assets.py --out <DIR> --sources obi,openverse,met
# S4 音频:Openverse CC0(免 key);填 PIXABAY/FREESOUND key 可启用扩充通道
python scripts/fetch_audio.py --out <DIR>
- 质量闸门内置:许可(PD/CC0)、画质(长边≥1000 且短边≥600、文件≥50KB)、去重(SHA256 跨运行)、来源闸(仅机构源)、敏感闸(Openverse
mature=true一律排除,全平台硬要求)。 - OBI 传输用
curl引擎(--retry 5 --retry-all-errors -k)绕过本环境 Pythonurllib偶发 SSL 断流。
五道质量闸门(全站通用)
- 许可闸门:S2/S4 仅收
Public Domain/CC0;引入 CC BY 4.0 必须带 attribution。 - 画质闸门:图最长边≥1000 且短边≥600;音频时长 0.3–180s、文件≥100KB。
- 去重闸门:SHA256 跨运行持久化,重复图/音频自动跳过。
- 来源闸门:仅机构级 / 公共领域源(OBI、Openverse、Met、Freesound CC0…);拒收不明来源。
- 敏感闸门:全内容排除
mature(儿童向额外强化);S2/S3 强制注入 IP 防火墙负向词,屏蔽已知版权形象;对热门漫剧 / 网文 IP 可借鉴其题材 / 情绪 / 爽点结构(方法层),但禁止逐角色、逐场、名场面完全照搬(完全抄袭)。
IP 防火墙(借鉴不照搬)
- 恒定负向词见
assets/s2/negative-ip.json,覆盖 Peppa Pig、Disney、Marvel、Sanrio、Numberblocks、My Little Pony 等已注册的真实第三方版权形象——这些是硬边界,无论借鉴与否都不得复现(门禁会强制校验令牌覆盖)。 - 漫剧专项纪律(借鉴不照搬):热门漫剧 / 网文 IP 的「题材类型、情绪结构、爽点范式、镜头语言、节奏」属方法层,不可版权、可作创作养料,鼓励借鉴;但禁止完全抄袭——即不得逐角色照搬(同名同设定)、逐场复制名场面构图、直接复刻招牌画风 / 标志性配色组合、搬运原文台词。即使用户点名某爆款,也只提取其「可复用的方法骨架」而非「表达」,转成原创描述(「强宿命感的黑衣男主 + 红衣女主对峙」),再送图像 / 视频模型,并叠加 negative prompt 双保险守住真实第三方版权形象。
- 本 skill 不内嵌任何版权文本,只统计结构 / 写法层范式;所有范例均为公版或用户自有素材。
Resources
assets/s1/:故事结构模板、改编压缩方法论、可填节拍表、剧本格式规范、两个改编范例。assets/s2/:负向词库negative-ip.json+ IP 防火墙说明negative-ip-firewall.md+ 角色资产方法论character-design.md+ 场景资产方法论scene-multiview.md。assets/s3/:分镜模板库template-library.json、运镜库camera-movements.json、平台预设platform-presets.json、标签统计tag-stats.json、质量负向词negative-quality.md。assets/s4/:已拉取 CC0 音频清单audio-manifest.json。scripts/:fetch_visual_assets.py(S2 拉图)、fetch_audio.py(S4 拉音)、build_storyboard.py(S1+S2 → S3 分镜脚手架自动生成,支持ref_images锚定自动抽取 /power_dynamic自动选角 /--target-duration镜头预算 /--no-growth关闭自我生长建议)、resolve_ref_images.py(S5 把ref_images令牌解析为真实图路径,产出storyboard.resolved.json)、build_ffmpeg_concat.py(S5 由 storyboard.json 生成 FFmpeg 拼接列表 + 命令)、validate_pipeline.py(站间门禁,默认--content-rating normal零内容限制;--content-rating child/--child触发儿童向硬门禁)、collect.py(自我生长采集端:把一次运行产物 + 人类评分 + 失败日志回灌记忆服务器)、load_learnings.py(自我生长回灌端:从记忆服务器拉取learnings.json缓存到本地,供build_storyboard.py读取高频失败模式建议)。memory_server/:server.py(零依赖记忆服务,4 表 SQLite + Bearer 鉴权 + 限速)、growth.py(聚合 →snapshot/learnings.json+ 回灌 priors)、.env.example、README.md(Caddy HTTPS / systemd / cron 部署)。references/:architecture-licenses.md(开源方案借鉴与许可证边界)、workflow.md(四站详细契约与用法)、case-studies.md(爆款漫剧/短剧运镜·分镜语法借鉴,方法论文献,不照搬 IP)、benchmark.md(对比测评:NVP vs ViMax/seedance/ai-shortfilm/ArcReel 等评分矩阵 + 实证自测)、s5-composite.md(S5 合成 SOP:五步闭环 + 工具矩阵 + 一致性终检清单)。
注意事项
- 大体积图库/音频库不内嵌进 skill(保持可携带);运行时用脚本拉取,或指向你自己的 CC0 素材目录(如
./assets/characters、S4-音频库/samples/这类本地洁净批)。 - 本 skill 为编排方法论 + 自包含资产,不依赖 ViMax/ArcReel 等外部代码运行。
- 取得 BHL key / NYPL token 后,可自行在
fetch_visual_assets.py追加fetch_bhl()/fetch_nypl()通道(OBI 已验证无需 key)。
自我生长(可选 · 数据闭环)
让 skill 随使用自我生长:每次产线运行后把客观指标 / 人类评分 / 失败日志回灌进记忆库,经聚合后把「高频失败模式建议 / 评分 / 风格信号」回灌 skill,下次生成时提前规避。纯标准库、零依赖、可独立部署在一台小服务器上,与 skill 本体解耦。完整部署见 memory_server/README.md。
单机用?不用部署。 不设置
NVP_MEMORY_URL时,collect.py/load_learnings.py会自动直连 skill 内的 SQLite(memory_server/data/nvp_memory.db)并在采集后自动聚合,零配置即可跑完整闭环。只有「多机汇总 / 多人协作 / 远程回灌」才需要起server.py(见下方「服务启动」与 README §2)。
闭环三步:
- 采集(跑完产线后):
python scripts/collect.py --project <DIR> --platform bilibili自动从script.json/storyboard.json/storyboard.resolved.json读取 beats / shots / 解析率 / 时长等指标,写入记忆库(默认本地 SQLite;若设了NVP_MEMORY_URL则 POST 到服务)。可追加人类评分--feedback 5 overall "节奏很爽",或失败日志--failures fails.json。离线机用--mirror ./mirror.json --dry-run生成镜像,稍后collect.py --sync ./mirror.json同步上服务器。加--local可强制本地、--remote强制走服务。 - 聚合(本地自动 / 服务器定时):本地模式下采集后已自动聚合;HTTP 模式下用 cron 每小时跑
python memory_server/growth.py,把 SQLite 四表聚合成snapshot/learnings.json,并把稳定知识 upsert 进priors表。 - 回灌(下次生成前):
python scripts/load_learnings.py读取learnings.json缓存到.cache/learnings.json(默认读本地 snapshot;设了 URL 则远程拉取;--local强制本地、--no-fetch仅读缓存);build_storyboard.py自动读取并在生成时打印「自我生长建议」(高频失败模式 → 提前规避,例如未解析参考图、权力轴缺镜),也可--no-growth关闭。
服务启动:python memory_server/server.py --no-auth(本地测试)或 python memory_server/server.py(公网,需 NVP_API_TOKEN 环境变量 / --token;由 Caddy 反向代理做 TLS)。端点:GET /health、POST /ingest、GET /query、GET /snapshot、GET /export。