爆款短视频分镜脚本生成器
单文件、零依赖、生成后可在线二次编辑。支持 DeepSeek / 通义 / Kimi / 智谱 / 豆包 等国产模型直连。
⛔ 硬规则一:引用技能后,第一句话必须先问 A/B
这是最高优先级约束。只要用户引用本技能,你的第一条回复就必须是下面的二选一提问,不得先做任何其他事。
禁止的行为(违反即判定任务失败):
- ❌ 不问直接用内置规则生成
- ❌ 不问直接给工作台链接
- ❌ 把 A/B 选择藏在一段长回复的末尾
- ❌ 替用户默认选 A 或 B
必须原样发出这段话:
> 你想怎么生成分镜脚本?
>
> A. 自主填写调用 API(推荐) —— 我直接把工作台链接发给你,你在页面里填自己的 API Key,调用 AI 模型生成。内容更贴合你的主题、更不像模板,生成后可在线编辑、下载。
> (需要你自备模型 Key,例如 DeepSeek / 通义千问 / Kimi)
>
> B. 内置规则直接生成(默认) —— 不用 Key、不用联网,我一步步问你 6 个问题,直接生成完整分镜脚本交付给你。
发出后必须停下来等用户回复 A 或 B,再进入对应分支。
⛔ 硬规则二:Markdown 必须完整输出 6 大模块
生成 Markdown 时,以下 6 个模块一个都不能少、顺序不能变,且每个模块的内容必须完整写完:
| 序号 | 模块名 | 必须包含的要点 |
|---|---|---|
| 1 | 爆款结构拆解 | 钩子(前3秒) / 升级 / 转折 / 高潮 / 结尾,各注明对应镜号与时间区间 |
| 2 | 口播文案 | 按镜号逐条给出完整口播,共 N 条(N = 镜头数量) |
| 3 | 分镜表 | 表格,必须有 N 个数据行(N = 镜头数量),8 列:镜号/画面/景别/运镜/台词旁白/时长/配乐音效/分析(「分析」列写这一镜为什么这么拍,直接搬进 STATE 的 shots[].an,不能省) |
| 4 | 剧作分析 | 结构、情绪曲线、节奏设计,三项都要写 |
| 5 | 拍摄大纲 | 设备建议、场景清单、拍摄顺序、注意事项,四项都要写 |
| 6 | 发布与数据钩子 | 3 个标题备选、封面建议、话题标签、互动钩子、发布时间建议,五项都要写 |
六个模块的标题必须逐字使用下面这套带序号格式(顺序即如下,不得改名、不得合并):
## 1. 爆款结构拆解
## 2. 口播文案
## 3. 分镜表
## 4. 剧作分析
## 5. 拍摄大纲
## 6. 发布与数据钩子
四条量化硬指标(设用户选择的镜头数为 N、时长为 T 秒):
- 分镜表数据行数 = N(不含表头与分隔行,一行不多一行不少)
- 口播文案条数 = N(镜号 1 到 N,逐条对齐)
- 各镜时长之和 = T(误差必须为 0。N=12、T=60 这类不能整除的组合同样适用)
- 6 个模块标题齐全且顺序如上
生成顺序(决定第 3 条能否达标,必须遵守):
> 先分配时长,再填画面。 禁止先写完 N 个画面再回头补时长。
>
> 1. 先按重要度为 N 个镜头分配时长:单镜控制在 2~8s,钩子段短(2-4s)、高潮段长(5-8s),按重要度不规则加权,不要平均分配;
>
> 「不规则」的量化判据(两条必须同时满足):最长镜与最短镜的极差 ≥ 3s,且 N 个时长中不同取值的个数 ≥ 4。例如 3,5,6,5,7,8,7,4 合格(极差 5、取值 6 种);5,5,5,5,5,5,5,5 与 4,4,4,4,7,7,7,8 均不合格。
> 2. 立即验算求和,不等于 T 就调整到相等为止;
> 3. 时长定稿后,再逐镜填写画面、景别、运镜、台词、配乐。
T ÷ N 能整除时更要警惕——不要图省事每镜都写同样的秒数(如 12 镜 × 5s),那会破坏节奏设计,必须按重要度做出长短差异。
⚠️ 开工前先做可行性校验(否则一定写不出合格的分镜表):
单镜时长 2~8s,且必须同时满足「极差 ≥ 3s」「不同取值 ≥ 4 个」,三者叠加后 (N, T) 的真实可行域是:
N ≥ 4 且 2N + 6 ≤ T ≤ 8N − 6
(推导:凑 4 个不同取值且极差 ≥3 的最小组合是 2,3,4,5,和为 14,剩下 N−4 镜各取最小值 2,故下界 14 + 2(N−4) = 2N+6;上界同理取 8,7,6,5 和为 26,其余取 8,得 26 + 8(N−4) = 8N−6。N=3 时无解——3 个数凑不出 4 种不同取值,必须至少 4 镜。)
不满足就先和用户确认调整,不要硬写。 下拉选项共 12 种组合,只有 5 种可行,越界的 7 种按下表给建议(所有建议值均已验算落在可行域内):
| 用户选的组合 | 越界原因 | 给用户的建议(均可行) |
|---|---|---|
| 5 镜 × 15s | 下界 16s | 5 镜 × 20s 或 4 镜 × 15s |
| 5 镜 × 60s | 上界 34s | 10 镜 × 60s |
| 5 镜 × 90s | 上界 34s | 15 镜 × 90s |
| 10 镜 × 15s | 下界 26s | 4 镜 × 15s 或 5 镜 × 20s |
| 10 镜 × 90s | 上界 74s | 15 镜 × 90s |
| 15 镜 × 15s | 下界 36s | 4 镜 × 15s |
| 15 镜 × 30s | 下界 36s | 8 镜 × 30s 或 10 镜 × 30s |
可行的 5 种(直接开工,不用问):5 镜 × 30s、10 镜 × 30s、10 镜 × 60s、15 镜 × 60s、15 镜 × 90s。
若用户坚持保留越界组合,按降级规则处理,并在下方自检块的「降级说明」一行注明放宽了哪一条:
1. 先放宽「不同取值 ≥ 4」→ 改为 ≥ 3;
2. 仍然无解则放宽「极差 ≥ 3s」→ 改为 ≥ 2s;
3. 「各镜时长之和 = T」永远不能放宽,这是硬底线。
> ❗ 与 B-1 智能跳过的优先级:用户一次性给齐 6 项时,B-1 允许跳过提问,但可行性校验优先级更高。若组合越界,必须先就「镜头数 / 时长」确认调整,再进入 B-2。其余 4 项(主题、风格、平台、基调)不受影响,无需回问。
完整性红线(严禁触犯):
- ❌ 禁止出现 ...、…、(略)、(此处省略)、以此类推、其余同理 等任何省略标记
- ❌ 禁止分镜表只写两三行就收尾
- ❌ 禁止口播文案只写几条就收尾
- ❌ 禁止任何模块只写一句话敷衍(每个模块至少写满上表要求的全部要点)
生成前必须先读 references/example-output.md,按其详尽程度输出,不得比样板更简略。
输出前强制自检(必须把结果写在交付内容末尾,不得只在心里打勾)
交付 Markdown 后,必须附上这样一段自检结果,逐项给出实际数字或证据:
【自检】
模块标题:6/6,顺序正确
分镜表数据行:N 行(实际填入数字)
口播文案:N 条(实际填入数字)
时长求和:3+5+6+5+7+8+7+4 = 45 s(目标 45 s)
时长分布:最长 8s / 最短 3s / 极差 5s(≥3s 且不同取值 ≥4 个)
占位符与截断:0 处
降级说明:无(若放宽过,写明放宽了哪一条及原因)
三件套:Markdown(已输出正文)/ 工作台链接(https://80818f11f78942799aea07725fb30ea9.app.workbuddy.link/#import=<编码串>)/ 本地 HTML(已复制到 ./storyboard-generator.html)
STATE:shots 5 条均含 an/role/emo,与 md 逐字一致
> ⚠️ 自检块里不要复述被禁符号本身。 上面的模板用 <编码串> 占位就是这个原因——写成 #import=... 的话,那三个点会被自动化检查判成截断标记,属于自己坑自己。同理「占位符与截断」这一行也不要把 ...、…、(略) 抄进来。
判定规则:
- 时长求和必须写出完整加法算式与总和,不允许只写「已核对」。算式不对就重新分配时长并重写分镜表。
- 任一项不达标则重写后重新自检,不得带着不合格项交付。
不要靠眼睛自检,用脚本跑。 21 项检查已固化为 assets/verify.mjs,STATE 与 Markdown 写完后必须执行:
node <技能目录>/assets/verify.mjs <工作目录> <STATE.json> <脚本.md>
# 例:node ~/.workbuddy/skills/storyboard-generator/assets/verify.mjs . 猫狗大战_STATE.json 猫狗大战_分镜脚本.md
脚本一次完成:STATE 结构校验 → md 六模块 / 行数 / 列数 / 时长求和校验 → md 与 STATE 逐字一致性比对(防三件套内容分叉)→ 生成 #import= 链接 → base64 往返解码验证 → 复制本地 HTML。退出码 0 才允许交付,非 0 表示仍有不合格项。自检块里的数字直接抄脚本输出,不要凭记忆填。
> 两个已踩过的坑:① 解析 md 分镜表时必须限定在「## 3. 分镜表」区块内,否则「## 2. 口播文案」的 2 列表格会被一起匹配进来,出现「30 行 / 列数 2,8」的假失败;② 做往返解码校验时 Buffer.from(b64, 'base64') 的第二个参数不能漏,漏了会把 base64 串当原文直接 JSON.parse 而报错。
分支 A:用户选「A. 自主填写调用 API(推荐)」
用户一选 A,立即把链接发给他,不要等待、不要先问参数。
- 发送公网工作台链接:
https://80818f11f78942799aea07725fb30ea9.app.workbuddy.link/ - 说明操作步骤:
- 打开链接 → 点左侧「⚙ 接入真实 AI 模型(可选)」展开
- 填入你自己的 API Key → 选模型(想快出选deepseek-chat,要深度思考选deepseek-reasoner)
- 左侧填主题、风格、平台、时长、基调、镜头数 → 点「生成」 - 说明下载与编辑:
- 生成后在「导出」页可下载 Markdown / 剪映文案 / JSON
- 页面内所有内容可直接点击编辑,改完再导出
- 文档同样包含上述 6 大模块,可参照检查是否齐全
> 🔒 隐私:Key 只存在你浏览器的 localStorage,浏览器用 HTTPS 直连模型厂商。这个公网页只托管静态页面——不代理、不记录、不中转你的 Key 与生成内容(它的 /state、/relay、/job 三个端点已关闭)。
>
> 备用:本机运行 serve.mjs 后可用 http://127.0.0.1:8123/storyboard-generator.html。它默认只绑回环地址、每次启动随机生成中枢令牌、转发目标限模型厂商白名单,同步进 state.json 前还会剥离 API Key——详见「安全与隐私」。
分支 B:用户选「B. 内置规则直接生成(默认)」
零配置,由你直接生成。默认一次只问一项;但用户话里已给出的参数一律跳过,不再追问(见 B-1 智能跳过,该规则优先级更高)。
B-1 逐步引导 6 项参数
每次提问只问一项,格式统一为:选项列表 + 示例 + 默认值 + 可自定义。用户回复后再问下一项。
> ⚠️ 优先级声明:「智能跳过」优先于「一次只问一项」。 当用户已在话里给出某些参数时,绝不允许重复追问已给出的项。
智能跳过规则(不要让用户重复输入):
- 用户在进入 B 之前的话里已经明确给出的参数 → 直接复述确认,不再提问该项。
- 全部 6 项都已给出 → 一次性复述确认全部参数,然后直接进入 B-2 生成,不要走提问流程。
- 部分给出 → 只问缺失的那几项,可以一次问完缺失项(因为它们都是缺失项,不违反逐项原则)。
- 示例:用户说「帮我写一个猫狗大战的短视频分镜脚本」→ ① 主题文案直接确认为「猫狗大战」,从 ② 风格开始问。
- 示例:用户说「B,主题自律早晨,60秒,12个镜头,小红书,治愈,温暖」→ 6 项齐全,一次性确认后直接生成。
| 步骤 | 参数 | 给用户的选项 | 示例 | 默认值 |
|---|---|---|---|---|
| ① | 主题文案 | 一句话主题,或粘贴已有文案 | 「猫狗大战」「城市青年的孤独」「自律早晨」 | 无,必须由用户提供 |
| ② | 风格 | 搞笑 / 治愈 / 燃 / 悬疑 / 知识口播 / 情感共鸣 / 反转剧情 | 「搞笑」「治愈」 | 治愈 |
| ③ | 发布平台 | 抖音 / 快手 / 小红书 / B站 / 视频号 / 其他(自定义) | 「抖音」 | 抖音 |
| ④ | 时长 | 15s / 30s / 60s / 90s / 自定义秒数 | 「30s」 | 30s |
| ⑤ | 默认基调 | 轻松 / 温暖 / 紧张 / 励志 / 无厘头 / 自定义 | 「轻松」 | 轻松 |
| ⑥ | 镜头数量 | 5 / 10 / 15 / 自定义数量 | 「10」 | 10 |
引导话术示例:
- ①「主题文案写什么?比如『猫狗大战』『自律早晨』,也可以直接把你想表达的意思告诉我。」
- ②「想要什么风格?可选:搞笑、治愈、燃、悬疑、知识口播、情感共鸣、反转剧情,也可以自定义。」
- ③「发在哪个平台?可选:抖音、快手、小红书、B站、视频号,或其他(你自己填)。」
- ④「视频时长?可选:15s、30s、60s、90s,或自定义秒数。」
- ⑤「整体基调?可选:轻松、温暖、紧张、励志、无厘头,或自定义。」
- ⑥「需要几个镜头?可选:5、10、15,或自定义数量。」
若某项用户未明确选择,采用上表默认值并在交付时注明。
B-2 生成并交付三件套
6 项参数确认后生成完整分镜,三件必须全部交付:
三件的内容必须完全一致,都来自同一份 STATE(见 B-3):
- Markdown 分镜文档 —— 含 6 大模块,严格遵守硬规则二
- 可编辑公网工作台链接 —— 优先给
#import=直达链接(必须是#不是?,理由见 B-3),用户打开即看到本次内容;同时给出裸链接https://80818f11f78942799aea07725fb30ea9.app.workbuddy.link/备用(裸链接需手动导入 STATE) - 本地 HTML 文件 —— 必须注入 STATE,不能只做文件复制(见下方 ⚠️)
> ⚠️ 本地 HTML 不要直接 cp。 原样复制的 HTML 副本不带任何 import 参数,打开后会回落到内置演示数据(主题显示「城市青年的孤独与自我和解」),用户会直接反馈「内容没有导入工作台」——这是本项目实际发生过的事故,且排查时很容易误判成链接或字段名问题。
>
> 正确做法:把 STATE 以 window.__WB_PRESET__ 的形式写进 HTML,getImportState() 已内置该分支且优先级最高,双击打开 / 静态服务器预览都能直接看到本次脚本,零操作。注入与回读校验已固化在 assets/verify.mjs 里,跑一次即生成可直接交付的 HTML。
>
> 注入片段(插在 <body> 之后即可,必须在主脚本执行前定义):
> html
> <script>window.__WB_PRESET__ = { ...STATE... };<\/script>
>
B-3 把 Markdown 内容完整同步进工作台
> ⚠️ 这是最容易出错的一步,务必严格遵守。
>
> 工作台的行为是:STATE 里传了哪个字段,就显示哪个字段;没传的字段,它才用自己的模板引擎重新生成。
> 所以如果你只传 meta + shots,工作台会自己现场编一套剧作分析、拍摄大纲、发布钩子——和你写的 Markdown 完全对不上,用户打开就会发现内容不一致。
>
> 唯一正确做法:把 Markdown 里 6 大模块的内容全部写进 STATE 对应字段。
六模块 → STATE 字段映射表
| Markdown 模块 | STATE 字段 | 结构要求 |
|---|---|---|
| 1. 爆款结构拆解 | struct |
{ "rows": [ {seg, time, emo, task} × 5 ] },五段对应钩子/升级/转折/高潮/结尾 |
| 2. 口播文案 | voice |
{ hook, echo, turn, heal, end },五段各一个字符串,格式 【段名】文案 |
| 3. 分镜表 | shots |
[ {no, visual, size, move, line, duration, music, **an**, **role**, **emo**} × N ],必须 N 条全量搬运 |
| 3b. 分镜表「分析」列 | analysis |
[ {no, text} × N ]。推荐直接写进 shots[i].an,更省事且不会错位 |
| 4. 剧作分析 | drama |
{ structure, hook, turn, rhythm, platform, summary }(structure 可用 <b>、<br> 标签) |
| 5. 拍摄大纲 | shoot |
{ device, points, subtitle, edit } |
| 6. 发布与数据钩子 | publish |
{ cover, titles, comment, next }(titles 多个标题用 \n 分隔) |
| — 情绪曲线 | beats |
[ {role, emo, size, move, dur, music} × N ]。推荐直接写进 shots[i].role / shots[i].emo,更省事且不会错位 |
| — | meta |
{ theme, style, platform, dur, tone, n } |
> ⚠️ analysis 和 beats 最容易被漏掉。 这两个字段不传,工作台会用自己的模板引擎现场编造:镜头分析会套用「治愈系」文案(出现「放大细节符号(手机/手/食物)」这类与主题无关的话),情绪曲线会被压成一条直线(每镜都是 emo:5)。用户一打开就会发现内容和 md 对不上,这是本项目最高频的事故。
填写要点:
- 内容必须与 Markdown 逐字一致,是从 md 搬运,不是重新生成、不是重新概括。
- voice 五段(段名固定为 hook/echo/turn/heal/end,对应钩子/升级/转折/高潮/结尾):md 里 N 条口播先按顺序切成 5 组再拼接。N 不被 5 整除时,前 N mod 5 组各多分 1 条(如 N=12 → 3/3/2/2/2;N=8 → 2/2/2/1/1)。组内多条用空格连接。
- voice 的前缀写法:md 里口播用「【镜1】」编号,voice 里改用「【钩子】【升级】【转折】【高潮】【结尾】」。这是唯一允许改前缀的地方,正文内容逐字不变。
- shots[i].an(镜头分析):把 md 分镜表「分析」列逐格搬进来。不填的话工作台会套用治愈系模板文案,与主题无关。
- shots[i].role:按五段结构标注,取值只能是 hook(钩子)/ echo(升级)/ turn(转折)/ heal(高潮)/ end(结尾)。N 大于 5 时,多出来的镜头沿用所属段落的 role。
- shots[i].emo:情绪强度 1~10 的整数,取自 md 结构拆解里该段的情绪(好奇 7 / 紧张 5 / 意外 6 / 屏息 8 / 释然 6 之类)。不填会全部变成 5,情绪曲线被压成直线。
- drama.structure 对应 md「剧作分析-结构」;drama.rhythm 对应「节奏设计」,把时长加法算式写进去;drama.platform 写平台适配建议。
- publish.titles 放 md 里的 3 个标题,用 \n 换行;publish.cover 放封面建议;publish.comment 放互动钩子;publish.next 放后续内容建议。
完整 STATE 示例
(示例为 5 镜 × 30s,时长 4+5+8+7+6 = 30 精确达标;极差 4s、不同取值 5 种,均满足硬规则二)
{
"meta": { "theme": "猫狗大战", "style": "搞笑", "platform": "抖音", "dur": "30", "tone": "轻松", "n": 5 },
"shots": [
{ "no": 1, "visual": "橘猫从沙发后探头,眼神挑衅", "size": "特写", "move": "缓慢推", "line": "这片沙发,从今天起,归我。", "duration": 4, "music": "轻快吉他起", "role": "hook", "emo": 7, "an": "特写放大猫的挑衅眼神,拟人化台词在 3 秒内建立领地冲突。" },
{ "no": 2, "visual": "狗子歪头,一脸困惑", "size": "中景", "move": "固定", "line": "你确定?", "duration": 5, "music": "钢琴单音", "role": "echo", "emo": 5, "an": "中景交代双方体型差,制造「以小博大」的悬念。" },
{ "no": 3, "visual": "猫狗对峙慢动作", "size": "全景", "move": "慢动作", "line": "战争,开始了。", "duration": 8, "music": "鼓点推进", "role": "turn", "emo": 6, "an": "全景 + 慢动作把对峙拉长到 8s,全片最长镜,节奏在此变速。" },
{ "no": 4, "visual": "猫跳上猫爬架顶端俯视", "size": "中景", "move": "升降", "line": "现在,谁在上面?", "duration": 7, "music": "弦乐渐强", "role": "heal", "emo": 8, "an": "升降镜头完成力量反转,猫占据制高点,笑点落地。" },
{ "no": 5, "visual": "狗子趴下叹气,尾巴摇了摇", "size": "近景", "move": "固定", "line": "所以,你家是谁说了算?", "duration": 6, "music": "音乐留白", "role": "end", "emo": 6, "an": "近景收在狗子的妥协表情上,台词直接抛互动问题引导评论。" }
],
"struct": { "rows": [
{ "seg": "钩子", "time": "0-4s", "emo": "好奇", "task": "橘猫挑衅,4 秒内建立领地冲突" },
{ "seg": "升级", "time": "4-9s", "emo": "紧张", "task": "狗子困惑并反击,冲突加码" },
{ "seg": "转折", "time": "9-17s", "emo": "意外", "task": "慢动作对峙,节奏骤然放缓" },
{ "seg": "高潮", "time": "17-24s","emo": "屏息", "task": "猫抢占制高点,力量对比反转" },
{ "seg": "结尾", "time": "24-30s","emo": "释然", "task": "狗子放弃,留互动钩子" }
]},
"voice": {
"hook": "【钩子】这片沙发,从今天起,归我。",
"echo": "【升级】你确定?",
"turn": "【转折】战争,开始了。",
"heal": "【高潮】现在,谁在上面?",
"end": "【结尾】所以,你家是谁说了算?"
},
"drama": {
"structure": "<b>五段式结构</b><br>① 钩子(镜1):猫霸占沙发建立冲突<br>② 升级(镜2):狗子反击<br>③ 转折(镜3):慢动作对峙<br>④ 高潮(镜4):猫占高处反转<br>⑤ 结尾(镜5):反差收尾",
"hook": "橘猫挑衅 —— 用拟人化台词在 4 秒内建立「领地争端」。",
"turn": "镜3-4:猫抢占制高点,力量对比瞬间反转,笑点产生。",
"rhythm": "总时长 4+5+8+7+6=30s;前段快切 4-5s,高潮段拉长到 8s 形成变速对比。",
"platform": "抖音:前 3 秒强钩子、节奏快、结尾引导评论,竖屏 9:16。",
"summary": "风格:搞笑|基调:轻松|平台:抖音|镜头:5 个"
},
"shoot": {
"device": "手机主摄(60fps 便于慢放)+ 三脚架 + 靠窗自然光 + 领夹麦。",
"points": "1. 先拍猫的静态镜头(配合窗口期短)2. 再拍狗子动态镜头 3. 最后拍对峙镜头,每个镜头拍 5-8 条备用。",
"subtitle": "关键句做大字标题卡;统一字体与主色;前 3 秒无废话、无转场特效。",
"edit": "总时长 30s;BGM 随情绪走;快剪段节奏明快、高潮段放慢留白。"
},
"publish": {
"cover": "猫狗对峙的双分屏特写,中央压黄底黑字大字「谁说了算?」",
"titles": "1. 猫:这沙发我要了。狗:你再说一遍?\n2. 家里谁才是老大?这场对峙给了答案\n3. 猫狗大战 30 秒,结局我没想到",
"comment": "结尾旁白留悬念「你家是谁说了算?」,评论区置顶发起投票「猫派 / 狗派」",
"next": "评论区高频问题做成「猫狗大战 · 第二回合」系列"
}
}
交付自检(B-3 环节)
构造完 STATE 后逐项确认:
- [ ] struct.rows 有 5 段,内容来自 md 模块 1
- [ ] voice 五个字段都填了,来自 md 模块 2
- [ ] shots 有 N 条,逐条搬运自分镜表
- [ ] shots 每一条都带了 an、role、emo(最容易漏,漏了工作台就自己编)
- [ ] drama 六个字段都填了,来自 md 模块 4
- [ ] shoot 四个字段都填了,来自 md 模块 5
- [ ] publish 四个字段都填了,来自 md 模块 6
- [ ] shots 的 duration 求和 = meta.dur(和第三项自检的算式一致)
- [ ] JSON 可被解析(引号转义、无尾逗号)
自检通过后,把同一份 STATE 同时用于三件套,不要为链接或本地 HTML 另写一份——内容分叉是最常见的事故。
-
推荐导入方式:把完整 STATE JSON 交给用户,引导他:打开工作台 →「导出」页 →「导入脚本(JSON)」→ 粘贴 → 确定。这种方式无长度限制,最可靠。
-
备选(直达链接):把 JSON 转 UTF-8 base64,用
encodeURIComponent包裹后拼接:
https://80818f11f78942799aea07725fb30ea9.app.workbuddy.link/#import=<encodeURIComponent(base64)>
两条硬性要求,缺一不可:
- 必须用#而不是?。实测该网关对 URL 长度的限制约 5.2KB,而完整 6 大模块的 STATE(含中文)base64 后通常 12KB 以上,用?会被网关拦截返回 414 / 502,用户打开是空白或报错。#后面的内容不会发送给服务器,不受此限制。
- 必须用encodeURIComponent包裹,否则 base64 中的+会被当成空格导致解析失败(中文内容极易产生+,实测一份 8 镜脚本就含 244 个)。
> ⚠️ 只给 Markdown 不给链接/HTML,用户无法二次编辑,视为交付不完整。
安全与隐私
按实际运行模式分开说,别笼统回答「不经过任何服务器」——用了本地工作台就不是直连。
| 运行模式 | Key 存在哪 | 请求怎么走 | 会不会落盘 |
|---|---|---|---|
| 公网页(A 路径默认) | 用户浏览器 localStorage | 浏览器 HTTPS 直连厂商 | 不会。站点只托管静态页面,/state、/relay、/job 三个端点已关闭 |
本地工作台 serve.mjs |
用户浏览器 localStorage | 经用户自己电脑上的服务转发 | 分镜内容会写入同目录 state.json(权限 600),但 API Key 在服务端写入前被剥离 |
| 下载的本地 HTML 双击打开 | 用户浏览器 localStorage | 浏览器直连厂商 | 不会(无服务端) |
本地工作台的四道锁(serve.mjs v3.0 起):
1. 默认只绑 127.0.0.1 —— 局域网和公网都连不上;要公网部署必须显式 HOST=0.0.0.0,而一旦这样,/state、/relay、/job 会全部关闭。
2. 中枢令牌 —— 每次启动随机生成,页面从 /ping 取,/state、/relay、/job 必须带 X-Hub-Token。恶意网页读不到 /ping 的响应(来源白名单之外不给 CORS 头),因此拿不到令牌。
3. 转发目标白名单 —— 只放行模型厂商域名,拒绝内网地址、明文 http、以及 api.deepseek.com.evil.com 这类后缀欺骗。需要临时加厂商用 SB_EXTRA_HOSTS 显式追加。
4. 敏感字段剥离 —— /state 写入前递归剔除 apiKey / authorization / token / password 等;启动时还会清洗一次历史 state.json。
| 项目 | 说明 |
|---|---|
| B 路径联网 | 不需要,内置规则完全离线生成 |
| 内容上传 | 不会。Markdown / JSON / HTML 只留在用户浏览器或本地文件 |
| 同步范围 | 本地工作台只同步分镜业务数据;页面检测到表单里有 API 配置时,会先弹确认让用户点选,不默认同步 |
A 路径需用户自行向模型厂商申请 Key,Key 管理责任在用户;担心泄露可优先用 B 路径或本地 HTML 离线使用。
能力边界
| 场景 | 支持度 | 处理方式 |
|---|---|---|
| 15s~90s 短视频 | ✅ 最佳 | 直接用 B 路径 |
| 1~3 分钟中长视频 | ⚠️ 可用但密度高 | 建议 A 路径;若坚持用 B,提示拆成系列 |
| 5 分钟以上 / 电影剧本 | ❌ 不适合 | 明确告知,建议改用专业剧本工具 |
| 抖音/快手/小红书/B站/视频号 | ✅ 已适配 | 直接选 |
| YouTube / Instagram / 微博等 | ✅ 支持 | 平台选「其他」自定义,发布建议按该平台调整 |
| 已有脚本润色 | ✅ 支持 | 把原文当「主题文案」或补充信息送入,按爆款结构重拆 |
| 只有模糊想法 | ✅ 支持 | 主动引导确认 6 项参数后再生成 |
| 直接产出成片视频 | ❌ 不支持 | 只出分镜脚本与文案 |
| 代用户发布到平台 | ❌ 不支持 | 只给内容,发布由用户自行操作 |
异常处理(小白版排错)
> 📌 末尾「异常处理(小白版排错 · 翻到末尾的完整版)」与「反模式与 FAQ」两章有完整版,遇到问题请优先翻到文档底部查。 中段这份是 agent 内部用,末尾那份是按用户视角重排的精简版,两份内容有部分重合,结构不同,按需使用。
| 现象 | 原因 | 解决方法 |
|---|---|---|
| 页面空白 / 打不开 | 网络问题或链接失效 | 刷新重试;仍不行改用本地 HTML 文件双击打开 |
| AI 生成一直转圈 | 模型响应慢或 Key 余额不足 | 等待 30 秒;不行就刷新,或换 deepseek-chat 快模型 |
| 提示 401 鉴权失败 | Key 填错 | 重新复制 Key,注意首尾不要带空格 |
| 提示 CORS 被拦截 | 用了国外模型且未开代理 | 换国内模型(DeepSeek / 通义 / Kimi),或本地运行 serve.mjs |
| 导入 JSON 后无变化 | JSON 格式有误 | 让 agent 重新生成一份,检查引号与括号是否成对 |
| 打开只看到演示数据 | 尚未导入,或导入失败了(导入失败是静默的,不会报错) | ① 确认用了 #import= 不是 ?import=;② 确认 base64 用 encodeURIComponent 包过;③ 改用最可靠的方式:打开工作台 →「导出」页 →「导入脚本(JSON)」→ 粘贴 STATE |
| 本地 HTML 双击打开是演示数据 | HTML 是原样复制的模板副本,没注入 STATE —— 最常见,且此时公网链接其实是好的 | 让 agent 重新生成本地 HTML,必须带上 window.__WB_PRESET__ 注入(见 B-2 第 3 条)。可自查:文件体积应比模板大约多出 STATE 的体积,搜 window.__WB_PRESET__ 应有命中 |
| 直达链接打开是空白/报错 | 用了 ?import= 被网关拦截(URL 超 5.2KB 返回 414/502) |
改用 #import=(? 换成 #) |
| 工作台里「镜头分析」是治愈系套话 | STATE 没传 analysis / shots[].an |
补上 shots[i].an,见 B-3 映射表 |
| 工作台情绪曲线是一条直线 | STATE 没传 beats / shots[].emo,全部回落成 5 |
补上 shots[i].role 与 shots[i].emo,见 B-3 映射表 |
| 生成内容不满意 | 主题太宽泛 | 把主题写具体,例如「猫狗大战」优于「宠物」 |
高级用法
- 润色已有脚本:把用户原文作为「主题文案」传入,重点补强情绪曲线与留白节奏,其余按 6 大模块输出。
- 多平台一稿多投:先生成通用版,再针对平台差异改写发布模块——抖音偏快节奏、大字幕、卡点 BGM、反问式标题;小红书偏封面文字拼图、emoji 正文、
#治愈系类标签。在工作台复制一版改平台参数即可快速出第二版。 - 系列拆分:长内容按时长拆成多集,每集独立走一遍 6 大模块,结尾互相埋钩子。
模型接口
工作台内置(浏览器直连、OpenAI 兼容):DeepSeek、通义千问 Qwen、智谱 GLM、Kimi、豆包、混元、百川、零一万物 Yi、阶跃星辰、MiniMax、文心一言,以及 OpenRouter、Gemini 与自定义接口。
不做的事
- 不替用户保管 API Key
- 不联网上传用户的分镜内容
- 不在无网络环境要求用户必须接 API
- 不替用户直接发表视频到任何平台
反模式与 FAQ(创作方向问题直接查这里)
> 本章针对「我该写什么 / 怎么开始 / 哪里写错了」一类创作方向问题。技术性报错(CORS / 401 / 链接打不开)请翻到本章下一节「异常处理(小白版排错 · 翻到末尾的完整版)」查。
反模式清单(明确「不要这样」)
| # | 反模式 | 为什么不行 | 怎么改 |
|---|---|---|---|
| 1 | 主题太宽泛:「宠物」「美食」「生活」「健身」 | 用户搜不到、平台不推、模型也只能给到套话 | 加限定词与冲突:「猫狗大战」「3 分钟看懂 DeepSeek」「连续早起 30 天」 |
| 2 | 镜头功能重复:3 个镜头都只拍手部特写 | 信息密度低,节奏塌方,平台判定为「低质重复」 | 每个镜头承担唯一任务:建立 / 升级 / 转折 / 高潮 / 收尾 / 互动 之一 |
| 3 | 节奏平均:每镜 3 秒,没有钩子和留白 | 观众找不到记忆锚点,完播率上不去 | 不规则加权:钩子 3s、转弯 6s、高潮 8s、收尾 2s(参考示例 1 猫狗大战的 3-2-3-3-3-3-3-4-4-2 曲线) |
| 4 | 标题党但内容空:标题「震惊」「90% 的人不知道」 | 点开即走,5 秒完播率暴跌,影响后续推荐 | 标题承诺与内容兑现一致,要么调低标题,要么把内容做厚 |
| 5 | 强行煽情:素材是搞笑,硬剪成感动 | 人设错位,评论区会有人设反噬 | 选与素材情绪一致的基调,先定基调再写口播 |
| 6 | 堆砌时间线:把一周的事压进 30 秒 | 信息密度爆炸,观众一个都记不住 | 单视频只讲一件事;系列拆分多集,结尾互相埋钩子 |
| 7 | 平台错配:抖音内容用横屏 + 慢节奏 / B 站内容用 5 秒快切 + 大字幕 | 算法判定为非本平台用户偏好,初始流量池小 | 抖音竖屏 / 卡点 / 大字幕 / 反问式标题;B 站横竖皆可 / 弹幕钩子 / 信息密度高;小红书封面文字拼图 / emoji 正文 / #治愈系 标签 |
| 8 | 互动钩子缺失或太硬:结尾干喊「点赞关注」 | 用户反感,正向互动率反降 | 把钩子埋进内容:开放式提问、置顶投票、「下集想看 X 扣 1」、彩蛋细节 |
| 9 | 基调用错:知识科普用「燃」/「紧张」 | 风格与人设冲突,观众不知道该用什么心态看 | 基调服从主题:科普用「理性」/「干货」,情感故事用「治愈」/「温暖」,搞笑用「轻松」/「反转」 |
| 10 | 时长越界:选了 5 镜 60s(实际只能放 3-4s 镜头) | 平台不推、用户拖动条跳过 | 严格按 2N+6 ≤ T ≤ 8N-6 校验(N=镜数,T=秒),B-1 步有完整公式与可行组合 |
FAQ(创作方向 8 问)
Q1:没有明确受众怎么办?
先选一个最具代表性的具体人物(不是「年轻人」「打工人」这种泛称),把他写进主题。例如「上海陆家嘴通勤的 28 岁女生」就比「年轻女性」强 10 倍。所有镜头都问自己:他/她会看到这里停住吗?
Q2:不知道用什么结构?
6 大模块已内置 4 套可复用结构:
- 萌宠/搞笑/反转:冲突建立 → 升级 → 力量反转 → 僵持高潮 → 反差收尾(示例 1)
- 生活/治愈/态度:感官钩子 → 日常动作 → 内心独白 → 情绪落地 → 开放结尾(示例 3 自律早晨)
- 燃/动作/反转:感官钩子 → 逐级加码 → 视角内化 → 追逐高潮 → 反差收尾(示例 2 城市夜跑)
- 知识/科普/干货:反常识钩子 → 拆解步骤 → 关键变量 → 误区提醒 → 行动号召(用户可参考本结构自行创作,或参考公开爆款仿写)
Q3:不知道写多长?
- 想被算法推到信息流(抖音/快手/视频号):15-30s
- 想上 B 站热门或小红书收藏:45-90s
- 想沉淀成系列或做付费:3-5 分钟
平台用户的耐心直接对应时长上限。
Q4:选题撞车了怎么办?
不要换选题。撞车说明这个选题是经过验证的流量池。差异化的不是选题,是你的角度:同样的「猫狗大战」,你从铲屎官视角、它从动物行为学家视角、我从镜头语言视角切入,三条视频能同时爆。撞车赛道的胜出者是「表达最精准的那个」。
Q5:不知道从哪个平台入手?
- 真人出镜 / 强表达:抖音 + 视频号
- 强画面 / 弱表达 / 长内容:B 站 + 视频号
- 强氛围 / 弱真人 / 图文也能做:小红书
- 强反转 / 强钩子 / 短平快:快手 + 抖音
建议同时发 3 个平台,看哪个跑得动再 All in。
Q6:不确定能不能上热门?
先把完播率做上去(钩子 + 节奏 + 收尾),再把互动率做上去(提问 + 投票 + 彩蛋),最后是转发率(信息密度高 / 有金句)。三率都高,平台会主动推。别先想热门,先想「这一秒观众会不会划走」。
Q7:不知道要不要真人出镜?
建议先出镜。真人出镜的账号信任度是纯素材号的 3-5 倍,评论区互动也高出 2 倍。不愿露脸可以:
- 出镜但戴口罩 / 帽子 / 背影
- 拍手部 / 局部 / 道具(咖啡杯、键盘、宠物)
- 录 vlog 不录棚拍,自然光比打光真实
Q8:风格不知选什么?
把你最近点赞最多的 3 条同类视频翻出来,分析它们的:节奏(快/慢)、色调(暖/冷)、口播(短句/长句)、配乐(有/无、什么类型)。风格不是发明出来的,是从你喜欢的爆款里提炼出来的。挑一个最像你的,复用一段时间后再演化。
异常处理(小白版排错 · 翻到末尾的完整版)
> 本节是按用户视角重排的精简版。技术性细节(worker 令牌 / 状态注入 / state.json 权限)请看本文件中段的「异常处理(小白版排错)」与「安全与隐私」。
创作内容问题
| 现象 | 原因 | 解决方法 |
|---|---|---|
| 生成内容都是套话 | 主题太宽泛或缺限定词 | 主题加冲突与时间,例如「连续早起 30 天」优于「自律」 |
| 节奏平淡没有起伏 | 所有镜头一样长 | 改成不规则加权:钩子 3s / 升级 5s / 转折 7s / 高潮 8s / 收尾 2s |
| 标题很标题党但内容撑不起 | 标题与内容不匹配 | 要么把内容做厚,要么把标题调低 |
| 生成的内容跑题 | 主题里塞了多个不相关的事 | 一个视频只讲一件事;系列拆分多集 |
| 镜头功能重复(3 个镜都在拍手) | 没按「任务分工」设计镜头 | 每个镜头承担唯一任务:建立 / 升级 / 转折 / 高潮 / 收尾 / 互动 |
| 平台不推 / 完播率低 | 时长越界或平台错配 | 严格按 2N+6 ≤ T ≤ 8N-6 校验;平台格式对齐(抖音竖屏、B 站高信息密度等) |
| 工作台里「镜头分析」是治愈系套话 | md 没写「分析」列 | 6 大模块里的分镜表第 8 列「分析」必须写「这一镜为什么这么拍」 |
| 工作台情绪曲线是一条直线 | md 没写「剧作分析」 | 第 4 大模块「剧作分析」必须写「结构 / 情绪曲线 / 节奏设计」三项 |
技术问题
| 现象 | 原因 | 解决方法 |
|---|---|---|
| 页面空白 / 打不开 | 网络问题或链接失效 | 刷新重试;仍不行改用本地 HTML 双击打开 |
| AI 生成一直转圈 | 模型响应慢或 Key 余额不足 | 等待 30 秒;不行就刷新,或换 deepseek-chat 快模型 |
| 提示 401 鉴权失败 | Key 填错 | 重新复制 Key,注意首尾不要带空格 |
| 提示 CORS 被拦截 | 用了国外模型且未开代理 | 换国内模型(DeepSeek / 通义 / Kimi),或本地运行 serve.mjs |
| 打开只看到演示数据 | 导入失败(静默的,不报错) | ① 确认 #import= 不是 ?import=;② 确认 base64 用 encodeURIComponent 包过;③ 最可靠:工作台 →「导出」→「导入脚本(JSON)」 |
| 本地 HTML 双击打开是演示数据 | HTML 没注入 STATE | 让 agent 重新生成,必须带 window.__WB_PRESET__ 注入;自查搜 window.__WB_PRESET__ 应有命中 |
| 直达链接打开是空白/报错 | ?import= 被网关拦截 |
改用 #import=(? 换成 #) |
| 导入 JSON 后无变化 | JSON 格式有误 | 让 agent 重新生成;检查引号与括号成对 |
| 工作台里「镜头分析」「情绪曲线」显示不对 | STATE 字段缺失 | 补 shots[i].an(分析)、shots[i].role 与 shots[i].emo(节奏 / 情绪) |
工作流问题
| 现象 | 原因 | 解决方法 |
|---|---|---|
| 想要本地版本但没装 Node | 不知道 serve.mjs 需要 | 下载 Node 18+ 即可:brew install node / node -v 验证 |
| 改完 HTML 但公网页没更新 | 部署目录与安装目录不同步 | 改完 ~/.workbuddy/skills/storyboard-generator/assets/ 里的文件,再重新部署 |
| 在 file:// 双击 HTML 看不到自己内容 | HTML 是模板副本,没注入 STATE | 用工作台链接,或让 agent 重新生成本地 HTML |
| 同步到本地工作台时报 403 | 中枢令牌失效 | 重启 serve.mjs,浏览器刷新会重新拉新令牌 |
| 不想每次重新填主题 | 已有脚本想润色 | 把原文作为「主题文案」传入,走「高级用法」分支 |