Communitygithub.com

高棉货币解说器

制作一个8-10分钟的横向高棉语解说视频,涉及现实生活中的金融决策,采用干净温暖的简笔画风格,使用 Remotion 渲染,并通过 KiriTTS 配音。

高棉货币解说器 是什么?

该技能用于生成高棉语金融/商业解说视频,时长8-10分钟,格式为横向,采用独特的简笔画风格。视频通过对比两个人面临同一财务决策(如租房 vs 买房、省吃俭用 vs 债务、加盟 vs 自主品牌、互助会 vs 银行)的不同结果,进行算术计算,让观众自己得出结论。技能支持 Remotion 框架渲染和 KiriTTS 语音合成。核心流程包括:主题选择(需为柬埔寨受众熟悉的财务分岔路口,并有数据支持)、研究和计算(使用 Python 脚本,所有屏幕数字源自计算)、高棉语脚本编写(约7000-9000字符)、项目设置与预览、语音合成与时间线构建、最终渲染和交付。该技能遵守严格的规则:必须原创、诚实展示财务数据(标注假设和风险)、并包含非财务建议声明。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SopheaktraKP/khmer-money-explainer-skill/tree/HEAD

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

高棉货币解说器 是做什么的?

每期视频跟随两位普通人面对同样的金钱决策,进行公开的算术计算,让观众能够自行判断。观众为数字而留下,并信任频道,因为数字是诚实的。

工作示例是 templates/project/ 中的“互助会 vs 银行”视频(位于 src/story/)。

保护频道的规则

  • 仅限原创作品。 风格研究可以参考其他频道,但绝不要复制其剧本、角色、缩略图、标志或镜头,也不要在视频或描述中提及它们。我们的演员阵容、故事和视觉形象(包括佩戴格罗麻的向导)都是我们自己的。
  • 诚实的金钱。 在屏幕上显示假设条件。对双方都进行说明,包括看起来最好的选项的风险。给出需要提出的问题,而不是个人推荐。每个描述都以非财务建议声明结尾,并说明角色是虚构的。
  • 不要涉及真人。 指控特定个人或公司的欺诈行为不是本格式的职责。描述来自已报道案例的模式,并在描述中提供链接。
  • 消耗: 配音消耗 KiriTTS 积分:1100 字符的试播使用了 433 积分,因此一个 9 分钟的视频大约需要 3000-3500 积分。在配音前检查 get_usage,告知用户估算值,并先获得脚本批准。

工作流程

1. 主题

如果用户未提供主题,请建议 3 个主题,每个附一行说明。一个好的主题是一个每个柬埔寨人都能认识到的分岔路口,有可溯源的数字,并且有一个转折点,使得显而易见的答案错误或不完整。在建议前搜索当前的热点。

在开始时确定,仅询问未知信息:主题、配音(默认为 Maly;账户可能拥有克隆声音,请参阅 list_voices)和频道名称(story.tsx 中的 CHANNEL;留空隐藏徽章)。

2. 研究与计算

  • 尽可能使用柬埔寨主要来源:柬埔寨国家银行、国家统计局、银行利率表、律师事务所税务备注、知名新闻媒体。注意出版日期:利率和税收规则会变化。
  • 为当前主题重写 scripts/calc.py。屏幕和旁白中的每个数字都来源于此,并写入 src/story/numbers.json。添加健全性断言。运行多种情景,包括“赢家”失败的情景。
  • 区分已溯源和假设的事实,并在屏幕上用 <Note> 标记假设值。如果一个事实无法溯源,要么明确标记为假设,要么舍弃,并告知用户。

3. 脚本

大约 7000-9000 个高棉字符对应 8-10 分钟;试播的配音速度约为每秒 15 个字符。一个节拍是一到两句话,大约 70 个字符,因此一个 9 分钟的视频大约有 100-120 个节拍。阅读 references/script-formula.md 了解结构和高棉语书写规则。

将其写入 src/story/script.json(场景包含节拍;格式见下文),并向用户显示完整的高棉语脚本及其来源和假设。在配音前等待批准。 用户是高棉语措辞和术语的权威。

4. 设置项目

将 templates/project/ 复制到一个新文件夹,运行 npm install,然后替换 src/story/script.json、src/story/story.tsx 和 scripts/calc.py。除非添加可复用的内容,否则保留 src/engine/。使用短路径(参见注意事项)。

5. 视觉测试(在消耗积分前)

python scripts/calc.py
python scripts/build_timeline.py --placeholder
python scripts/check_numbers.py
npx tsc --noEmit
node scripts/stills.mjs out/look/x_ 100,400,900 0.5

自己查看帧,对照 references/visual-style.md 中的检查清单。配音后,每行检查两次,分别靠近其开始和结束位置:仅在结束位置截取的静帧会隐藏那些在配音逐步构建数字时空置的卡片。一次编写一个场景并逐一检查,因为现在修复布局问题的成本要低得多。

6. 配音

python scripts/tts_todo.py

