Communitygithub.com

scrapbook-editor

将原始垂直(9:16)视频片段剪辑成完整的SCRAPBOOK风格短视频,严格复现已验证的设计参考(用户于2026-10-05确认),精确到每一处停顿消除、跳跃剪辑、字幕样式、标题双字体、手写纸片、反应GIF、贴纸等细节。

scrapbook-editor 是什么?

该技能(scrapbook-editor)专为AI代理设计,可将用户自拍的垂直视频片段自动转化为具有独特“剪贴簿”风格的短视频。其核心是严格复现一个已验证的设计参考(由用户在2026-10-05确认并保存在`workspace/videos/scrapbook-dev-sales.mp4`),任何新输入的视频都将采用完全相同的版式、字体、动画、音效和色彩方案。技能基于short-editor引擎运行,继承了后者的转录、渲染、混音、预览和验证流程。它自动进行一系列精细的编辑操作:精确测量并消除所有长于0.16秒的停顿(使用跳跃剪辑,并自动在宽景和特写间交替),以匹配参考的密度(每1-3秒画面变化一次)。字幕采用低置、三词一批的方式,当前正在说的词以黄色高亮显示。片头钩子使用双字体(白色Archivo,关键内容用黄色Fraunces)并配以线条。特定标题和关键词显示在手写纸片(Gochi Hand字体)上,并伴有纸片飞入/展开/折叠的动画,同时红色马克笔会实时画出删除线或下划线。当说话者列举事物时,技能会为列举项添加带有白色轮廓的贴纸,并将来自GIPHY的真实反应GIF以拍立得形式(占屏幕宽度的80%)固定在屏幕中央,然后以动画方式移除。整个视频配有背景音乐和每个元素出现时的音效,共同营造出统一、动态且经过打磨的最终效果。

兼容平台✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/ihsaneGTM/gtm-skills/tree/main/plugins/video/skills/scrapbook-editor

在你喜欢的 AI 中提问

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

文档

scrapbook-editor:将原始片段变为剪贴簿风格短视频

用户提供一个他们自己在说话的垂直拍摄片段。此技能会剪掉其中的所有停顿,然后将画面变成一个说话者在其中讲述的剪贴簿,其剪辑方式如同动态设计师在After Effects中操作一样:参考中的标题使用双字体(白色文字,重要文字用彩色美观衬线字体,并有一条线在纸上),钩子部分配有贴纸,网络上的反应梗以拍立得形式落在说话者脸上,只有标题和非常重要的词语使用纸片,说话时红色马克笔在绘制,列举的东西有对应贴纸,提到的真实屏幕有截图,字幕以单词为单位低置在画面中,配有背景音乐,以及每个元素落下时的音效。

该风格已验证(用户,2026-10-05):请精确复现。 § 剪贴簿语言(详见下方流程)是已验证剪辑的外观(workspace/videos/scrapbook-dev-sales.mp4,其计划:example/plan.mjs):在任意片段上,使用相同的图形、相同的大小和位置、相同的字体、纸张、动画、音效和音量。它始于对一个真实剪辑的量化(一个72.7秒的列表视频,「7个Claude技能」,由用户为客户编辑:example/README.md是其完整解剖),并经过六次审查才最终确定(§ 用户的决策)。init.sh为其搭建框架;绝不要发明另一种外观,也不要对用户未要求改变的任何部分进行改动。

该技能运行在short-editor技能引擎上。 其转录、渲染、混音、预览、构建和验证均使用相同文件:请阅读../short-editor/SKILL.md § 前提条件、§ 文件位置以及§ 4至§ 6一次;这些内容照常适用,本文件仅说明差异部分。在首次剪辑前及每次运行时阅读:

  • scripts/example/README.md:参考编辑,逐拍分析,以及开发剪辑版本
  • ../../references/pitfalls.md § 转录和字幕,§ 工作方法:编辑中存在的陷阱(其他章节在相关步骤出现时阅读:§ 音频(在手动测量声音之前),§ ffmpeg 和 § Shell(在编写自己的命令之前);引擎工具遵循其余部分)

在需要该步骤时阅读:../../references/audio-spec.md 关于电平(响度标准,如何测量听到的电平)。引擎的数据:node plugins/video/skills/short-editor/scripts/api.mjs <模块> [数据],绝不使用其原始来源。

