cyxj-release-kit:视频发布物料一条龙
成片定稿 → 标题(6 平台)→ 简介(6 平台)→ 封面(4:3 首选,另含 16:9 / 3:4)→ 上传 JPG。
本 skill 把 2026-07-05 loop 视频那次全流程实战固化下来,核心教训只有一条:
中文文字永远不要交给生图模型渲染——模型不认精确比例、脚本会中心裁切,文字进画面必掉字;
文字由浏览器渲染,底图才交给生图/实拍。
前置
- 读
内容创作/log/index.md HEAD,拿到:成片位置、最终导出字幕(SRT)位置、视频主题。
- 确认视频标题已定稿。没定稿就先出候选(规则见下),用户拍板后再走后面模块。
- 所有事实(数字、时间戳、功能点)只从最终字幕/成片里来,数据不编(同 cyxj-jingxuan 的红线)。
模块一:标题(6 平台)
先读 ${CLAUDE_PLUGIN_ROOT}/skills/cyxj-release-kit/references/platform-specs.md(各平台字数上限 + 自家高播放样本,必读)。
标题只做一件事:对观众正在用 / 正在选的东西,给一个具体判决。 形式就是"X 实测:发生了什么,数字多少"。
用户拍板的标准样本(2026-09-04):「Agent Teams 实测:3 个 AI 互相证伪排 bug,Token 贵 4 倍」——
东西名 + 体裁词 + 一个具体事件 + 一个数字判决,平铺直叙像新闻导语,第三人称陈述句。
流程:
- 先摘利害句:从最终字幕 / 成片里摘 3-5 条——具体数字(倍数 / 刀 / 分钟 / 百分比)、判决(不如 / 贵 / 降智 / 删掉 / 别用)、
观众身上正在发生的痛。摘不出来就如实回报用户"这期没有可卖的判决",等用户定方向。
- 拼标题:主语(工具 / 功能名,观众认识的东西)+ 体裁词(实测 / 对比 / 拆解 / 翻车)+ 事件 + 数字判决。冒号 / 逗号分隔。
- 每平台 3 条候选,各卖一条不同的利害句;每条附「前 15 字截断预览」;标一条推荐并说一句为什么。
用户拍板;拿不准的上 YouTube 后台「标题测试」让数据选,不靠猜。
- 自检(逐条过):≤字数上限?有具体数字?主语是观众认识的东西?体裁词 = 真实体裁?是陈述句?
硬上限(交付前数一遍):YouTube ≤25 字 / B 站 ≤25 字 / 抖音首行 ≤20 字 / 视频号 ≤25 字 / 小红书 ≤20 字 / TikTok 英文 ≤50 字符。
写法要求(只说要怎么写):
- 主语是观众正在用的工具 / 功能名,只写一次,英文名直接用
- 一条标题一个判决,判决里带一个具体数字(倍数 / 百分比 / 刀 / 天)
- 陈述句,第三人称,冒号或逗号分隔,像新闻导语
- 体裁词 = 片子的真实体裁(实测 / 对比 / 拆解 / 教程),标题里的每个事实都能在片中找到
- 三平台卖同一个判决,各平台只调字数和关键词位置
模块二:简介(6 平台)
规格逐平台见 platform-specs.md。要点:
- YouTube 简介带章节时间戳,第一条必须
00:00,每个时间戳都要回字幕核对,禁止估。
- 标题+简介成对交付,一次给全 6 个平台,别挤牙膏。
模块三:封面(HTML 封面工作台)
3.1 底图(一期一张,无字)
底图 = 16:9 无文字场景图,来源二选一:
生图:调 cyxj-image-studio 的 generate.py,必须显式指定风格:
S=~/.claude/plugins/.../cyxj-video-cover/scripts/generate.py
# 真人底图(人在左、右半边留白):
python3 $S --title "本期标识" --style plate --ratios 16:9 --n 3 \
--face ~/Pictures/封面形象/<用户指定的原图> --label "<项目>-底图"
# 无人底图(不喂脸,走文生图端点):
python3 $S --title "本期标识" --style plate-noface --ratios 16:9 --n 3 --label "<项目>-底图"
--style 不给就是 default,那会把中文标题渲进画面,出来是带字整图,不能当底图。
plate / plate-noface 的 prompt 完全不含 title,并且写死了「无任何文字/字母/数字/logo/水印」
- 「右半边整片空墙留给排版」。
--title 在这两个风格里只是批次标识,不进画面。
人脸参考用 ~/Pictures/封面形象/ 里用户指定的原图(每次都喂原图,严禁拿生成图回喂,
会越来越不像)。目录里有十几张,别默认取第一张——先问用户用哪张。
实拍/抽帧:用户给照片,或从成片开头口播段 ffmpeg 抽帧(注意挑眼睛睁开的帧,先抽 5-6 帧给用户选)。
底图只出 16:9 一个比例——其余比例由工作台的 blur-fill 自己适配,不要分比例生图。
通道的坑(2026-08-25 实测,踩过一遍才跑通):
| 现象 |
真因 |
处理 |
503 No available channel for model gpt-image-2-vip |
这把 key 的分组里没有 vip 档 |
用 gpt-image-2(已是脚本默认);先 GET /v1/models 看分组里到底有啥 |
自写脚本 403 error code: 1010 |
Cloudflare 拦 Python-urllib 的 UA |
请求和下图都要带浏览器 UA;generate.py 已内置 |
400 only supports image generation ... text conversation |
上游偶发把图片请求错路由到对话模型,成功率约五成 |
原样重试即可;generate.py 已内置 4 次重试 |
| 524 |
Cloudflare 网关超时(~100s),并发越高越容易撞 |
并发别开太大 + 重试。实测并发 6 → 3 成功(36/63/89s)/3 个 524 |
已作废的旧说法:「gpt-image-2 会无视 size、强制 1254² 缩水,比例要稳得走 Gemini」——
2026-08-25 实测传 size: 2560x1440 就出 2560×1440,不必绕道。
3.2 工作台
- 把
${CLAUDE_PLUGIN_ROOT}/skills/cyxj-release-kit/templates/cover-studio.html 复制到本期
物料目录(~/Pictures/封面出图/<日期>-<项目>-最终/源文件/),底图重命名为 plate_16x9.png 放同目录。
- 改模板顶部三个常量
L1/L2/L3(标题三段)。字数和默认(5/4/4 字)差很多时,按
「字数 × 字号 ≈ 可用宽度」调 RATIOS 里各比例的 s1/s3,渲一次画廊自检确认没有换行/贴边。
open -a "Google Chrome" 工作台.html 给用户挑。4:3 排在最前,画廊 = 3 比例 × 3 样式(A 右栏三行+箭头 /
B 通栏大字 / C 微倾斜+橙底线),点选存 localStorage,可多选。所有样式右上角都不放图标。
- 读用户选择:扩展碰不了 file:// 页面,从磁盘读:
cd ~/Library/Application\ Support/Google/Chrome/Default/Local\ Storage/leveldb
strings -a $(ls -t *.log | head -1) | grep -a 'coverPicks\|16x9-\|4x3-\|3x4-' | tail -3
取最后一条 JSON 数组为准。读不到就直接问用户选了哪几个编号。
- 按选中变体逐张导出(无头 Chrome,像素级精确):
C="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
"$C" --headless --disable-gpu --hide-scrollbars \
--window-size=<W>,<H> --virtual-time-budget=4000 \
--screenshot=<输出>.png "file://<工作台绝对路径>?v=<变体ID>"
尺寸:16x9=2560,1440;4x3=2048,1536;3x4=1536,2048。导出后 sips -g pixelWidth -g pixelHeight 验尺寸。
3.3 工作台原理(改样式/排错时读)
- blur-fill 模糊延展:清晰底图按宽度贴底,画布上方缺口用同图
blur(60px) 放大版补,
清晰层顶部加 mask-image: linear-gradient 渐隐,接缝不可见。模糊层 background-position
取景纯墙区(right center),否则人物鬼影会浮在模糊区。
- 人物大小由清晰层
plateW 控制,文字大小在 RATIOS 每比例配置里。
· 真人底图:竖版必须把人顶上来才够看 —— 3x4 实测 plateW: 1536(=画布宽)人物偏小,
2200 才合适(超出画布的右半边被 overflow 裁掉,人在左侧不受影响)。
· 无人底图:纯背景,plateW 设成画布宽即可满幅铺开,16:9 还能 fade:false 免渐隐。
- 字号三档
s1/s2/s3 对应 L1/L2/L3,s2 不写会回退成 s1。L1/L2 字数差很多时必须分开给:
例 L1「如何管理上下文?」(8 字) 与 L2「SUBAGENTS」(9 个拉丁字母 ≈ 4.5 汉字宽) 共用一个字号,
L1 必超宽。拉丁字母按 ≈0.5 汉字宽估,汉字按「字数 × 字号 ≈ 可用宽度」估。
- 字体 = 得意黑 Smiley Sans,已装
~/Library/Fonts/SmileySans-Oblique.ttf;模板 @font-face 走
local() + 同目录 ttf 兜底。新机器没装:GitHub atelier-anchor/smiley-sans releases 下载
(v2.0.1 实测可用),cp 进 ~/Library/Fonts/。
模块四:上传 JPG
- HTML 截图无任何来源痕迹,无需去痕,直接轻量转换:
sips -s format jpeg -s formatOptions 95 <png> --out <jpg>
产物归集与收尾
~/Pictures/封面出图/<日期>-<项目>-最终/
封面_16x9.png / 封面_4x3.png / 封面_3x4.png ← 定稿 PNG
源文件/ 封面工作台.html + plate_16x9.png + 字体 ← 可复用,下期只改 L1/L2/L3
- 过程稿文件夹在用户确认定稿后问一声再删(先例:用户会要求清掉)。
- 标题+简介直接在对话交付;按内容创作仓库规矩更新 log HEAD + 历史流水。
与相邻 skill 的分工
| skill |
管什么 |
本 skill 关系 |
| cyxj-video-cover |
生图封面(整图带字) |
降级为底图生成器:只用 --style plate / plate-noface,default 风格会渲字不能用 |
| cyxj-jingxuan |
抖音精选申请文案 |
发布后的下一步,不在本 skill 内 |
| cyxj-hook / cyxj-content |
视频开头/内容诊断 |
管片子本身,不管发布物料 |
1---2name: cyxj-release-kit3description: 陈与小金的视频发布物料一条龙:成片定稿后,一次产出 6 平台「标题+简介」(YouTube/B站/抖音 主平台, 视频号/TikTok/小红书 分发平台)+ 三比例封面(4:3 为工作台首项,另含 16:9 / 3:4,HTML 封面工作台出图, 文字零错字零裁切) + 上传用 JPG。封面走「无字底图 + HTML 排字」路线,不再用生图赌中文渲染。 触发方式:/cyxj-release-kit、发布物料、出发布包、取标题、六平台标题、写标题和简介、 做封面(HTML/工作台)、封面工作台、视频要发布了。 凡是"视频做完了准备发"的场景都应该用本 skill——哪怕用户只提了其中一样(只要标题/只要封面), 也按本 skill 对应模块走,保证口径一致。4---56# cyxj-release-kit:视频发布物料一条龙78成片定稿 → 标题(6 平台)→ 简介(6 平台)→ 封面(4:3 首选,另含 16:9 / 3:4)→ 上传 JPG。9本 skill 把 2026-07-05 loop 视频那次全流程实战固化下来,核心教训只有一条:10**中文文字永远不要交给生图模型渲染**——模型不认精确比例、脚本会中心裁切,文字进画面必掉字;11文字由浏览器渲染,底图才交给生图/实拍。1213## 前置14151. 读 `内容创作/log/index.md` HEAD,拿到:成片位置、**最终导出字幕**(SRT)位置、视频主题。162. 确认**视频标题已定稿**。没定稿就先出候选(规则见下),用户拍板后再走后面模块。173. 所有事实(数字、时间戳、功能点)只从最终字幕/成片里来,**数据不编**(同 cyxj-jingxuan 的红线)。1819## 模块一:标题(6 平台)2021先读 `${CLAUDE_PLUGIN_ROOT}/skills/cyxj-release-kit/references/platform-specs.md`(各平台字数上限 + 自家高播放样本,必读)。2223**标题只做一件事:对观众正在用 / 正在选的东西,给一个具体判决。** 形式就是"X 实测:发生了什么,数字多少"。24用户拍板的标准样本(2026-09-04):**「Agent Teams 实测:3 个 AI 互相证伪排 bug,Token 贵 4 倍」**——25东西名 + 体裁词 + 一个具体事件 + 一个数字判决,平铺直叙像新闻导语,第三人称陈述句。2627流程:281. **先摘利害句**:从最终字幕 / 成片里摘 3-5 条——具体数字(倍数 / 刀 / 分钟 / 百分比)、判决(不如 / 贵 / 降智 / 删掉 / 别用)、29 观众身上正在发生的痛。摘不出来就如实回报用户"这期没有可卖的判决",等用户定方向。302. **拼标题**:主语(工具 / 功能名,观众认识的东西)+ 体裁词(实测 / 对比 / 拆解 / 翻车)+ 事件 + 数字判决。冒号 / 逗号分隔。313. **每平台 3 条候选**,各卖一条不同的利害句;每条附「前 15 字截断预览」;标一条推荐并说一句为什么。32 用户拍板;拿不准的上 YouTube 后台「标题测试」让数据选,不靠猜。334. **自检**(逐条过):≤字数上限?有具体数字?主语是观众认识的东西?体裁词 = 真实体裁?是陈述句?3435硬上限(交付前数一遍):YouTube ≤25 字 / B 站 ≤25 字 / 抖音首行 ≤20 字 / 视频号 ≤25 字 / 小红书 ≤20 字 / TikTok 英文 ≤50 字符。3637写法要求(只说要怎么写):38- 主语是观众正在用的工具 / 功能名,只写一次,英文名直接用39- 一条标题一个判决,判决里带一个具体数字(倍数 / 百分比 / 刀 / 天)40- 陈述句,第三人称,冒号或逗号分隔,像新闻导语41- 体裁词 = 片子的真实体裁(实测 / 对比 / 拆解 / 教程),标题里的每个事实都能在片中找到42- 三平台卖同一个判决,各平台只调字数和关键词位置4344## 模块二:简介(6 平台)4546规格逐平台见 platform-specs.md。要点:47- YouTube 简介带章节时间戳,第一条必须 `00:00`,**每个时间戳都要回字幕核对**,禁止估。48- 标题+简介成对交付,一次给全 6 个平台,别挤牙膏。4950## 模块三:封面(HTML 封面工作台)5152### 3.1 底图(一期一张,无字)5354底图 = 16:9 无文字场景图,来源二选一:5556- **生图**:调 cyxj-image-studio 的 `generate.py`,**必须显式指定风格**:5758 ```bash59 S=~/.claude/plugins/.../cyxj-video-cover/scripts/generate.py60 # 真人底图(人在左、右半边留白):61 python3 $S --title "本期标识" --style plate --ratios 16:9 --n 3 \62 --face ~/Pictures/封面形象/<用户指定的原图> --label "<项目>-底图"63 # 无人底图(不喂脸,走文生图端点):64 python3 $S --title "本期标识" --style plate-noface --ratios 16:9 --n 3 --label "<项目>-底图"65 ```6667 **`--style` 不给就是 default,那会把中文标题渲进画面,出来是带字整图,不能当底图。**68 plate / plate-noface 的 prompt 完全不含 title,并且写死了「无任何文字/字母/数字/logo/水印」69 + 「右半边整片空墙留给排版」。`--title` 在这两个风格里只是批次标识,不进画面。7071 人脸参考用 `~/Pictures/封面形象/` 里**用户指定的原图**(**每次都喂原图,严禁拿生成图回喂**,72 会越来越不像)。目录里有十几张,**别默认取第一张——先问用户用哪张**。7374- **实拍/抽帧**:用户给照片,或从成片开头口播段 ffmpeg 抽帧(注意挑眼睛睁开的帧,先抽 5-6 帧给用户选)。7576底图只出 16:9 一个比例——其余比例由工作台的 blur-fill 自己适配,不要分比例生图。7778**通道的坑(2026-08-25 实测,踩过一遍才跑通)**:7980| 现象 | 真因 | 处理 |81|---|---|---|82| 503 `No available channel for model gpt-image-2-vip` | 这把 key 的分组里**没有 vip 档** | 用 `gpt-image-2`(已是脚本默认);先 `GET /v1/models` 看分组里到底有啥 |83| 自写脚本 403 `error code: 1010` | **Cloudflare 拦 `Python-urllib` 的 UA** | 请求和下图都要带浏览器 UA;`generate.py` 已内置 |84| 400 `only supports image generation ... text conversation` | 上游偶发把图片请求错路由到对话模型,**成功率约五成** | 原样重试即可;`generate.py` 已内置 4 次重试 |85| 524 | Cloudflare 网关超时(~100s),并发越高越容易撞 | 并发别开太大 + 重试。实测并发 6 → 3 成功(36/63/89s)/3 个 524 |8687已作废的旧说法:「gpt-image-2 会无视 size、强制 1254² 缩水,比例要稳得走 Gemini」——882026-08-25 实测传 `size: 2560x1440` 就出 2560×1440,不必绕道。8990### 3.2 工作台91921. 把 `${CLAUDE_PLUGIN_ROOT}/skills/cyxj-release-kit/templates/cover-studio.html` 复制到本期93 物料目录(`~/Pictures/封面出图/<日期>-<项目>-最终/源文件/`),底图重命名为 `plate_16x9.png` 放同目录。942. 改模板顶部三个常量 `L1/L2/L3`(标题三段)。字数和默认(5/4/4 字)差很多时,按95 「字数 × 字号 ≈ 可用宽度」调 `RATIOS` 里各比例的 `s1/s3`,渲一次画廊自检确认没有换行/贴边。963. `open -a "Google Chrome" 工作台.html` 给用户挑。4:3 排在最前,画廊 = 3 比例 × 3 样式(A 右栏三行+箭头 /97 B 通栏大字 / C 微倾斜+橙底线),点选存 localStorage,可多选。所有样式右上角都不放图标。984. 读用户选择:**扩展碰不了 file:// 页面**,从磁盘读:99 ```bash100 cd ~/Library/Application\ Support/Google/Chrome/Default/Local\ Storage/leveldb101 strings -a $(ls -t *.log | head -1) | grep -a 'coverPicks\|16x9-\|4x3-\|3x4-' | tail -3102 ```103 取**最后一条** JSON 数组为准。读不到就直接问用户选了哪几个编号。1045. 按选中变体逐张导出(无头 Chrome,像素级精确):105 ```bash106 C="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"107 "$C" --headless --disable-gpu --hide-scrollbars \108 --window-size=<W>,<H> --virtual-time-budget=4000 \109 --screenshot=<输出>.png "file://<工作台绝对路径>?v=<变体ID>"110 ```111 尺寸:16x9=2560,1440;4x3=2048,1536;3x4=1536,2048。导出后 `sips -g pixelWidth -g pixelHeight` 验尺寸。112113### 3.3 工作台原理(改样式/排错时读)114115- **blur-fill 模糊延展**:清晰底图按宽度贴底,画布上方缺口用同图 `blur(60px)` 放大版补,116 清晰层顶部加 `mask-image: linear-gradient` 渐隐,接缝不可见。模糊层 `background-position`117 取景**纯墙区**(right center),否则人物鬼影会浮在模糊区。118- 人物大小由清晰层 `plateW` 控制,文字大小在 `RATIOS` 每比例配置里。119 · **真人底图**:竖版必须把人顶上来才够看 —— 3x4 实测 `plateW: 1536`(=画布宽)人物偏小,120 **2200 才合适**(超出画布的右半边被 overflow 裁掉,人在左侧不受影响)。121 · **无人底图**:纯背景,`plateW` 设成画布宽即可满幅铺开,16:9 还能 `fade:false` 免渐隐。122- 字号三档 `s1/s2/s3` 对应 L1/L2/L3,**`s2` 不写会回退成 `s1`**。L1/L2 字数差很多时必须分开给:123 例 L1「如何管理上下文?」(8 字) 与 L2「SUBAGENTS」(9 个拉丁字母 ≈ 4.5 汉字宽) 共用一个字号,124 L1 必超宽。拉丁字母按 ≈0.5 汉字宽估,汉字按「字数 × 字号 ≈ 可用宽度」估。125- 字体 = 得意黑 Smiley Sans,已装 `~/Library/Fonts/SmileySans-Oblique.ttf`;模板 @font-face 走126 `local()` + 同目录 ttf 兜底。新机器没装:GitHub `atelier-anchor/smiley-sans` releases 下载127 (v2.0.1 实测可用),cp 进 `~/Library/Fonts/`。128129## 模块四:上传 JPG130131- HTML 截图无任何来源痕迹,无需去痕,直接轻量转换:132 `sips -s format jpeg -s formatOptions 95 <png> --out <jpg>`133134## 产物归集与收尾135136```137~/Pictures/封面出图/<日期>-<项目>-最终/138 封面_16x9.png / 封面_4x3.png / 封面_3x4.png ← 定稿 PNG139 源文件/ 封面工作台.html + plate_16x9.png + 字体 ← 可复用,下期只改 L1/L2/L3140```141- 过程稿文件夹在用户确认定稿后**问一声再删**(先例:用户会要求清掉)。142- 标题+简介直接在对话交付;按内容创作仓库规矩更新 log HEAD + 历史流水。143144## 与相邻 skill 的分工145146| skill | 管什么 | 本 skill 关系 |147|---|---|---|148| cyxj-video-cover | 生图封面(整图带字) | 降级为**底图生成器**:只用 `--style plate` / `plate-noface`,default 风格会渲字不能用 |149| cyxj-jingxuan | 抖音精选申请文案 | 发布后的下一步,不在本 skill 内 |150| cyxj-hook / cyxj-content | 视频开头/内容诊断 | 管片子本身,不管发布物料 |