Community라이팅 & 에디팅github.com

novel-script

AI 短剧剧本编写:将 novel-outline 的分集梗概落成结构化场次与节拍流(动作节拍与台词行交替),台词逐句带说话人与语气,时长逐集按语速确定性折算。

novel-script란 무엇인가요?

novel-script 是一个专为 AI 短剧设计的剧本编写技能,其核心信条是「剧本管戏,分镜管拍」。它接收来自 `novel-outline` 的分集梗概,将其转化为结构化的场次与节拍流(交替出现的动作节拍与台词行),确保每句台词都是包含说话人、台词文本和语气的独立条目,完全杜绝散文式混写。该技能通过 10 道确定性质量门进行严格校验,包括每集时长控制在目标 ±15%、单句台词不超过 35 字、说话人合法性验证、每集必须包含具象钩子(`hookBeat` 认领,且位于全集前 3 拍内)与结尾悬念等。脚本 `novel-script.mjs` 零依赖,可直接使用 `node` 运行;输出包括 `script.json`、Markdown 剧本和一份单页 HTML 评审报告,内含时长仪表盘、分集剧本、场次总表以及按角色聚合并可一键导出 JSON 的台词本。该技能不处理镜头、分镜或画面生成提示词——这些属于下一层分镜技能的职责。

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/eternityspring/shuohao-skills/tree/HEAD/skills/novel-script

Installed? Explore more 라이팅 & 에디팅 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

novel-script은(는) 무엇을 하나요?

AI 短剧剧本编写技能。核心理念:剧本管戏,分镜管拍——「爽不爽」和「怎么拍」是两种迭代节奏,台词需要反复推翻重写,而如果绑上镜头分解,每改一句台词都得重排镜头。因此,这一层级只包含集、场次和节拍流,没有镜号;镜头、首帧提示词和生成批次都属于下一层分镜技能的范畴。

但有一条底线:台词必须是结构化数据,不能写成散文。每句台词都是一个独立条目(包含说话人 + 台词 + 语气),动作是独立节拍——这是所有确定性检查的基础:

交付物解决的问题
逐集时长预算确保一集三分钟就是三分钟:台词按语速折算时间、动作按节拍估算时长,写超写欠当场拦截,不会在生成环节才发现问题
节拍流(动作 ⇄ 台词)台词可直接对接 TTS 逐句生成;动作节拍就是画面要呈现的内容。混写成散文会导致两者都无法进入管线
每场至少一个动作节拍纯对白的场次就是广播剧——AI 生成时没有画面可写
开场钩子 + 结尾悬念短剧的生死线,每集都必须落在纸面;钩子不是标签,而是第一拍——hookBeat 认领其具象位置,必须位于全集前 3 拍内(冷开场)
爽点认领如果大纲标明这一集有大爆点,剧本中必须有相应的戏份来认领它——防止在反复修改中把爆点改丢
上游对账场景/光照/道具对 art.json、角色对 outline.json,如果写了美术没有登记的光照状态,当场报错

{baseDir} = 本文件所在目录。脚本位于 {baseDir}/scripts/novel-script.mjs,零依赖,直接用 node 运行。

边界(不做的事):不分镜头、无镜号、不写画面生成提示词、不出图、不配乐——分镜层的活一件不碰。不改大纲结构(砍线合人是 novel-outline 的活);不做角色和场景设定(这是 novel-characters / novel-art 的活)。


Step 0 — 定输入与范围

outline.json 是剧本的直接上游(包含分集梗概、爽点落点、单集时长等信息),标准流程从它开始。如果没有,先问用户是否要运行 novel-outline;如果用户坚持直接写,则询问集数与单集分钟数,手动创建骨架,对账门会明确跳过。

一次写几集:默认一批 ≤ 3 集。剧本是全管线修改最频繁的一层,因此适合小批量产出、快速决策、再继续往下写。即使用户要求全剧,也要分批产出,每批通过一次校验。

可选附带(提供这些才会执行对账/显示名称):

  • --outline:角色引用对账 + 爽点认领检查 + 报告中 C01 显示为人名
  • --art:场景/光照状态/道具对账 + 报告中 S01 显示为场景名

Step 1 — seed 骨架

node {baseDir}/scripts/novel-script.mjs seed <outline.json> --eps 1-3 > <workdir>/script.json

确定性搬运:目标秒数(单集分钟 × 60)、钩子、悬念、该集爽点认领、候选场景与人物(进入 seedNote)。这些事实不要让模型重新想一遍。 scenes 字段留空,那才是写戏的活。

Step 2 — 逐集写戏

