foley: 精准落帧的音效
你无法听到。earshot是你的耳朵:绝不要说某个音效“听起来合适”或“同步”,而应引用earshot的数值。
SKILL_DIR 以下 = 本技能自己的文件夹(技能加载时会显示其基础目录)。在视频文件夹中工作。将你制作的所有内容放在视频旁的 foley/ 下。
需求
ffmpeg和ffprobe在PATH中,Python 3.10+。earshot在PATH中:uv tool install "earshot[mcp] @ git+https://github.com/Leonxlnx/earshot"然后earshot doctor --fetch(约1.1 GB模型,仅CPU)。- 需要互联网访问Openverse(匿名限制:每分钟约20个请求,每天200个)。
1. 找到提示点(先观察,再测量)
python3 SKILL_DIR/scripts/find_cues.py VIDEO --out foley/cues-candidates.json打印运动峰值(帧间变化)并将接触印片写入foley/sheets/。- 阅读接触印片。为每个需要声音的时刻命名(打击、脚步声、门声、快速转身的呼哧声、撞击、环境背景),并选择其精确帧;利用运动峰值缩小范围,但要相信你所看到的。跳过你实际上看不到的接触点。
- 写入
foley/cues.json:[{"id": "hit1", "t": 0.625, "kind": "hit", "what": "拳头击打张开的手掌"}, ...]。
2. 获取CC0音效
为每种类型,使用2–4个搜索词:python3 SKILL_DIR/scripts/fetch_cc0.py "punch impact" foley/sounds/hit --limit 8。
它只保留 source=freesound 且许可为 license=cc0 的结果,并将标题、创作者、许可和来源页面记录在 foley/sounds/sources.json 中。CC0无需署名,但如果用户将音效用于商业用途,请告知他们打开来源页面:Openverse不保证许可的准确性。
3. 用earshot挑选和修剪
earshot rank "<该时刻听起来像什么>" foley/sounds/<kind> --top 3 --out foley/rank-<kind>.json。描述声音,而非画面(例如“一声短暂而尖锐的巴掌打在摊开的手掌上”)。earshot find FILE "<相同关键词>" --kind event --top 3 --out foley/find-<id>.json用于一次性音效;对于环境背景使用--kind texture。拒绝标记为“头截断”或“尾截断”的修剪片段。- 记下每个修剪片段的同步点:对于打击音效是攻击点(起始 + 约5毫秒);对于呼哧声是最响点,而非起始点。
4. 放置
写入 foley/plan_v1.json(参见 scripts/mix.py 头部)并运行 python3 SKILL_DIR/scripts/mix.py foley/plan_v1.json。画面被复制,从不重新编码。
5. 回听并修复(重要部分)
earshot timeline OUT.mp4 --cues "t1,t2,..." --out foley/timeline_v1.jsonpython3 SKILL_DIR/scripts/check.py foley/timeline_v1.json id1,id2,... foley/check_v1.json当听到的起始点在画面帧的40毫秒内且电平比背景至少高6 dB时,该提示通过。- 仅修复未通过的部分,根据测量量进行调整:
- 延迟/提前 → 按偏移量移动该事件(呼哧声通常延迟,因为其峰值在起始之后出现);
- 掩蔽(比背景低6 dB)→ 提高该事件或降低背景;
- 真实峰值高于-1 dBTP或削波 → 降低最响的打击音效(限制器无法捕捉前几个采样上的瞬态)。
- 写入
plan_v2.json,渲染,再次回听。重复直到所有通过且真实峰值 ≤ -1 dBTP。 - 响度:纯音效轨道通常峰值较高,约-20 LUFS,真实峰值 ≤ -1 dBTP。这是预期的;最终的响度设置在编辑阶段与语音/音乐一起处理。不要在这里将其推得更大。
6. 报告
写入 foley/report.md:每个提示(时间、帧、内容),使用的文件(标题、创作者、CC0来源页面),第一次回听的偏移和电平,你更改的内容,以及最终数值。明确说明这些检查是基于earshot的测量,而非人工听感,并建议用户自己听一遍。
规则
- 仅使用CC0音效,除非用户另有要求。绝不可在未记录
sources.json行的情况下使用音效。 - 不要凭空捏造一个你未在画面中看到的打击。不要说某个音效“听起来合适”,而应引用earshot的数据。
- 保持原始视频不变;输出
<name>-sfx.mp4。