此命令仅列出新增或更改的节拍。对每个节拍,使用一个一致的语音调用 KiriTTS 的 text_to_speech,参数为其 tts 字段(或 text),不设置交付参数。将 URL 下载到 voice/<id>.mp3(链接约一天后过期),并使用 python scripts/tts_todo.py --done <id> <speech_id> 记录。每个节拍一个片段意味着一个错词只需修复一句话。

单词级提示是可选的:将 get_word_timestamps 输出保存为 voice/<id>.words.json,然后使用 at('b03', 'word')。像 at('b03', .5) 这样的分数通常就足够了。听取数字、名称和外来词;如果 KiriTTS 读错了一个,为该节拍添加一个 tts 拼写。

7. 时间线、音频、渲染

python scripts/build_timeline.py
python scripts/make_audio.py
npx remotion render src/index.ts Main out/video.mp4 --codec h264 --crf 18 --muted
ffmpeg -y -i out/video.mp4 -i out/mix.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest out/final.mp4
python scripts/qa.py out/final.mp4 out/qa
npx remotion still src/index.ts Thumbnail out/thumb.png

长视频需要一些时间,因此在后台运行渲染。在用户审查全片之前,先渲染前几个场景的简短试播,如果画面或配音是新的。

8. 质量检查

阅读 out/qa/report.md,并查看每个接触表。检查黑屏或冻结帧以及响度远低于 -15 LUFS 的情况。确保屏幕上的每个数字与 numbers.json 匹配,并且没有高棉语文本被截断或重叠。

9. 交付

使用 SendUserFile 发送 mp4 和缩略图。同时用高棉语编写 out/description.md,包含:吸引人的钩子、包含假设、风险、自问自答问题、虚构角色和非财务建议声明的工作摘要、评论提示、来自 timeline.json 的带实际时间戳的章节、来源链接和话题标签。除非用户要求,否则绝不自行上传或发布。

script.json 格式

{ "gap": 0.3, "scene_gap": 0.7, "tail": 1.5,
  "scenes": [{ "id": "Hook", "chapter": 0, "music": "light", "beats": [
    { "id": "h1", "text": "高棉语句子", "tts": "可选的发音拼写", "sfx": [{"at": 0.75, "type": "coin"}] }
  ]}]}
  • id 场景必须与 story.tsx 中 SCENES 的组件匹配。
  • chapter 索引 CHAPTERS;0 是钩子,隐藏进度条。
  • music:light、tense 或 resolve。
  • sfx 类型:pop、whoosh、coin、cash、ding、thud、tick、paper、sad、tada、alarm。at 是节拍的一个分数。在揭示时使用它们,而不是每行都用。

编写场景

阅读 src/story/story.tsx:它是如何编写场景的参考。简而言之,const {f, at} = useScene() 提供了帧和节拍时间,每个元素通过 <Show at={...} out={...} x y> 进入。没有任何东西以秒为单位计时,因此重新配音永远不会破坏场景。

可用组件:

  • engine/Figure:面部、姿势、行走和手中的道具。在故事顶部为每个角色定义一次。
  • engine/Props:Title、Label、Chip、Tag、Bubble、ThoughtCloud、Jar、Coin、Bill、MoneyBag、Calendar、Bank、House、Stall、Notebook、Phone、Rock、Umbrella、StormCloud、CheckMark、VsBadge、Arrow、FlyingMoney、Note、Moto、NameChip。
  • engine/Charts:Card、Counter、Bars、LineChart、MonthGrid 和 money()。
  • engine/Stage:mood、tint、zoom、focus。

如果一个主题需要新的道具,以相同的墨线风格在故事文件中绘制它,如果可复用则移至 engine/Props.tsx。

注意事项(以下情况均发生过)

  • Windows 路径限制。 当项目路径过长,导致 node_modules 内部文件超过 260 个字符时,Remotion 会失败:静帧出现 Failed to launch the browser process / spawn ... chrome-headless-shell,完整渲染出现 getExecutableDir 错误。指向不同的浏览器无法解决第二个问题。将项目放在短路径下,例如 D:/videos/<名称>(约 100 个字符以内),并在该路径下运行 npm install。
  • 临时空间。 每个包都会复制到临时文件夹且不会被删除。如果 C: 盘空间紧张,为 stills.mjs 设置 RENDER_TMP,为 CLI 设置 TEMP/TMP 指向更大的驱动器。
  • <Show> 默认为 x=0,y=0,这会将居中的标题置于一半屏幕外。对于居中元素,始终传递 x={960}。
  • Koulen 的数字显示不佳("12" 看起来像 "I2")。Title 已在正文字体中设置了数字和符号;不要绕过它。
  • 面部上方的标签。 站立人物的头部大约达到 y=470,举起的双手更高。将标签放在人物上方 y≈300-350 处。
  • Remotion 使用 --muted 写入的音频不可用, 因此始终按所示方式随后合成 mix.wav。
  • Windows 上的某些 shell 可能无法解析包含大量 TSX 的 Bash heredoc。 使用文件工具写入源文件。

相关技能