关于 openverse-sfx
openverse-sfx 是一项通过 Openverse 为视频添加许可音乐和音效的技能,面向视频制作者。它以测量指导节拍对齐、混音、导出验证和署名记录,而非依赖主观听感。
主要功能
- 01搜索符合许可条件的 Openverse 音频
- 02追踪节拍并对齐视频剪切
- 03标准化音乐与音效电平
- 04测量并验证导出的 MP4
- 05将音频署名记录到 credits.txt
适用场景
- 01为视频剪辑寻找许可音效
- 02让场景剪切和标题贴合音乐节拍
- 03检查 MP4 导出后的响度与峰值
- 04为下载的音频整理署名信息
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ varnan-tech/ opendirectory --skill openverse-sfx安装后在 Claude Code 中输入/openverse-sfx确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
package.jsonREADME.mdreferences/ffmpeg_recipes.mdscripts/beat_grid.pysfx_fetch.pysfx_normalize.pysfx_search.pyverify_mix.py详细介绍
openverse-sfx:通过测量验证、可免费使用的音效设计
你无法听见声音。此技能中的每项决策都通过测量(librosa、ffmpeg ebur128、波形图)做出,并在导出的文件上验证——绝不凭感觉,也绝不要告诉用户听起来不错。改为给用户一份简短的时间戳列表,让他们戴上耳机检查。
所有音频均来自 Openverse(https://api.openverse.org):520 万个可免费使用的音频文件,无需 API 密钥,费用为 $0。绝不要在代码中合成音乐或音效——不要生成正弦波提示音或噪声突发。只使用真实的授权录音。
关键规则
- 必须筛选许可证。 只使用 Openverse 中符合
license=cc0,by,pdm和source=freesound,jamendo的结果。scripts/sfx_search.py会强制执行此规则——不要绕过它。 - 每种声音只搜索一次。 Openverse 匿名使用每天约限 200 次搜索。每种声音(
"whoosh"、"ui pop"、"upbeat loop")只搜索一次,然后从候选列表中挑选。不要改写查询词后重新搜索。 - 必须提供
credits.txt。 使用 CC BY 音频时,必须注明出处。每个下载文件的attribution字段都必须原样写入credits.txt。scripts/sfx_fetch.py会自动完成此操作。CC0/PDM 无需注明出处,但仍要记录。 - 先安装前置依赖。 如果缺少,请在开始前安装:
ffmpeg,以及pip install librosa matplotlib numpy scipy。 - 测量导出的 MP4,绝不要测量导出前的 WAV。 AAC 压缩和手机单声道播放会改变效果;只有最终交付的文件才算数。
工作流
步骤 1 - 音乐
使用用户提供的曲目,或在 Openverse 中搜索一首(python3 scripts/sfx_search.py --query "upbeat loop" --min-ms 15000)。记下来源和许可证。使用 scripts/sfx_fetch.py 将其下载到 sfx/,以便将出处信息写入 credits.txt。
步骤 2 - 节拍网格
运行 python3 scripts/beat_grid.py sfx/<music_file>。它会绘制 120 Hz 以下的波形(底鼓所在频段)和检测到的节拍网格,数值检测节拍是否错位,并写入 beats.json。打开 beatgrid.png:红线必须正好落在底鼓尖峰上。如果没有,请将整个网格移动半个节拍间隔(脚本会进行数值检查,并在半拍对齐的得分高出 >5% 时自动移动)。
步骤 3 - 将重要动作对齐节拍
将场景切换、标题出现和重要动画安排在 beats.json 中的节拍上。如果可以修改动画,就把切换对齐到最近的节拍。如果不能,就调整音乐的起始位置,让现有切换落在节拍上(在音乐输入上使用 -itsoffset / adelay)。
步骤 4 - 每次切换和重要动作配一个现成音效
如果项目已有音效库,先使用它;如果缺少需要的声音,请询问用户。否则,每种声音调用一次 sfx_search.py:移动用 whoosh,元素出现用 pop,点击用 click,打字用 typing sounds。从候选列表中为每个镜头的动作挑选最合适的音效,并使用 sfx_fetch.py 下载所选音效。
第 5 步 - 按照正确的层级混音
- 旁白是最响的音轨;有人说话时,音乐会降低音量(使用侧链闪避或手动音量自动化)。
- 音效应高于音乐,而且源文件的响度差异很大——根据测量结果对每个音轨进行归一化,绝不要使用固定的音量倍数:
- 单次音效峰值归一化至 -3 dBTP,使用
scripts/sfx_normalize.py(单次音效依靠瞬态突出,因此按峰值而非 LUFS 归一化;绝不要对短音效运行ffmpeg loudnorm——其 3 秒缓冲区会毁掉短文件)。 - 音乐背景归一化至 -20 LUFS。
- 具体命令见
references/ffmpeg_recipes.md。
- 单次音效峰值归一化至 -3 dBTP,使用
- 目标是交付的 MP4 集成响度达到 -16 LUFS,真峰值低于 -4 dBFS,确保 AAC 压缩后或手机扬声器以单声道播放时都不会削波。母带设为
TP=-4.5:AAC 编码会产生约 0.3-0.6 dB 的过冲,而母带设为-4.0时,混流后的文件会超出门限。 - 阅读
references/ffmpeg_recipes.md,查看闪避、按节拍时间放置音效和两遍loudnorm的确切ffmpeg命令。
第 6 步 - 验证导出文件,然后提供检查时间点
对每个提示时间运行 python3 scripts/verify_mix.py final.mp4 --cue <t1> --cue <t2> ...。此脚本会使用 ebur128 测量导出的 MP4,在每个提示时间前后各截取一帧,并绘制带有提示线的导出波形。确认响度和峰值达标,且每个提示都落在波形尖峰上,其对应帧也显示剪辑或标题。然后提供 5 个供用户戴耳机检查的时间戳和 credits.txt 的路径。不要声称听起来不错。
脚本
| 脚本 | 用途 |
|---|---|
scripts/sfx_search.py | 搜索 Openverse,并强制应用许可和来源筛选条件(freesound,jamendo 中的 cc0,by,pdm);按时长筛选;生成包含署名字段的 JSON 候选列表 |
scripts/sfx_fetch.py | 使用 Python 标准库(urllib.request)将所选文件下载到 sfx/,并将原始署名信息追加到 credits.txt |
scripts/sfx_normalize.py | 使用 ebur128 测量、增益处理并重新测量;音效单次播放使用峰值模式(-3 dBTP),背景音轨使用 LUFS 模式——适用于 loudnorm 会损毁短文件的情况 |
scripts/beat_grid.py | 使用 librosa 追踪节拍,进行数值化的节拍偏移锁定检查,绘制低于 120 Hz 的底鼓频段/节拍网格(beatgrid.png),并生成 beats.json |
scripts/verify_mix.py | 检查导出 MP4 的 ebur128 响度和真峰值,截取提示时间前后帧,绘制波形图(verify/waveform.png),并给出 PASS/NEEDS FIX 结果 |
参考资料
references/ffmpeg_recipes.md- 提供音乐节拍偏移、按提示时间放置音效、人声旁白侧链闪避,以及两遍loudnorm以达到-16 LUFS/-4 dBTP的确切ffmpeg命令。编写任何ffmpeg命令前都要阅读此文件。