关于 sound-effects
Sound effects 是用于动效视频配音的技能,面向 Claude Code 和 Codex 工作流。它按视频提示匹配授权音效,测量导出混音,并提供时间点供戴耳机复核。
主要功能
- 01将视频提示映射到音效类别
- 02使用内置和运行时音效库
- 03按视频用途核查许可证
- 04让剪辑和揭示画面对齐音乐节拍
- 05测量并检查导出音频
- 06生成提示检查图和来源清单
适用场景
- 01为动效剪辑添加音效
- 02让视频剪辑和揭示画面对齐音乐节拍
- 03发布视频前核查音效许可证
- 04检查导出文件的混音电平和提示时间
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ barty-bart/ motion-graphics --skill sound-effects安装后在 Claude Code 中输入/sound-effects确认已加载。
详细介绍
音效
Claude 听不到声音。因此,此技能绝不会凭感觉评判声音:它会测量每个步骤,并提供 5 个时间戳供用户戴上耳机检查。它绝不会说“听起来不错”。
此方法采用 Vox 的 sound-pass 提示词(@Voxyz_ai,https://x.com/Voxyz_ai/status/2109358372873183564,2026 年 10 月 11 日)。请保留此署名。
默认套件(先用这个)
sfx/manifest.json → default_kit:每个核心类别一种音效,由 Bart 凭听感挑选(2026 年 10 月 12 日)。除非用户另有要求,否则使用此套件。
| 类别 | 音效 | 来源 |
|---|---|---|
| 呼啸声 | qubodup 的 “Whoosh” | 随附的 sfx/kit/whoosh.ogg(CC0) |
| 点击声 | adh.dreaming 的 “Classic Click” | 随附的 sfx/kit/click.ogg(CC0) |
| 啵声 | ethernel0 的 “POP SFX Neutral” | 随附的 sfx/kit/pop.ogg(CC0) |
| 渐强音 | “Cinematic Riser #3 subtle” | 随附的 sfx/kit/riser.ogg(CC0) |
| 冲击声 | peoplearehappy 的 “soft_impact3” | 随附的 sfx/kit/impact.ogg(CC0) |
| 滴答声 | Squirrel_404 的 “Click / Tick” | 随附的 sfx/kit/tick.ogg(CC0) |
| 打字声 | Mixkit 的 “Fast laptop keyboard typing”(#1392) | 运行时下载到 <out>/sound-effects-cache/(Mixkit 许可:绝不可提交) |
清单中的其他内容都是备选项(alt_categories 列出可相互替代的类别)。署名信息请见 TOP-PICKS.md。
规则
- 绝不要用代码合成音乐或音效(不得使用振荡器或正弦波哔声)。请使用真实录制的文件。
- 音效:优先使用随附的素材库。
sfx/manifest.json列出了每个文件的类别、时长、来源和许可。所有随附文件均为 CC0。 - 如果随附素材库中没有合适的内容,请使用清单中的
runtime条目(Mixkit)。将其下载到用户的项目中,绝不要下载到此技能文件夹,也绝不要提交。Mixkit 允许在视频中使用,但不允许单独再分发。 - **音乐:**使用用户提供的曲目,或使用
MUSIC.md中的曲目(按感觉推荐的免费曲目,运行时下载,绝不提交)。请将来源和许可写入SOUND.md。如果用户没有曲目,请从MUSIC.md中推荐 2–3 首适合该视频的曲目供用户选择。 - **许可:**只有 CC0 和 Mixkit Free License 算作免费且安全;脚本会检查每个使用的音效。不要逐个列出音效的许可。如果所有许可信息都已确认,只需告知用户一次:来源标注这些音效采用 CC0 或 Mixkit Free License;来源可能会更改许可条款,因此请不时查看来源页面。如果脚本报告许可未知,请指出具体音效、其许可和来源链接,并告诉用户在确认或更换之前不要发布。绝不要说许可未知的音效大概没问题。
- **音乐许可:**询问曲目的来源,并传入
--music-source "track, artist, link"和--music-license "..."。如果不传入这些参数,本次运行会将音乐标记为 LICENCE NOT CONFIRMED;请明确说明这一点。 - **署名:**每次运行都会生成
CREDITS.txt,其中列出实际使用的音效和音乐,可直接粘贴使用。只需推荐一次:可选将其用于 YouTube、Instagram 或 TikTok 的描述;CC0 无需署名,但如果平台对音频提出异议,该清单可作为来源证明。 - 测量导出的 MP4,绝不要测量中间 WAV。
- 测量导出的 MP4,绝不要测量中间 WAV。
0. 许可检查(编辑期间,在导出前)
素材来源的条款会变化,因此每次最终导出前,都要检查此视频实际使用的内容当前适用的条款:
- 使用场景。 询问视频将发布在哪里,除非已经明确(例如“我的 YouTube 视频”):YouTube、Instagram、TikTok、其他社交平台、在线广告、播客、客户项目、电视或广播、电子游戏、CD 或 DVD,或供他人使用的模板或工具。将其作为
--use-case "..."传入,以便写入SOUND.md。 - 素材来源。 对此视频中使用的每个素材来源(
CREDITS.txt中列出的提供方,以及音乐),打开其当前的许可页面(通过网页抓取;如果网站拦截,则使用用户的浏览器),并检查两点:条款仍与下表所述一致,且允许该使用场景。对于 Freesound,打开每个实际使用的声音对应的页面,确认页面仍标明 Creative Commons 0。对于音乐,打开曲目页面。 - 如实报告,每个素材来源一行:“今日已检查:Mixkit Stock Music Free License,条款未变,允许用于 YouTube。”如果某个来源的条款已变,或不允许该使用场景,请指出具体的声音或曲目以及原因,并在导出前替换。绝不要说未经检查或情况不明的许可没有问题。
| 来源 | 许可页面 | 允许的用途(于 13 Oct 2026 检查) | 不允许的用途 |
|---|---|---|---|
| Freesound,CC0 | 声音自身的页面 | 任何用途,无需署名 | 无(CC-BY 需要署名;商业用途绝不能使用 CC-BY-NC) |
| Kenney | kenney.nl 上的素材包页面 | 任何用途(CC0) | 无 |
| Mixkit 音效 | https://mixkit.co/license/#sfxFree | 网页、社交平台、播客、游戏、电影、CD/DVD、电视/广播 | 单独或内置于工具或模板中再分发文件;将其注册到版权管理服务 |
| Mixkit 音乐 | https://mixkit.co/license/#musicFree | YouTube、社交平台、在线广告、播客、教育 | CD/DVD、电视/广播、电子游戏、混音、注册到 Content ID |
Mixkit 禁止“在工具或模板中”再分发其文件,因此此技能绝不存储 Mixkit 音效或音乐:这些文件会在运行时下载到用户的项目中。
1. 设置
需要 ffmpeg 和 Python 3.10+。安装到可删除的文件夹中:
python3 -m venv .sound-effects
.sound-effects/bin/pip install librosa soundfile numpy scipy matplotlib
2. 构建提示音列表
使用 ffprobe 读取视频的时长和 fps。列出每个需要声音的时刻。尽可能从合成源中提取这些时刻(HyperFrames/Remotion 时间线、GSAP 标签、motion-broll plan.json)。否则,使用 ffmpeg -i in.mp4 -vf "select='gt(scene,0.3)',showinfo" -f null - 检测场景切换。
将 cues.json 写为 [{"t": 2.0, "type": "scene_cut", "desc": "cut to card"}, {"t": 4.2, "type": "typing", "dur": 1.3, "desc": "..."}]。
提示音类型与素材库类别的映射关系(清单中的 category_map):
| 提示音类型 | 类别 | 说明 |
|---|---|---|
| movement(滑动、镜头移动) | whoosh | 提前 2 帧开始;选择与移动相匹配的长度 |
| scene_cut | whoosh | 短促的 whoosh,提前 2 帧(transition 音效可作为替代) |
| appear | pop | 与画面同时出现 |
| click | click | 与画面同时出现 |
| typing | typing | 循环播放或修剪至 dur,音量低 |
| build_up | riser | 在下一个重击声结束 |
| reveal | impact | 音量最大的 SFX |
| success | pop | (ding 音效可作为替代) |
| error_or_tech | glitch | |
| hover_or_small_ui | tick | 音量非常低(ui-blip 和 click 可作为替代) |
| bed | ambience | 铺在所有声音下方,可选 |
每个提示音使用一个音效。同一类别内变换不同音效版本,避免重复听起来机械生硬。
3. 节拍网格及检查
运行 librosa.beat.beat_track。librosa 有时会锁定在弱拍上。 对音乐进行低通滤波,截止频率低于 120 Hz,将前 4 小节的波形与节拍线一起绘制,并对比底鼓落点。如果底鼓没有落在线上,则根据偏移量中位数平移整个网格,然后重新绘图。向用户展示 beatgrid.png。
4. 让重大转场落在节拍上
硬切和揭示应落在节拍上。如果可以更改动画时长,就更改。如果不行,就移动音乐的起始位置(搜索偏移量,并选择剪辑与节拍误差最小的位置)。报告每次剪辑的误差,单位为 ms。
5. 放置音效并混音
优先级:旁白 > 音效 > 音乐。 音效下方的音乐底轨约为 -12 dB,遇到旁白时则降低 8–12 dB。 目标为约 -16 LUFS 综合响度,且真峰值低于 -4 dBFS,确保经过 AAC 压缩或在手机扬声器上播放时不会削波。导出、测量、调整增益或添加限制器,然后再次导出并测量:
ffmpeg -nostats -i after.mp4 -af ebur128=peak=true -f null - 2>&1 | tail -12
ffmpeg -nostats -i after.mp4 -ac 1 -af ebur128=peak=true -f null - 2>&1 | tail -12 # mono check
6. 验证效果
对于每个提示点,从导出的 MP4 中截取它前后各一帧,并绘制其附近的波形(checks/cue-XX.png)。然后选出风险最高的 5 个时间戳(节拍误差最大的位置、打字和上升音效等长音效,以及揭示部分),让用户戴上耳机检查。
原始质量文件
随附的音效是经过压缩的 OGG Vorbis 试听文件(经过裁剪、归一化,通常为单声道),适用于大多数视频。如果某个音效的质量不足以满足用途(有可听见的伪影、特写英雄音效、最终母带),请获取原始文件:
- 在
sfx/manifest.json中查找条目的source_url。每个随附条目和default_kit条目都有此字段。 - Freesound(
freesound.org/people/<user>/sounds/<id>/):该页面上的 Download 按钮可下载原始文件。下载需要免费的 Freesound 账户,因此请让用户下载(或者在用户提供 API 密钥后使用)。 - Kenney(
kenney.nl/assets/<pack>):从该页面下载资源包 zip。清单中每个 Kenney 条目的original_file都会注明确切文件,例如kenney_interface-sounds.zip → Audio/click_001.ogg。规则:去掉前缀(kenney-interface-→ interface-sounds、kenney-ui-→ ui-audio、kenney-digital-→ digital-audio、kenney-impact-→ impact-sounds、kenney-sci-→ sci-fi-sounds),然后在Audio/中匹配其余部分,忽略大小写,并将-视为_(kenney-digital-phaserup1→Audio/phaserUp1.ogg、kenney-impact-impactpunch-heavy-000→Audio/impactPunch_heavy_000.ogg)。Kenney 的原始文件也是 OGG 格式,但未经处理。 - 将原始文件保存在用户的项目中(例如
sound-effects-cache/originals/),不要保存在此技能文件夹中,并通过--swaps将文件传给脚本,或编辑清单副本。应用与随附文件相同的裁剪和音量。
查找更多音效
当用户想要更多或不同的音效时,请搜索以下来源,为每个候选音效提供链接、创作者和许可信息,并推荐 3–5 个选项供用户选择。使用任何音效前,先打开其页面,确认页面当前显示的许可,并检查该许可是否允许用户的使用场景(步骤 0);将其添加到 CREDITS.txt。只能按照许可允许的方式使用或再分发音效。音乐请参阅 MUSIC.md。
| 来源 | 搜索 | 许可说明 |
|---|---|---|
| Freesound | https://freesound.org/search/?q=<words>&f=license:"Creative Commons 0" | 使用 CC0 筛选条件。CC0 音效可以随项目打包,无需署名(但仍应署名)。CC-BY 音效需在视频说明中署名;绝不要打包 CC-BY-NC 音效,也不要将其用于商业用途。 |
| Kenney | https://kenney.nl/assets/category:Audio | 全部为 CC0。可免费使用和打包。 |
| Mixkit | https://mixkit.co/free-sound-effects/<category>/(例如 whoosh、typing) | Mixkit SFX Free License:可用于视频,包括营利视频,但不得再分发。仅在运行时将其下载到用户的项目中;绝不要提交到代码库或打包。 |
| Pixabay | https://pixabay.com/sound-effects/search/<words>/ | 可免费用于视频,无需署名,但不得单独再分发。由用户在浏览器中下载;绝不要打包。 |
| Sonniss GDC bundles | https://sonniss.com/gameaudiogdc/ | 可免版税地用于视频;不得再分发原始音频或用于 AI 训练。仅限本地使用。 |
| YouTube Audio Library | YouTube Studio → Audio Library | 仅限用于 YouTube 视频;只能在 Studio 中获取。绝不要打包。 |
只有 CC0 音效可以添加到此代码库的 sfx/ 文件夹中;每个音效都必须有一条清单记录(文件、类别、时长、source_url、许可、署名信息),并在 LICENSES.md 中添加一行。
脚本
scripts/sound_pass.py 会端到端运行步骤 3–6:
.sound-effects/bin/python scripts/sound_pass.py --video silent.mp4 --cues cues.json \
--music track.mp3 --manifest sfx/manifest.json --out out/
确认后,添加 --use-case "..." 和 --music-source/--music-license。该脚本会生成 after.mp4、report.html、SOUND.md(许可检查、日志、提示词 → 文件表、LUFS 和峰值数值、5 个时间戳)、CREDITS.txt、beatgrid.png 和 checks/。查看日志并修正所有超过目标值的项目。如果更改了动画时间,先重新渲染。
7. 替换报告中的音效
sound_pass.py 也会生成 report.html。该报告会列出每个提示词及其时间戳、类别、所用音效(带播放按钮)、来源页面、许可和署名信息,还会列出该类别的备选音效,每个备选项都带有播放按钮和“让模型决定”选项。为用户打开报告。用户选择后,点击 Download swaps.json,然后使用 --swaps swaps.json 重新运行。"auto" 表示从备选音效中另选一个。多次运行时保持提示词索引稳定。
向用户报告
报告许可检查结果(全部已知,或列出每个许可未知的音效名称)、使用场景及是否允许、音乐来源和许可(或说明尚未确认)、CREDITS.txt 是否已就绪(供用户按需查看)、节拍网格结果(是否已偏移,以及偏移量)、切点与节拍的误差、最终 LUFS 和真峰值(立体声和单声道),以及 5 个时间戳。不要告诉用户音效听起来不错。