我无法观看视频或收听音频。 停顿位置、人脸位置、声音落下的响度:每一项都是测量结果(tighten.py、face.mjs、measure.mjs),然后查看合成帧(preview.mjs)以及逐帧运动的瞬间(build.sh --slice)。verify.mjs 介于「准备就绪」和有问题的文件之间,绝不要跳过它。

以下所有路径均相对于GTM by Pipecorn文件夹的根目录。$K 表示 plugins/video/skills/scrapbook-editor/scripts(本技能),$E 表示 plugins/video/skills/short-editor/scripts(引擎)。请使用它们的绝对路径运行。

前提条件(飞行前检查:在任何工作开始前检查)

引擎的要求:ffmpeg + ffprobe 在PATH上(brew install ffmpeg)和 python3(Xcode命令行工具)是必需的,且无法从此处安装;如果缺少,请停止并告知需要运行的命令。其他所有内容会自动配置:$K/py.sh 运行引擎的 bootstrap.mjs(node包,语音转文本的venv及numpy);init.sh 将三种字体(Archivo、Fraunces和纸张的手写体,默认为Gochi Hand:Google Fonts,OFL)获取到项目的 assets/fonts/ 中(或在 ~/Library/Fonts 中查找),sounds.mjs 获取纸张音效(八个Mixkit录音,每台机器执行一次,放入 plugins/video/assets/sfx/paper/,永不上传:Mixkit许可允许在视频中使用它们,但不允许重新分发),准备并计量后放入项目的 assets/sfx-paper/,并将Motionix包从资源库(plugins/video/assets/sfx/motionix/,由讲解员风格准备;包中未声明许可:在任何发布前阅读其README)复制到 assets/sfx-motionix/。不会进行任何系统级安装。

可选项,并在缺失时提示(不阻止流程):

  • swiftc(Xcode命令行工具):face.mjs 使用Apple Vision查找人脸,因此拍立得可以落在人脸上,贴纸可以围绕头部放置。如果没有,则在预览帧上读取人脸并设置project.json中的 face({x, y, w, h},以帧的分数表示)。
  • .env.local 中的 GIPHY_API_KEY:已验证风格的真实反应GIF(gif.mjs)。免费:developers.giphy.com → 创建应用 → API(不是GIPHY推荐的SDK:SDK用于显示GIPHY自有选择器的应用;gif.mjs 调用API),每小时100次调用,足以完成一次编辑。如果没有:则使用用户提供的GIF(media.mjs),或生成的反应图片;请告知。
  • .env.local 中的 GEMINI_API_KEY:生成插图和反应图片(picture.mjs,Nano Banana 2,每张约0.07美元,1K分辨率)。
  • 在/Applications中的Google Chrome(或Chromium、Brave、Edge):用于截取说话者提到的PUBLIC页面截图(capture.mjs),当用户没有自己的截图时。

文件位置

遵循引擎的规定,并且只能这样:每个编辑有一个工作目录,即 workspace/projects/<slug>/,slug不能与任何其他项目重复;完成文件位于 workspace/videos/<slug>.mp4;即使是同一片段,也不得使用其他项目的文件;临时文件放在项目的 tmp/ 中,而不是 /tmp。技能的 scripts/ 目录保持只读。编辑的图片存放在其 assets/media/ 中。

流程

0. 设置工作目录

$K/init.sh workspace/projects/<slug> <source.mp4> workspace/videos/<slug>.mp4

引擎的脚手架(从文件读取project.json、subs.config.json、cut.mjs),然后是本技能的 plan.mjs 和 edl.mjs(语言的每一个图形,已注释,准备好填写)、project.json中的语言键(style: "scrapbook"、accent、captionKeep)、人脸以及音效,根据此来源的声音进行校准(voiceM,声音的瞬时中位数,以及 sfxMasterDb 为0:然后每个角色在LU中设置在声音下方,如同听到的那样)。此后从该目录中运行所有命令。

0.2. 首先一次性提问所有问题

