每日视频:创意 → 研究 → 审批 → 构建 → 预览 → 渲染 → Buffer
首先阅读 .claude/CLAUDE.md;它是事实来源(品牌、视频规则、语音、安全区域)。
此技能是逐步执行的流程。有两个强制性的创作者审批节点:提案(步骤 2)和预览(步骤 5)。 切勿跳过它们。
以下路径使用 <date> = 今天,格式为 YYYY-MM-DD(亚洲/利雅得时区)。剧集文件夹:public/episodes/<date>/。
外观与风格:每集保持一致
每集都必须看起来像你的第一集——系列通过其外观被识别。因此:
- 只使用相同的构建块。 使用现有的场景、装备好的角色、姿势、动作、道具和物品。不要在日常运行中更改
src/theme.ts、字体、颜色、角色美术、章节栏、字幕样式或音效。新的视觉效果(新场景、姿势、道具或物品)是创作者单独要求的任务;当他要求时,以相同的黑金风格构建它,并将其添加到此技能的文件列表中。 - 相同的结构。 1080×1920,30 fps,≤ 60 秒。顶部有“EP NN”标签 + 7 章节栏,底部有逐词字幕(当前词高亮,即将出现的词暗淡,每行一个金色关键词)。一句话 = 一个场景;角色表演每句话;道具/物品在口语词上出现;每 1.5-3 秒有一次视觉变化;每次场景切换有“嗖”声。
- 相同的节奏。 前 2 秒内吸引观众 → 早期“关注”提示(关注按钮场景)→ 内容章节 → 带有者网站和精确结束语的开场卡片 → “明天:<下一个主题>”预告。
- 相同的语音。 使用
assets/voice/reference_energy.wav进行 Qwen3-TTS,相同种子,有活力的标点。 - 相同的发布。 利雅得时间 19:00,Instagram Reel(分享到信息流)+ TikTok + LinkedIn,在 Instagram 和 TikTok 上打开 AI 生成标签(语音是 AI 克隆;标签是诚实的并保护账户)。
- 剧集编号从
topics-log.json递增(下一集 = 最后一集 + 1)。
1. 研究
- 读取
topics-log.json:不重复话题;如果上一集承诺了“下一个”话题,优先使用它。 - 网络搜索:2 到 4 个可靠来源(官方文档、GitHub README、论文、供应商自己的页面)。验证每个数字、价格、版本或声明。变化快的事物加上“截至 ”。绝不编造事实、基准或代码。
- 定位:一个真实的开发者提供有用的技巧,而不是炒作或“看 AI 做了什么”。将工具类话题作为开发者技巧来呈现。
2. 提案 - 停止等待审批
在聊天中向创作者展示简短的:
- 吸引点(前 2 秒):一个具体的赌注、数字或声明。没有问候语。
- 场景表格,每句话一行(5-8 个章节,~12-16 个场景,30-60 秒总时长,~2.5-3.5 个口语词/秒):
# | 章节 | 句子 | 场景 | 角色做什么 | 道具落在哪个词上章节:HOOK, WHAT, WHY IT MATTERS, HOW, CATCH, TRY IT, NEXT。吸引点后立即出现早期关注提示。 最后一句话始终是:“访问我的网站 yoursite.com 并点击关注按钮以获取更多内容。” - 事实 + 来源(URL),以及创作者必须确认的任何内容(以他的口吻说的观点、工具名称)。
- 字幕:用于 Instagram/TikTok(吸引行、悬念行、行动号召、话题标签)以及一个独立的、更专业的 LinkedIn 字幕(3 个话题标签)。
等待“继续”/审批或修改。如果修改较大,应用修改并重新展示。
3. 语音(GPU 任务;期间 GPU 不做其他事情)
编写 public/episodes/<date>/narration.txt:每个 TTS 段落写一个段落(段落间空行),通常每段 1-3 句话。按照口语的方式写:
your site 按口语拼写(例如“my site dot com”)、N P X create video、Qwen three T-T-S、pip install Qwen T-T-S,数字如果可能歧义则拼写出来。在吸引行使用 !(模型将标点解读为能量)。
.venv-qwen\Scripts\python scripts\tts_qwen.py public\episodes\<date>\narration.txt
.venv-qwen\Scripts\python scripts\timestamps.py public\episodes\<date>\narration.wav --hint "<5-10 个技术术语>"
- 语音 = Qwen3-TTS 1.7B 零样本,参考
assets/voice/reference_energy.wav(+.txt转录)。绝不使用付费语音服务。 - 绝不将整个脚本作为提示传递给 Whisper(会导致循环);仅使用
--hint并提供少量术语。 - 检查旁白时长(必须 ≤ 60 秒,含 1.5 秒尾部),并浏览
narration.json文本以检查误听。 tts_qwen.py自动均衡语音(scripts/audio_level.py:压缩器 → -16 LUFS → -1 dBFS 峰值)。src/components/Sfx.tsx中的音效已针对该级别调整(比语音低约 12 dB);不要提高它们。如果旁白以其他方式生成,先对其运行scripts/audio_level.py。
4. 构建剧集(仅数据 - 日常运行中不添加新的组件代码)
编写 public/episodes/<date>/plan.json,然后:
.venv-qwen\Scripts\python scripts\build_episode.py public\episodes\<date>
npm run lint
plan.json 结构(完整示例见 public/episodes/example/plan.json):
{
"episode": 2, "date": "<date>", "title": "...", "keywords": ["word,", "..."], "tailMs": 1500,
"sources": [{ "title": "...", "url": "https://..." }],
"scenes": [{
"chapter": "HOOK",
"display": "字幕应显示的内容(书面形式:yoursite.com, npx create-video)",
"set": "stage", "setVariant": "", "zoom": 1.05,
"actor": { "x": 540, "scale": 0.9, "facing": "right", "enterFrom": "right",
"beats": [{ "atMs": 0, "pose": "talk" }, { "atWord": "build", "pose": "pointUp", "motion": "talk" }] },
"items": [{ "kind": "label", "text": "...", "atWord": "camera!", "untilWord": "...", "x": 540, "y": 420 }]
}]
}
- 所有场景的
display连接起来必须与口语旁白逐字匹配(书面形式可能不同,例如“Qwen3-TTS”对应“Qwen three T-T-S”)。开始一个旁白段落的场景从 TTS 精确计时开始;其他场景从第一个口语词开始。 - 时间键:
atWord/crossAtWord/untilWord(匹配时忽略大小写和标点),occurrence用于重复的词,offsetMs微调,或直接使用atMs。 - 姿势(
src/rig/poses.ts):idle, talk, explain, shrug, wave, point, pointUp, pointViewer, celebrate, think, search, laptop, holdUp, thumbsUp, headScratch。动作: talk(手势跟随语音),wave, shake, celebrate, search, type, still。手持道具: magnifier, phone, trophy;"laptop": true表示手持笔记本电脑。facing: "left"使角色镜像(向左指东西)。 - 场景(
src/sets/Sets.tsx):stage, coderoom, desk(桌面隐藏腿;监视器在右侧),sky(setVariant为“sunrise”或“timelapse”),chalkboard(黑板在左侧),library, blueprint(金色技术图纸在海军蓝背景上 - 用于 HOW /“工作原理”场景),plain。每个场景都有飘动的金色粒子("particles": false关闭它)。 - 物品(
src/scene/Items.tsx):icon(相机/时间线,crossAtWord),label(金色/浅色),code(飞行芯片,fromX/fromY),window(终端或"style": "chalk",线条使用 kind command/code/output),counter, stamp, steps, waveform, calendar(从→到),banner, confetti, book, follow, end(网址 + 行动号召,装饰艺术框架),kinetic(大词逐个猛烈撞击;highlight词金色;size,stagger帧 - 最适合吸引行),splitflap(机场式数字,最多 10 个字符,可选label- 最适合吸引数字)。 - 卡片自动为磨砂玻璃(玻璃态)。样式预览:
StyleTest合成。 - 用真实内容(实际代码、真实终端输出、真实数字)填充物品,绝不使用占位符。
通过艰苦实践得出的布局规则(1080×1920):
- 顶部栏(EP 标签 + 章节)结束于约 y 215:物品顶部必须保持在约 230 以下(记住场景缩放会将物品向上推)。
- 地面 y 1440;字幕在 y 1490;保留 60 像素的侧边距。
- 角色缩放 0.9 → 头顶约 y 570;0.8 → 约 670;0.7 → 约 760。大物品(窗口、波形、结束卡片)需要角色缩放 0.58-0.8,或将角色放在侧面(x≈790,面向左)。
- 默认大小下,标签每个字符约 38 像素:保持简短,否则会跑出屏幕。
- 绝不用物品遮挡角色的脸;将标签放在窗口旁边或下方。
5. 预览 - 停止等待审批
- Studio:
npx remotion studio→ http://localhost:3000/Episode(可能已在运行)。 - 首先自己渲染每个场景的静态帧(缩放 0.4)并检查:重叠、文本跑出屏幕、脸部被遮挡、物品时间。修复、重新构建、重新检查。
- 向创作者展示 Studio 链接(并提及你无法验证的任何内容,例如发音)。等待审批或截图反馈——精确修复他指出的问题。
6. 渲染
npx remotion render Episode out/<date>/video.mp4 --codec=h264 --crf=18
(将 Episode 合成的 episodeFile 默认属性在 src/Root.tsx 中设置为新文件夹,或传递 --props='{"episodeFile":"episodes/<date>/episode.json","episode":null}'。)
验证:≤ 60 秒,1080×1920,30 fps,有音频,并且语音明显高于每个音效(语音 ≈ -16 LUFS)。编写 out/<date>/caption.txt(IG/TikTok)和 out/<date>/caption-linkedin.txt。
7. Buffer 草稿(创作者附加视频)
Buffer 的 API 只接受来自公共 URL 的视频,因此创建草稿,时间设置为利雅得时间 19:00;创作者在 Buffer 中打开每个草稿,附加 out/<date>/video.mp4,然后点击“排程”。
- 组织
<你的 Buffer 组织 ID>(使用 Buffer MCP 的get_account获取;免费计划允许 10 个排程帖子)。 - 频道:Instagram
<id>,TikTok<id>,LinkedIn<id>(使用list_channels获取)。 - 使用
mode: "customScheduled"、dueAt: "<date>T19:00:00+03:00"、saveToDraft: true、schedulingType: "automatic"创建帖子。- Instagram:
metadata.instagram = { type: "reel", shouldShareToFeed: true, isAiGenerated: true }。 - TikTok:
metadata.tiktok = { title: "<简短吸引>", isAiGenerated: true }(语音是 AI 克隆——始终公开)。 - LinkedIn:专业字幕,无需元数据。
- Instagram:
- 如果 19:00 已过,询问创作者时间,不要猜测。未经他的许可,绝不发布或排程任何内容。
8. 收尾工作
- 将剧集追加到
topics-log.json(日期、剧集、标题、话题、“下一个”承诺、来源)。 - 告知创作者:视频路径、三个 Buffer 草稿以及他必须附加视频、下一集承诺的话题。