每集一份任务,能并发就并发。每份任务拿到:

  • {baseDir}/references/script-pass.md 和 {baseDir}/references/schema.md(阅读并遵循)
  • 该集的 seed 骨架 + 大纲中该集的梗概/爽点/人群方案
  • 该集用到的场景卡(art.json 中的锚点、光照状态)与角色信息(性情、说话方式——有 cast.json 更好)
  • 前一集的结尾悬念(这一集的开场要接得上)

核心要求都在 script-pass.md 里,最重要的四条:动作节拍只写常见动作(如挑担上船、搭手卸担这类 AI 见过千万次的;像伸篙一挡、睫毛轻颤这种精巧动作生成时必然会崩);时长预算优先于一切(三分钟一集约 50 个节拍,写完后自己跑一遍 validate 查看秒数);台词口语化、单句一口气、谁的话像谁(有 cast.json 就调用角色的性情与说话方式);每集第 1 拍为钩子的冷开场具象化(hookBeat 认领,门会检查位置),结尾一拍必须是悬念。

写完后删除 seedNote。

Step 3 — 校验 ⛔ 不能跳

node {baseDir}/scripts/novel-script.mjs validate <script.json> \
  --outline <outline.json> --art <art.json>

10 道质量门全部由代码执行:每集时长在目标 ±15% 内(台词按 4.5 字/秒折算、动作按 2.5 秒/拍,params 可调)、单句台词 ≤ 35 字、说话人在本场人物里或标注 VO、每集钩子和悬念都有记录、钩子的具象化在全集前 3 拍内兑现(hookBeat 认领,params.hookWindow 可调)、每场至少一个动作节拍、动作叙述不混用引号台词、爽点认领、角色对账、场景/光照/道具对账。

如有违规,逐条修改,改完重新运行,直到全部通过。 写超了先砍动作节拍再压台词;写欠了补戏不注水——增加冲突而非寒暄。当需要一个美术未登记的光照状态时,请去 art.json 中补录该状态再回来,不要跳过质量门。

Step 4 — 输出与汇报

cd <输出目录>
node {baseDir}/scripts/novel-script.mjs render <剧名>-script.json --md \
  --outline <outline.json> --art <art.json> > <剧名>-script.md
node {baseDir}/scripts/novel-script.mjs render <剧名>-script.json --html \
  --outline <outline.json> --art <art.json> --cast <cast.json> > script-report.html
# 英文界面:加 --lang en(默认中文,也可跟随 script.json 顶层的 lang 字段)

报告包含:KPI(含台词占比)、时长仪表盘(每集条形图打在目标区间带上,超出欠标红)、分集剧本(一排两集,场次信息超过 300px 时渐隐截断、点开展开)、场次总表、台词本(一排两个,按角色聚合、列表六行高可滚动、整组复制;提供了 --cast 时,每个角色组头带上音色提示词按钮——台词和音色一页配齐直接运行 TTS)、质量门面板、导出 JSON(下载的就是 script.json 的原样)。

汇报一句话说清:几集几场几句台词、预估总时长 vs 目标、哪几集贴着容差边、报告路径;未通过的质量门要明确说明。

最终落地:

<输出目录>/
├── <剧名>-script.json
├── <剧名>-script.md
└── script-report.html             ← 双击即可打开

四个 skill 的接力

novel-outline    → outline.json (什么:结构与分集)
novel-characters → cast.json    (谁:角色资产)
novel-art        → art.json     (哪里 + 手里拿的:美术资产)
novel-script     → script.json  (戏:场次、节拍、台词)

seed 接收 outline.json;validate/render 的 --outline --art 负责对账和显示名字。四份 JSON 各自的报告都带有导出按钮,修改后都可以重新喂回各自的 render/validate。下一层是分镜:镜号、单镜头时长、首帧提示词、生成批次单都在那边。

边界

  • 报告界面内置中英文(--lang,默认中文,或跟随 script.json 的 lang 字段);台词语言跟随剧集
  • 时长是估算而非秒表计时——±15% 的容差就是为此预留的;params.charsPerSecond 可按配音语速调整
  • VO 是画外音的统一记号,具体是谁的心声写在 delivery 字段里;台词本中 VO 单独成组
  • 不设每集场次上限——AI 换景不花钱,换景次数只计入 KPI 统计,不设质量门

自测

node {baseDir}/scripts/selftest.mjs

154 项断言,不调模型、不花额度。10 道质量门每一道都有击穿用例。修改脚本后先运行此自测。

自带样例

{baseDir}/examples/渡口-script.json:《渡口》全 6 集完整剧本(9 场 123 句台词,每集冷开场兑现钩子、都落在 120 秒 ±15% 内),对照 novel-outline 与 novel-art 的样例全部质量门通过。作为质量基准,也是自测夹具。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