以下内容属于用户,无法猜测;将它们合并为一个 AskUserQuestion:

  • 音乐。 默认使用背景音乐(第三次审查:「它值得添加背景音乐」):首先提供 Hip Hop 02(Mixkit,Lily J:已验证剪辑使用的,该风格的默认选项;Mixkit许可允许在发布的视频中使用),然后是 Convergence(其他风格的常用曲目),以及其他可用曲目(plugins/video/assets/music/,其README),最后是「无音乐」。为了通过听觉选择,提供一个试听板(每个曲目相同的12秒,所有曲目在同一电平):在构建后运行 node $K/music-board.mjs --to 12 mixkit-hip-hop-02-738.mp3@0 [email protected] …(它会在结束后将项目自己的背景音乐恢复回去)。它将置于声音以下15 LU($K/music.mjs,§ 外观)。请告知一次,非Mixkit曲目(Convergence、ridgeclub)可能会阻止视频的货币化。
  • 品牌颜色(project.json中的 accent;如果重要词语的颜色应不同,则使用 wordColor;如果已设置,则为您的品牌的强调色,workspace/brand/,参见 plugins/video/references/brand-kit.md § 您的品牌,设置一次):Fraunces中的THE重要词语和正在说的字幕词语。默认使用黄色 #FFD43B(Pipecorn的颜色)。在片段上检查:它需要能在头发、皮肤和墙壁上清晰可见(在开发片段上,珊瑚色和橙色在说话者的头发和脸上消失了,而黄色到处都能读出)。以及字幕必须按原样书写的名称(captionKeep:品牌、产品、人名、「Station F」)。
  • 真实素材:他们提到的事物(他们的产品、仓库、页面)的截图或屏幕录制,他们的Logo。如果没有,则截取公开页面(capture.mjs);绝不虚构私密屏幕。
  • Pipecorn通用结尾:每个风格的BONUS,每次都问,默认不开启(plugins/video/references/pipecorn-generic.md):大约6秒,在视频最末尾,显示Pipecorn,然后其值在一个槽位中依次替换,再次显示Pipecorn,无音乐。不 · 是,并说明使用哪些值(1到4;node $E/generic.mjs --list;默认为手机覆盖范围、连接率、管线)。
  • 让您的声音更好听:BONUS,每次都问,默认不开启(plugins/video/references/voice-clean.md):ElevenLabs的声音隔离器可消除片段中的房间回声和噪音。不 · 是,让我声音更好听。它需要ElevenLabs连接器:如果没有密钥,请在一行中说明其存在(设置 › 连接器 › 添加密钥)并继续。如果回答是,则在步骤1之前运行:node plugins/video/motion/voice.mjs clean <source>,然后将project.json中的 source 改为 <…>-voice.<ext>(相同长度,画面不变)。

从GTM by Pipecorn页面运行,第一条消息的简短回答即可;不要重复提问。

1. 逐字转录

$E/transcribe.sh --lang en      # 实际使用的语言;绝不翻译

生成 words.json,基于RAW片段时间轴。如果片段是连续多次尝试的同一句话,则先使用引擎的 rough-cut.mjs(short-editor/SKILL.md § 0.7)进行组装,然后转录组装结果。然后运行 node $E/words.mjs(引擎的):生成 words-fixed.json,每个词的起始点移出静音区,精确落在声音开始处,并确定其在停顿前的真实结束点,列出有疑问的词;使用 words.mjs env|end|say 读取单个词(short-editor/SKILL.md § 1)。绝不要为此编写自己的脚本。

2. 剪掉所有停顿:跳跃剪辑

$K/py.sh tighten.py --dry-run    # 显示将剪掉哪些部分
$K/py.sh tighten.py              # source/tight.mov;project.json, words.json, shots.json 重新指向
$K/py.sh tighten.py --keep 0.10 --min-pause 0.16    # 默认值,根据参考测量

所有0.16秒或更长的静音都会被剪掉,连接处保留0.10秒(上一个声音结束后0.06秒,下一个声音开始前0.04秒);开头的静音和结尾的静音也会被剪掉。在参考中,没有剩余的停顿超过0.32秒,并且连接大约每2到3秒出现一次:说话者从不在屏幕上呼吸。每个连接处都是一个跳跃剪辑:没有闪白或呼啸声来掩饰它;镜头通过在剪辑点上交替宽景/特写来标记它(§ 外观)。

语音停止的位置是测量出来的(10毫秒包络,迟滞设置为室内+12 / 室内+5 dB),绝不通过Whisper读取。Whisper的起始点会与此对比:如果一个起始点位于测量出的静音区内,且下方有微弱声音(室内+9 dB),则在它之前50毫秒处停止剪辑;如果起始点处于室内环境音中,则是Whisper提前了(在开发片段上曾出现过三次,提前了0.35秒),并会将其移动到语音实际开始的位置。它会报告这两种情况。

