读一个好例子,学一种写法01 / 18
好 Skill 怎么写
从鸭哥 opus-video-audio-skill 的具体选择,拆出值得学的写法。
他没有只写
“请把视频做好”。
这个仓库有画面与配乐两个入口。说明、脚本、公共库、示例和测试一起承接制作经验。
看具体做法背后的设计理由,学会把经验写成执行者能用、能验证的约定。
案例:grapeot / opus-video-audio-skill ↗ · 固定快照 f952e327
具体怎样写,为什么有效
这份图解的对象是“Skill 的写法”。每一页都从鸭哥原文里的一个选择或操作出发,解释它改变了什么行为、为何有用,再抽出我们编写 Skill 时可以借鉴的原则。它不是视频制作教程,也不按仓库目录逐文件介绍。
这里的“Skill”指给 Agent 的任务说明与配套资源。鸭哥这个仓库同时包含画面、配乐两个入口,以及参考文档、辅助脚本、公共库、示例和测试。值得研究的是这些部分如何相互配合,让可靠性不只依赖一句提示词。
全文基于公开项目的固定提交 f952e3273cc72c444d4ed9fe7b282998d2f79226。事实就近链接到原文,写法原则是本文归纳。界面里的计算或状态变化会标注为示意,不冒充作者的实测结果。
01 · 入口写什么02 / 18
他连“只是缩放十秒”也写进触发条件
description 不只列任务名称,还点出执行者容易低估的情况。
用代码生成帧并合成 MP4。
镜头要推进、平移或重新取景。
即使只是“把这张图放大十秒”,也要考虑调用。
紧接着解释:曝光规律写反、主体出框、误看旧帧,可能悄悄耗掉整轮渲染。告诉宿主何时找到它。
堵住“这很简单,不必读”的判断漏洞。
把触发范围与具体失败代价连起来。
入口应帮助识别任务与风险。宽泛的“遇到相关任务就用”不如写出容易错过的触发场景。
原文依据:description ↗
具体怎样写,为什么有效
这个 description 的用意很明确:它不是只写“用于制作视频”,而是枚举程序化渲染、镜头变化、发光叠加和具体画面症状。这样,执行者既可能从任务类型找到它,也可能在出现问题时找到它。
最值得细读的是那个看似琐碎的“只缩放十秒”。作者紧跟着说明,小任务也有静默失败,而且失败会浪费完整渲染。这比无理由地扩大调用范围更有说服力:执行者知道为什么这个场景值得读取规则。
可以借鉴“触发线索 + 被低估的情形 + 不读会怎样”。但原 description 很长,不意味着越长越好。哪些触发信息应留在入口,要结合宿主的发现机制与上下文成本决定;具体制作细节可以放正文。
02 · 能力边界如何写03 / 18
“不能听音频”,为什么放在最前面?
它随后改变了工具选择、检查方式和交付措辞,形成一条完整约束链。
这条工作流不能试听
不声称声音“温暖”或“好听”。
反馈来自可测量的输出。
偏向输入可控的路径
精确卡点用 MIDI,
测量嵌入辅助脚本。
报告测到了什么
时长、峰值、包络是否符合。
乐器听感交给人判断。
边界不是末尾免责声明。写出它对方法、验证和承诺分别有什么影响。
原文依据:约束如何改变工程 ↗
具体怎样写,为什么有效
普通写法可能是最后补一句“音频未经试听”。鸭哥的写法更深入:先说明缺少听觉反馈,再推导出不要依赖反复试听调节的方法,优先选择能从输入预测输出结构的路径。因此,测量不再是可选收尾,而进入辅助脚本。
他还约束最终语言:可以说“10.00 秒”“无削波”“稀疏开场与 6 秒处增强符合要求”,不能由这些数字跳到“好听”。给出一条交付措辞示范,等于把抽象的诚实要求落实到最后一句话。
可学的是:写能力限制时,接着写“所以应改变什么”。需要保留边界:这是该工作流的能力假设,不是所有 Agent 永远不能听音;时长与包络也不能证明音乐审美。
03 · 让选择有依据04 / 18
他没有把 MIDI 写成唯一正确答案
决策点是音乐是否必须命中特定时刻,工具沿着这个条件分支。
画面在 6 秒揭示,音乐也要在那里变化。
逐个写音符的起点、力度与长度,让结构可控制。
另一分支:只追求氛围,或需要音色库做不到的音色时,可考虑生成 API,但要预期重新采样和试听。
写“在什么条件下选什么,为什么”。留下选择逻辑,比只留下工具名更耐用。
原文依据:生成还是合成 ↗
具体怎样写,为什么有效
原文不是先介绍一长串工具,再让执行者猜怎么选。它先给一个决定性问题:是否必须命中特定时间码。需要卡点时,用 MIDI 写明确的音符事件;只需要氛围或特殊音色时,考虑生成路径。
作者紧跟一个失败证据:要求“两下独立音符,6 秒进入低音弦乐”,某次生成结果的每秒 RMS 却从头到尾都很响。把同一分镜写成 MIDI 后,包络符合了设想。证据解释了选择,不是只靠“推荐”二字。
这里也要会挑着学。一次服务调用的失败,支持当时这条路线的取舍,不能证明所有生成模型永久无法控制时间。我们应继承决策条件与验证思路,更新具体工具的能力判断。
04 · 怎样写一条“必须”05 / 18
为什么他把裁时长写得这么重?
“必须加 -t”后面有完整因果,而不只是强硬语气。
MIDI 长度 10.00 秒
执行者可能以为:
渲染出的音频自然也是 10 秒。
混响与音符尾音继续衰减
原文测到 12.83 秒,
换音色库后为 13.25 秒。
明确裁到目标时长
合成命令使用 -t 10;
检查最终文件是否真的裁好。
-t 10针对“音频越过画面切点”这个失败机制,而不是为了命令整齐。强规则要给出触发原因、错误后果、具体操作与输出检查,执行者才知道什么不能省。
原文依据:裁时长与响度验证 ↗
具体怎样写,为什么有效
这段写法的关键,是先纠正一个直觉:输入的标称长度不等于输出的实际长度。fluidsynth 会继续输出尾音和混响,作者列出两次测量,让“为什么必须裁剪”变得具体。
接着,他对响度又作了类似区分:设置 loudnorm 目标不等于输出一定安全。原文记录一次目标设置后峰值仍到 1.092,因此最终峰值需要测。两段合在一起,教的是不要把“下了命令”当成“得到结果”。
可借鉴的句法是:工具实际会怎样 → 如果省略会坏在哪里 → 所以做这个动作 → 最后测这个结果。目标是让执行者理解规则适用的原因,不是把每个历史参数都写成永恒常量。
05 · 把一致性写进结构06 / 18
音画同步,为什么不靠两边分别填秒数?
最小示例让画面与配乐读取同一个事件,而事件来自运动计算。
真实源码由 solve_time 求出,
这里拖动数值观察依赖关系。
→
修改共同事件,两边一起变化。
不要分别从预览里估一个秒数。
多个产物依赖同一事实时,提供共同输入和推导关系,让同步不再是一条靠记忆执行的提醒。
原文依据:求出事件 ↗ · 配乐读取同一事件 ↗
具体怎样写,为什么有效
shot.py 先定义物体和相机运动,再用 solve_time 求出物体经过屏幕中线的时刻,存为 E.cross。画面闪光和竖琴音符都依赖这个事件。标题每个字出现的时刻、共同淡出的区间也放在共享时间线上。
注意这比“把秒数集中放一个文件”又多走一步:时刻来自运动关系。修改运动后可以重新求解,而不是让集中保存的旧秒数继续失效。这是一种写进架构的防错方式。
在 Skill 写作上,值得学的是提供能执行的组织方式,而不只说“确保音画同步”。示例恰好证明了这套方式怎么用。但共同来源只能减少分叉,源数据和求解关系本身仍需验证。
06 · 把错误提前算出来07 / 18
他为什么先算主体占多少像素?
“构图要合理”没有抓手;像素预算能在渲染前暴露拍不到的镜头。
主体角度 ÷ 视场角 × 画面高度
月亮角度 0.52°
画面高 1920 px
细节再精致,
也无法弥补主体太小。
但能同时容纳的景物越少。
主体要大、地面又装不下时,原文给出三条路:拆成两个焦段、把主体放到地平线附近,或调整需求。
把模糊质量要求转成能提前检查的量,并写出冲突时可选的修正方向。
原文依据:构图预检 ↗ · 数值按原公式复算,原文 11 px 算例有误
具体怎样写,为什么有效
鸭哥先让执行者计算主体在画面中的像素大小,再要求输出时间、视场角、主体尺寸和关键物体所在行的表。坐标出框,就是镜头不成立的具体证据,不必等整段渲染完再判断。
更重要的是,他没有只报告“不可能”。窄视场指向高处时,无法同时容纳地面,原文给出拆成两个焦段、把主体安排在地平线附近、调整需求等方向。好的 Skill 在指出限制后,还应给可行的下一步。
也要核对范本:按原文近似公式,0.52÷52×1920=19.2 像素,原文字例却写 11;3.1° 时约为 322.1 像素。此图使用复算值。这说明前置计算的方法值得学,但作者写出的数字仍然需要验证。此处是近似构图估算,不是通用精确投影模型。
07 · 把“高级”变成检查对象08 / 18
他怎样处理“技术没错,但很廉价”?
先确定概念与审美依据,再做最终质量的静帧,不急着渲染整片。
2–3 个概念
写画面、运动、感受和风险。
方向选择可能改变整个场景。
参考 → 评价标准
收集 8–12 个参考,
提炼 6–10 条具体标准。
开场 / 转折 / 结尾
先做 3 张最终质量静帧,
再进入动画与迭代。
主观要求也需要可观察的依据和低成本小样。流程应对准真实失败,数量不是通用定额。
原文依据:先定概念 ↗ · 参考、静帧与修改方向 ↗
具体怎样写,为什么有效
这部分来自一个明确失败:技术上干净的画面,仍然被认为俗套、廉价或单调。作者判断,继续调渲染参数解决不了“做错了影片方向”,于是把概念选择放在写渲染器之前。
他也没有停在“多找参考”。参考要提炼成具体评价标准和常见俗套;静帧要覆盖开场、转折和结尾,并达到最终质量;修改要优先改善材质与光,而不是靠增加元素制造忙碌感。每一步都有明确的判断对象。
写 Skill 时可借鉴“把主观词变成可观察依据,再用小样检验”。但 8–12 个参考、6–10 条标准、每轮审稿,是原制作场景的成本选择。风险较小、方向已确定的任务不必机械复制全部关卡;既有明确决定也应复用。
08 · 把审查写成接口09 / 18
critic 模板为什么比“帮我挑错”强?
他同时约束审查者能看什么、必须返回什么,以及下一轮怎样接上。
只看观众看得到的东西
评价标准 + 参考 + 带时间戳的关键帧。
不看作者代码与解释,避免被创作意图说服。
每项都要时间戳、位置和证据。
按影响排序,给具体画面修改。
最多 3 项优点,下一轮别改坏。
旧问题:已修 / 部分 / 未修。
委派说明要定义输入、输出和跨轮状态。审查才会积累证据,而不是每轮重新发表意见。
原文依据:完整 critic 模板 ↗
具体怎样写,为什么有效
这里最精彩的不只是“再叫一个 Agent”。作者让审查者脱离创作者的解释,只看观众可见画面与标准,减少作者用意图替代实际效果的倾向。模板还要求打开所有图片,必要时放大局部,并按最终观看尺寸判断。
输出的四部分各有作用:评分必须有证据,问题必须可定位、可修改,Protect 避免修坏已有优点,Re-check 让下一轮继承上一轮的问题清单。最后还限定建议应描述画面,不是泛泛地推荐工具或改流程。
我们写 Skill 时,应该学这种具体的协作接口,而不是简单加一句“交给专家审查”。独立审查有成本,也不保证审美结论正确;它的价值在于提供可复查的另一视角。
09 · 提醒何时变成工具10 / 18
他不再只说“别看错上一轮的帧”
旧图与新图同名,执行者很容易以为渲染已完成。保护落在了公共运行器里。
文件存在 ≠ 本轮生成
旧目录已有 f0120.png,
打开它可能仍是上一轮画面。
拒绝非空输出目录
每轮用新目录;
复用必须显式 --overwrite。
记录本轮起点
写入 run_start.txt,
用 --since 检查文件新鲜度。
--overwrite允许复用,但不会清空旧文件,所以新鲜度检查仍有必要。重复出现且可计算的错误,应尽量进入工具默认行为,让正确做法更容易发生。
具体怎样写,为什么有效
“确认拿到新帧”是一条正确但脆弱的提醒:文件名和数量都可能与上一轮相同。鸭哥把风险写进 runner 的默认行为,非空目录拒绝执行,除非显式要求覆盖;同时记录本次开始时间,供后续检查文件是否属于本轮。
这套设计没有假装一个开关能消除所有风险。--overwrite 不会删除旧文件,新一轮没有覆盖到的帧仍可能残留,因此还要检查时间。它把失败机制拆开,分别提供保护。
值得借鉴的是“文档解释原因,工具承担默认约束,检查提供证据”。如果一种错误反复发生,只往正文追加“务必注意”通常不足以改变结果。
10 · 检查如何影响结果11 / 18
配乐脚本为什么要返回失败?
他把验收嵌入 render,而不是只生成一个文件就宣布结束。
超过目标 0.1 秒容差,应提示检查 -t 裁剪。
等待查看通过说明这些技术检查未报错,不等于音乐好听,也不等于整个项目已经完成。
写清“检查什么、失败停在哪里、下一步改什么”。错误报告要能指导修复。
具体怎样写,为什么有效
脚本对三类失败给出不同反馈:削波建议降低增益或响度目标;时长不符提示检查裁剪;包络与分镜不符则要求改音符力度和起点,而不是乱调 loudnorm。这让检查结果直接指向错误层级。
非零返回值本身不能强迫所有调用者停下,调用流程仍须把它当作失败处理。但它提供了明确、可被程序消费的状态,比打印一句警告后正常结束更适合作为门槛。
细读实现也能防止过度总结:该脚本的 render 检查削波、时长与已配置分镜;measure 子命令仅因削波返回非零。不能因为文档写“会检查”就假定每个入口的行为都一样。
11 · 失败怎样提炼成原则12 / 18
四个“不同音色”,为什么都是同一个?
作者保留失败机制,再给两层修复:改变输入方式,核对实际输出。
频谱质心均为 722 Hz
替换 program_change 的文本模式没匹配到。
文件名字变了,实际还是同一钢琴。
compose.py --program 46score_cue.py fingerprint out/*.wav指纹只含少数特征:相同不等于文件完全相同,不同也不能确认目标乐器正确。
写出失败的机制,并分别保护“变化有没有执行”和“结果有没有变化”,不靠文件名证明完成。
原文依据:假 A/B 与两条修复 ↗
具体怎样写,为什么有效
作者记录的不只是“命令失败了”。更深的后果是,之前发给人试听的所谓颤音琴也可能一直是钢琴,已有反馈因而失去了可靠基础。这解释了为什么必须在让人比较之前确认差异。
参数化让变化成为显式输入,减少文本替换静默失败;指纹检查则防止“参数看起来改了,产物却没变”。两者分别保护意图与结果。Skill 写作的价值在于提炼这种可复发机制,而非记住当时用的是哪一个文本工具。
原文把相同指纹说得很确定,实践中应保留边界:时长、峰值、频谱质心是粗指纹,相同不严格等于文件完全相同,不同也不证明目标乐器正确。它适合抓明显的假变体,不能替代所有内容核验。
12 · 测量也可能欺骗人13 / 18
他连“验收工具”都加了回归样本
先混成单声道再测峰值,曾把正常双声道音频误判成削波。
双声道,峰值 0.84
构造可控的合成音频,
不是随便找一个文件。
score_cue.py measure
测试调用命令,
读取它真正输出的结果。
避免同一个误报再次出现。
关键教训应变成可重放的反例。检查器本身也要接受验证,不能因它叫“检查”就相信。
具体怎样写,为什么有效
上游解释了具体机制:相关双声道在特定混音路径中增大了幅度,结果测出 1.19 并误报削波。因此测量前不能简单降为单声道;文档还给出独立真峰值测量方式用于交叉核对。
修复没有只停在说明里。测试构造峰值 0.84 的双声道正弦波,调用真实 measure 命令,断言结果不含削波、包含正确峰值。一个已知会误杀的正常输入,成为以后防止复发的固定样本。
这里能学到三点:样本输入应有已知性质;测试要走真正可能出错的路径;断言对应那次失败,不笼统检查“命令成功”。测试能证明这一性质,并不能证明全部声音测量或听感都正确。
13 · 为什么拆成这些文档14 / 18
“什么时候读”,比文件列表更重要
入口保留共同规则,场景专属知识在相应决策点出现。
每轮都需要的规则
构图、合成、帧检查、输出。
再根据当前条件继续读取。
lookdev.md
narration.md
music_video.md
detail.md
分层要按决策时机组织,并写出触发条件。拆文件本身不会自动节省理解成本。
原文依据:Where to read next ↗ · 入口维护规则 ↗
具体怎样写,为什么有效
鸭哥的路由表不是裸文件列表。它在 When 一列写任务条件、失败症状与所需能力。例如 lookdev 既在开工前触发,也在画面被评价为俗套或单调时触发;detail 则对应细节跨尺度显示的问题。
维护规则进一步要求入口保持一遍能读完,新的专属主题进入相应分册,分册范围改变时也更新路由。由此可以看出作者在同时管理两个东西:知识存放位置,以及执行者到达知识的路径。
可借鉴的是“公共约束常驻,专属内容按需读”。不要把核心限制藏进无人知道要读的附件,也不要为了看起来模块化而把短 Skill 拆碎。
14 · 哪些经验值得沉淀成代码15 / 18
他刻意把公共库保持得很薄
复用的是多个影片近乎重复编写的基础能力,作品内容仍留在作品里。
反复出现的执行骨架
runner:预览、并行、输出目录
timeline:事件、相机、求时刻
typeset:字形与按时出现
内容可变
主体、着色与布局
这次拍什么、长什么样、如何构图。
不把一次作品的内容硬塞进公共默认值。
从真实重复中抽公共能力;用一个最小完整示例展示组合方式,避免把 Skill 写成制作日记。
原文依据:公共库与最小示例 ↗ · 维护边界 ↗
具体怎样写,为什么有效
作者没有把每部片子的主题、着色和布局都抽成一个万能框架。他给公共库设了进入条件:真实影片里几乎一样重写过的东西,才适合放进去。这能减少为想象中的复用过早增加抽象。
公共 runner 还有一个具体选择:预览与成片调用同一个 render_frame。只用 --frames 选择少量帧,而不是再写一份预览循环。这样不会验证了一套代码,交付另一套。
最小示例的作用是把说明、库、脚本接成一个可运行的整体。学习写 Skill 时,要留意这种“用法证明”:只列资源名称不够,读者还需要看到它们如何组合。示例应小而完整,不必代表所有作品风格。
15 · 缺依赖也能看出写作水平16 / 18
他把降级后的损失写了出来
没有工具时还能做什么、失去什么、用什么补救,都有对应关系。
鼓点仍可对齐;歌词沿用 LRC 时间
提示未校准,查看接触表并手调
这套自动分析不能运行,改用手敲节拍
交付时说明时间来自手动标记
改用 typeset 绘制字形遮罩
接受文字不再共用线条笔触
恢复策略要同时交代能力、代价和补救,避免悄悄降级后仍声称完整完成。
原文依据:Degraded modes ↗
具体怎样写,为什么有效
很多 Skill 的异常处理只剩“安装依赖”或“自行解决”。这段文字更具体:缺 demucs 不意味着所有分析都停下,但歌词不能再依赖分离的人声校准;缺 librosa 则这条分析路径不成立;缺单线字体,画面风格会发生可见变化。
每个替代方案都伴随损失与后续动作。这样,执行者能够判断替代结果是否还满足当前目标,用户也不会收到一个被悄悄缩水却宣称完整的产物。
写 Skill 时,不必穷举所有故障。优先覆盖实际遇到、会改变交付性质的分支。降级不能绕过必需条件;安装、外部写入与发布仍服从宿主和用户授权。
16 · 好经验也需要适用范围17 / 18
他让“记住的参数”重新变成假设
音色库一换,增益不能照抄;没实测的路径,也不能写成已验证。
稳定约束
不要把没听过的音频说成好听;关键输出需要验证。
保留为共同规则场景参数
不同音色库曾用 4.5 或 6 的增益,换库后重新测峰值。
给条件,不盲目复用未验证建议
图像模型制作概念帧的建议,被单独标为 untested。
不要伪装成经验结论把规则、参数、假设分开;标明证据范围,避免偶然成功变成未来任务的教条。
原文依据:增益不可直接迁移 ↗ · 未验证建议 ↗ · 维护纪律 ↗
具体怎样写,为什么有效
音频段落列出了用过的音色库与增益,但马上说明数字不通用:换库不测,可能很小声,也可能削波。它不是不提供经验值,而是把经验值连同失效条件一起提供。
作者还把“图像模型可做概念帧”标为未在该角色中验证,同时区分影片中的插图用法已实际用过。这样,执行者能分清实践结果和待试建议,不会因为它们出现在同一文件里就同等相信。
也应保持自己的判断。某些原文对工具能力和审美的措辞仍然很强,不能全部上升为通则。借鉴这份 Skill,既要学它如何建立证据,也要用同样标准复核它的数字、阈值和适用范围。
17 · 提炼成自己的写法18 / 18
从这份 Skill,抽出五个落笔动作
用已经读过的旧帧案例,示范一条规则怎样写完整。以下按原文重新组织。
每轮准备渲染画面时。
旧目录的同名文件,可能被误认成本轮结果。
默认使用新目录;复用要显式开启覆盖。
记录本轮起点,再用 --since 核对新鲜度。
有旧帧就先修复,不能把旧结果拿去审查。
值得学的不是一句更厉害的提示词,而是让执行、证据和经验更新互相接得上。
本文归纳 · 作者自己的维护约束 ↗ · 完整快照 ↗
具体怎样写,为什么有效
连成一条规则:每轮渲染默认使用新目录,因为旧目录中的同名文件可能让你误看上一轮结果。确需复用时显式开启覆盖,记录本轮开始时间,并用 --since 核对帧的新鲜度;未通过的旧帧不能当作本轮成果审查,应先重新生成并复验。此段是依据原实现重新组织的写法示范。
回看裁剪尾音、旧帧保护、假 A/B 和双声道误报,能看见相似的生长方式:真实任务暴露失败,作者解释机制,把稳定部分写成规则,再选择用文字、脚本、示例或测试承接它。不是每条经验都要同时具备全部形式,但每种形式都有自己的职责。
作者在维护规则里甚至明确要求:Skill 正文写可复用规则,不写影片日记;尽可能给现实检查,案例保持简短。这也是本页的落点:学到的是他如何把经验压成可执行知识,而非复制一次影片的每个操作。
你可以从自己一个反复失败的点开始:描述触发条件,查明机制,选择最合适的保护,再用真实任务检验。若规则只增加篇幅,没有改变行为或证据,就值得重写。
本页整理于 2026-09-28。基于公开 MIT 许可项目静态阅读,原则为本文分析,未声称代表作者完整观点,也未声称本轮运行了上游全部测试。交互图仅解释相关机制。