xiaolin-explainer-packaging:把口播片段包装成带动态图表的财经讲解视频
输入是一组出镜口播片段和台词,这个 Skill 让 Agent 查好上屏要用的资料,再用一套 Remotion 版式组件做出讲解画面、字幕、转场和混音,最后逐帧质检。版式包括巨型数字、卡片墙、白卡图表、文档荧光笔、网页截图荧光笔、折线图、时间轴、饼图、流程图、世界地图、左右对比和关系图。风格参考一位财经博主的公开视频,是非官方项目。来源 howoneai/xiaolin-explainer-packaging,代码 MIT 许可证,字体 SIL OFL 1.1,目前是 v1.4.0。
触发
- 用户有一组口播片段,想包装成带图表、数字和网页截图的讲解视频。
- 用户想给已有的口播视频重做讲解画面。
- 用户想做"一口气了解……"这类财经、科普选题的图形包装。
不用于:写口播稿、生成出镜画面、录屏、下载平台视频、竖屏视频。
硬性规则
- 保留"AI 生成 · 非本人"标注(
brand.label),不要去掉。 brand.logo只填用户自己的台标,不填风格来源博主或其他真实创作者的台标。不用真实创作者的肖像或声音生成出镜画面。- 上屏的数字、原文和政策条文都要能追溯到来源,写进事实文件。台词里的数字和事实文件对不上时,先改台词。
- 照片只用自由许可的(Wikimedia Commons),画面上带署名。网页截图里的新闻图片社照片要模糊,Logo 不改色、不变形。
- 涉及中国疆域时不用自带的世界地图,它不符合大陆公开出版地图的审核要求。改用自然资源部标准地图并标注审图号。
- 装软件、下载字体前先问用户。
安装
需要 Node 18 或以上、ffmpeg、带 numpy 和 Pillow 的 python3。第一次 npm install 和渲染要联网(Remotion 会下载 Chrome)。作者只在 Apple Silicon 的 macOS 上测过,在 Claude Code 等其他 Agent 里没有测过。
node -v && ffmpeg -version | head -1 && python3 -c "import numpy, PIL; print('ok')"
D=~/tools/xiaolin-explainer-packaging
[ -d $D ] || git clone https://github.com/howoneai/xiaolin-explainer-packaging.git $D
mkdir -p ~/.claude/skills && cp -R $D/xiaolin-explainer-packaging ~/.claude/skills/ # Codex 等放进各自的 skills 目录
Manus 用户从仓库 Releases 下载 xiaolin-explainer-packaging.skill,在 Manus 里添加为技能。
字体:标题和字幕用优设标题黑,仓库不带。让用户从 https://www.uisdc.com/uisdc-first-free-font 下载,存成工程里的 public/fonts/YouShe.ttf,或者设环境变量 YOUSHE_TTF 指向它。缺字体时退回思源黑体 900,风格明显变弱,要告诉用户。
Remotion 授权:个人、3 人以内的公司和非营利组织免费(含商用),4 人以上的公司要买公司授权,开工前提醒用户。
流程
- 一条消息问完三件事:有没有固定底图(没有就从 6 套主题里推荐)。台标填什么、出镜是不是 AI 生成。有没有指定要放的真实素材。拿到回答再建工程。
- 准备输入:每句一个 1920×1080 mp4 放进
public/clips/<id>.mp4。每句有朗读文本say和字幕文本sub。从templates/facts_template.md复制事实文件。 - 建工程:
<skill>/scripts/new_project.sh <工程目录>(加--demo是冒烟测试)。转写每段出镜,在timeline.json里定tin/tout、剪首尾静音,口误写进cuts。改project.json的brand、music、theme。 - 先写场景表再写代码:读
references/style-bible.md、research.md、treatment.md,列"场景名 | 覆盖哪几句 | 版式 | 背景照片 | 道具和动作 | 画中画 | 需要的资料",交给用户确认。自查七点:一个场景跨 2 到 8 句。主体被裁切或占画面六成以上。每 2 到 3 个深色场景插 1 个白纸场景。引用原文用真实截图或逐字文档。开场、观点句、转折和结尾留给全屏出镜。每个图形场景至少有一样本期专属素材。道具承担意思,相邻场景动作不重样。 - 查资料、备素材:照片
scripts/commons_photo.py,网页截图和原文坐标node scripts/web_shot.mjs --boxes,Logoscripts/commons_logo.py,道具按treatment.md的画风后缀生成透明 PNG 放进public/props/<选题>/。查完回改场景表。 - 写分镜:从
templates/scenes_treat.py复制写法。元素入场对齐关键词S.k('关键词', -0.15),当前项亮起其余压暗,每个场景用KF.append((标签, 时刻))登记审片帧。跑python3 story_core.py timeline.json scenes.py,要输出gaps/overlaps []。 - 关键帧审片,至少两轮(命令见下表),按审片清单改完再给用户看。
- 整片、混音、合成、质检,
audit.py的 flagged 必须是 0。
常用命令
| 需求 | 命令 |
|---|---|
| 渲关键帧 | python3 -c "import json;print(' '.join(str(f) for _,f in json.load(open('keyframes.json'))))" | xargs node render.mjs stills stills/k1 |
| 审片拼图 | python3 <skill>/scripts/sheet.py stills/k1 keyframes.json 6 |
| 整片 | bash <skill>/scripts/render_chunks.sh video.mp4 |
| 混音 | python3 <skill>/scripts/mix_audio.py timeline.json mix_raw.wav |
| 合成 | bash <skill>/scripts/finalize.sh video.mp4 mix_raw.wav final.mp4 |
| 逐帧质检 | python3 <skill>/scripts/audit.py video.mp4 72 |
| 手机版 | ffmpeg -i final.mp4 -c:v libx264 -crf 23 -preset medium -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart final_phone.mp4 |
审片清单
- 主体够大或被边缘裁切,四周没有大片空白。
- 当前讲到的项最亮,镜头在它附近。
- 一帧最多 2 个标签。
- 字幕区(屏幕 y 905 到 960)、画中画、台标和 AI 标注没挡住任何东西。
- 没有方框字、竖排断词或溢出卡片的字。
- 数字和原文与事实文件一致,有来源行,CC BY 照片有署名。
- 白纸场景和深色场景交替。
- 遮住道具和背景只看骨架,和别的选题有区别。
已知陷阱
- 关键词在句首时
S.k(词, -0.3)会早于片段起点,用max(S.t0, …)截住。 - 图片路径不存在时那一帧渲染失败(
Error loading image),先ls public/<路径>。 - zsh 不按空格拆分变量,
node render.mjs stills out $FR会报Frame NaN,写${=FR}或用xargs。 - 静帧正常不代表视频正常,整片后必须跑
audit.py。 web_shot.mjs并行拍多个页面时每个进程用不同的--port。
输出格式
成片:final.mp4(1920×1080,24 帧,时长 mm:ss),手机版:final_phone.mp4
主题:<theme> · 场景数:N · 审片轮数:N · audit flagged:0
事实文件:facts.md(每条带编号、原文、来源和日期)
没查到、已改写台词的地方:……
一句话
先定画法再写分镜,数字都要有出处,标注永远保留。配套教程:让 AI Agent 给你的口播配上会动的图表。

评论(0)
还没有评论,来说第一句。