保留的片段一次性写入 source/tight.mov,使用整帧(每个片段的画面和语音持续时间精确对齐:未捕捉时,13个连接点曾导致嘴唇滞后于语音两帧),保持原始源的位深度和颜色标签(绝不重新调色)。然后,如同引擎的 rough-cut.mjs --adopt 所做的那样,project.json指向它(source;原始片段保留在 rawSource 中),words.json 重新对齐到它的时间轴(原始片段的转录保留在 words.raw.json 中),shots.json 列出连接点之间的镜头。不使用引擎的即时 cuts:包含剪辑的项目无法通过切片渲染,而切片是观察运动瞬间的方式。tighten.py 始终从原始片段重新开始,因此运行两次是安全的;如果说话者希望保留某个剪辑(重拍、口误),则将其放入 project.json 的 manualCuts(片段中的秒数),然后再次运行 tighten.py。

片段内部的场景变化(结尾的预告镜头、另一个房间)不在 shots.json 中:通过查找画面亮度的跳跃(ffmpeg … signalstats 逐帧YAVG)来找到它,并将其提供给计划(SCENE):此时镜头变宽,纸张效果将其扫入画面。

3. 人脸位置

node $K/face.mjs      # assets/faces.json,每秒5帧,在输出时间轴上

使用Apple Vision,跨过剪辑点。计划通过镜头读取它(faces(P, camera(STEPS))):F.slot() 是视频中每个拍立得照片落下的位置(帧的中心线,在脸部中位线中心下方0.08处,0.44-0.50:屏幕中间),F.faceLine() 是脸部自身的线(其中位线中心,0.36-0.50)用于覆盖在脸上的关键思想和关键短语,F.top(t) 是头部上方的高度用于关键词,F.around(t0, t1, n) 是围绕头部的点,F.over(t0, t1) 是脸部的框。在每次执行 tighten.py 后再次运行它。

4. 阅读转录并决定图片:判断步骤

阅读整个片段,并赋予其与参考相同的密度:屏幕上每1-3秒出现一个新事物(参考:在72.7秒内有50个图形;开发剪辑:在47.1秒内有49个)。对于每个句子,从§ 外观中选择能表达它的图形:

  • 钩子(第一句):参考中的三行标题(一条白线;承诺的THE词用彩色,旁边是白色文字;纸上一条线),如果句子列举或暗示角色、工具、团队,则在头部周围放置贴纸;
  • 感受、成本、失败、夸张、比较:使用真实反应GIF作为拍立得(已验证剪辑中:Pepe Silvia用于「在数千个平台中搜索」,Key & Peele冒汗用于「坦白说,我不是最好的」,Buddy the Elf打电话用于「在电话里说什么」,「我们准备好战斗吧」用于「对决」),其字幕位于下巴位置,一个短视频中放置四到五个;
  • 随口列举(「好的、坏的、失败的…」)和旁白(地点、「系列」、「敬请期待」):使用贴纸,每个词一个(纸张并非用于每个关键词:字幕已经说出了词语,「l'effet papier doit rester PAPER pour les titres et les phrases clés seulement」,参见之前的参考决策);
  • 说话者提到的真实屏幕(他们的产品、仓库、推文):截图(用户提供的或 capture.mjs 截取的),作为拍立得,带有GIF的相同动画;
  • 数字和统计数据:大号数字,用Fraunces字体,动画效果为从下往上滑入,位于 F.around() 的一个点上;
  • 「比如」和「例如」:一个生成的插图,显示一个示例场景(使用 picture.mjs,Nano Banana 2),作为拍立得;
  • 每一个正在被说的重要词,或者至少是该句的核心词:以黄色(wordColor,来自§ 0.2 的问题)高亮显示的字幕(§ 外观,字幕),放在下巴位置;
  • 每一件被列举的事物都有一个对应的贴纸(sticker.mjs),带有白色轮廓,围绕头部放置;
  • 每一次纸张效果(标题或关键短语)都使用Gochi Hand字体,动画为展开/呼吸/折叠,并伴有红色马克笔绘图(draw.mjs)。

绝不要在一个句子中使用超过两个图形,除非是列举;绝不要为纯功能和过渡性的词语(「并且」、「所以」、「但是」、「那么」、「因此」)使用纸张;绝不要跳过钩子。使用 plan.mjs 来记录您在每个时间点放置的内容:plan.mjs 的格式是 { start, end, type, content, options },其中 type 是来自§ 外观的图形名称,content 是文本或文件名,options 是特定类型所需的任何额外设置。在构建之前,在 preview.mjs 中检查计划。

5. 构建编辑

node $K/build.mjs    # 从 plan.mjs 和 edl.mjs 构建 EDL
$E/render.mjs        # 渲染最终视频
$E/mix.mjs           # 混音
$E/mux.mjs           # 封装为最终文件

构建过程从 plan.mjs 生成EDL(编辑决策列表),然后渲染每个图形(纸张、贴纸、拍立得、字幕等)作为单独的图层,合成到背景视频上,添加音乐和音效,并最终封装为带有所需编码和格式的MP4文件。render.mjs、mix.mjs 和 mux.mjs 是引擎的一部分,但使用本技能 scripts/ 中的配置文件。在构建过程中,会创建 tmp/ 目录用于存放中间文件,并在构建完成后清理。

6. 验证

$E/verify.mjs workspace/videos/<slug>.mp4   # 运行所有验证检查

验证检查会确保:

  • 没有帧缺失或损坏
  • 音频与视频同步
  • 图形位置和大小符合参考
  • 字幕时间正确且单词高亮与声音同步
  • 音效电平符合规范
  • 最终文件的编码和格式正确

如果验证失败,它会报告具体问题;绝不要跳过验证步骤。

7. 预览和交付

open workspace/videos/<slug>.mp4    # 在默认播放器中打开

向用户展示最终结果,并询问是否需要任何修改。如果用户请求修改,请更新 plan.mjs 或 project.json 中的相应设置,然后从步骤4或5重新开始,具体取决于修改的性质。一旦用户批准,视频即可交付。

外观

此部分定义了剪贴簿语言中每种图形的确切外观、大小、位置和动画。所有值都是相对于帧尺寸的分数,除非另有说明。

通用参数

  • 帧尺寸:1080 x 1920(9:16垂直)
  • 安全区域:内容应保持在帧的0.9倍以内(边缘留50像素余量)
  • 背景颜色:取自视频帧(无叠加背景)

字体

  • Archivo:用于标题中的普通单词,白色,粗体(700),约0.06倍帧宽
  • Fraunces:用于标题中的重要单词,黄色(#FFD43B),光学尺寸,粗体(700),约0.08倍帧宽
  • Gochi Hand:用于纸张效果,黑色,约0.05倍帧宽
  • 字幕字体:Archivo,白色,粗体,约0.04倍帧宽,带黑色描边

拍立得(反应GIF)

  • 大小:帧宽的0.80倍(864像素宽)
  • 位置:屏幕中央垂直居中(Y坐标0.5,基于 F.slot() 的人脸中心线)
  • 进入动画:从上方掉落,轻微弹性效果
  • 离开动画:向侧面或上方快速甩出
  • 持续时间:1.5到3秒
  • 边框:白色边框,类似拍立得照片
  • 阴影:轻微阴影

纸张效果

  • 字体:Gochi Hand
  • 大小:根据内容调整,约0.07倍帧宽
  • 位置:对于标题,在屏幕顶部;对于关键短语,在 F.faceLine() 或 F.top(t) 处
  • 进入动画:从屏幕外飞入,展开并微微「呼吸」
  • 离开动画:折叠并飞走
  • 绘图:红色马克笔,在说话过程中实时绘制(draw.mjs)
    • 删除线:绘制在已写出并正在被否定的词语上
    • 下划线:绘制在正在被强调的词语下方
  • 背景:小白纸片,略大于文字,有轻微的纹理滚动效果

贴纸

  • 来源:sticker.mjs(从表情符号列表生成)
  • 大小:约0.1倍帧宽
  • 位置:使用 F.around(t0, t1, n) 放置在头部周围
  • 白色轮廓:任何表情符号周围都有3像素的白色描边
  • 动画:淡入,轻微摆动

字幕

  • 位置:帧底部,从下到上约0.1倍帧高
  • 样式:三词一批,居中对齐
  • 颜色:白色,带黑色描边
  • 高亮:正在说的词以黄色(wordColor,通常为 #FFD43B)显示
  • 字体:Archivo,粗体(700)
  • 大小:约0.04倍帧宽
  • 时间:与WERDS.json中的单词结束时间精确同步

标题(钩子)

  • 行1:白色文字,Archivo,粗体,0.06倍帧宽,居中对齐
  • 行2:相同,但重要单词以Fraunces字体、黄色显示
  • 行3:相同,但单词之间有一条水平线
  • 位置:屏幕中央偏上,约Y=0.3
  • 进入动画:文字从上方或下方滑入,线条慢慢绘制
  • 背景:简朴,无纸片(纸张仅用于标题和重要短语)

屏幕截图(捕捉)

  • 来源:capture.mjs(使用Chrome截图),或用户提供
  • 大小:帧宽的0.80倍(与拍立得相同),保持宽高比
  • 位置:屏幕中央,与拍立得相同位置
  • 边框:白色边框,类似拍立得
  • 动画:与反应GIF相同的落下/甩出动画

插图

  • 来源:picture.mjs(使用Gemini API生成)
  • 大小:帧宽的0.80倍(与拍立得相同),保持宽高比
  • 位置:屏幕中央,与拍立得相同位置
  • 边框:白色边框,类似拍立得
  • 动画:与反应GIF相同的落下/甩出动画

数字

  • 字体:Fraunces
  • 颜色:黄色(#FFD43B)或白色
  • 大小:根据数字长度调整,约0.12倍帧宽
  • 位置:使用 F.around() 放置在头部附近
  • 动画:从下往上滑入

用户的决策

以下是导致当前风格的用户的决策记录。绝不要更改这些决策。

  1. 2026-09-28:第一次审查。初始建议(慢速缩放,交叉溶解)。用户声明想要跳跃剪辑,就像参考一样。
  2. 2026-10-02:第二次审查。实施了跳跃剪辑,但用户表示它们「不够快」。将最小停顿从0.32秒减少到0.16秒,添加了宽景/特写交替。
  3. 2026-10-04:第三次审查。跳跃剪辑现在没问题了,但整体感觉过于「平淡」。用户要求背景音乐。添加了Hip Hop 02。
  4. 2026-10-05:第四次审查。背景音乐很好,但用户想要「更多活力」。添加了:反应GIF作为拍立得,贴纸围绕头部,纸张效果用于标题和关键短语,红色马克笔绘图,以及每个元素的音效。
  5. 2026-10-05(晚些时候):第五次审查。用户批准了图形语言,但指出黄色在某些头发颜色下难以辨认。测试了珊瑚色(在头发中丢失)、橙色(在面部高光中丢失)和黄色(在大多数情况下可读)。默认设置为黄色 #FFD43B。
  6. 2026-10-05(更晚些时候):第六次和最终审查。用户批准了当前状态下的视频。它被保存为 workspace/videos/scrapbook-dev-sales.mp4,其计划在 example/ 目录中,成为所有未来编辑的参考。

故障排除

字体缺失

  • 运行 $K/init.sh 以获取字体到项目的 assets/fonts/ 中
  • 或者手动将Google Fonts(Archivo、Fraunces、Gochi Hand)安装到 ~/Library/Fonts/ 中

人脸检测失败

  • 确保 swiftc 可用(Xcode命令行工具)
  • 如果不可用,手动运行 node $K/face.mjs 并检查预览帧
  • 在project.json中手动设置 face 值

GIPHY API限制

  • 免费层:每小时100次调用
  • 如果超出限制,使用用户提供的GIF或生成的插图
  • 考虑在.env.local中保存API密钥

构建失败

  • 检查 tmp/ 目录中的日志文件以获取错误详细信息
  • 验证 plan.mjs 和 edl.mjs 的格式
  • 确保所有资源文件存在(字体、音效、媒体)
  • 尝试使用 $E/render.mjs --debug 进行调试输出

验证失败

  • 阅读 verify.mjs 的输出消息
  • 常见的失败:同步问题(重新运行 tighten.py),缺少帧(检查源文件完整性),编解码器错误(确保ffmpeg已更新)

示例和参考

许可和归属

  • 字体:Archivo、Fraunces、Gochi Hand → Google Fonts,OFL许可
  • 音效:Mixkit(Mixkit许可,允许在视频中使用,不允许重新分发)
  • Motionix包:未声明许可,在发布前阅读其README
  • 背景音乐:Mixkit Hip Hop 02(Mixkit许可),Convergence(其他来源,可能影响货币化)
  • GIPHY:通过API调用,受GIPHY服务条款约束
  • Gemini:通过API调用,按使用付费

注意:在商业使用中,请确保遵守所有第三方资源的许可条款。

更新和版本

  • 2026-10-05:风格最终确定。本SKILL.md反映了发布的版本。
  • 2026-10-04:添加了背景音乐。
  • 2026-10-02:改进了跳跃剪辑算法。
  • 2026-09-28:初始创建。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相关技能