免版权配乐·选型工坊
给成片配 BGM 的完整流水线,从「找曲」到「验收」全部可量化。
核心原则:先合规、再对味、最后动手。 授权不清的音源一票否决;然后用客观指标筛掉九成不合用的曲子,只把少数几首交给用户拍板;最后把「不要超过人声」这类口头要求翻译成可验收的数字。
别凭曲名猜风格,别凭感觉调音量。 音频无法被「听」时,这套指标与口径足以做出可辩护的推荐。
何时使用
- 「加个背景音乐」「找 BGM」「配个乐」「视频没音乐」
- 「这首曲子放视频里行不行」「哪首合适」
- 「不要超过人声」「配乐别压住旁白」「音乐盖住人声了」
- 「剪映里怎么加音乐」「草稿里配乐怎么放」
- 「这段配乐有没有版权」「能不能商用」
工作流总览
| 步骤 | 做什么 | 工具 |
|---|---|---|
| 0 合规 | 只从免版税源取曲,逐首核验授权并留档 | references/sources-license.md |
| 1 筛选 | 算五个客观指标,筛掉不合用的 | scripts/bgm_scan.py |
| 2 拍板 | 生成分组试听页,让用户报编号 | scripts/bgm_audition.py |
| 3 对齐 | 把「别盖过人声」算成增益,裁切 + 淡入淡出一次烘焙 | scripts/bgm_match.py |
| 4 验收 | 等功率口径验证,违规窗口必须为 0 | scripts/bgm_verify.py |
| 5 入稿 | 写入剪映草稿(独立音轨、新草稿名) | references/jianying-handoff.md |
红线:动工前必须拿到用户报的编号。 不替用户拍板风格。
工具链
四个脚本均为零第三方依赖(仅需 PATH 中的 ffmpeg / ffprobe)。
1. 指标扫描 bgm_scan.py
python scripts/bgm_scan.py songs/ # 扫目录
python scripts/bgm_scan.py songs/ --length 92.5 # 与片长比对(提示是否需循环)
python scripts/bgm_scan.py songs/ --video final.mp4 # 从成片自动读片长
python scripts/bgm_scan.py songs/ --json --out scan.json
输出每首的:时长 / 响度(dBFS)/ 亮度(过零频率)/ 10 段能量走向 / 结尾收束判定。
判据速查:
| 项 | 判据 |
|---|---|
| 响度 | -20~-14 适中;≤ -26 需抬增益;≥ -12 易压旁白 |
| 亮度 | <300Hz 极暗;300~900 温暖;900~2000 中性;2000~4000 明亮;>4000 噪声型 |
| 能量 | 段间极差 ≥6dB 有叙事弧;<2.5dB 恒定陪衬 |
| 收束 | 末 6s 比中段低 ≥8dB 可自然收尾;<3dB 需自己淡出 |
> 响度已与 ffmpeg volumedetect 交叉验证一致(偏差 <0.3dB)。
2. 试听页 bgm_audition.py
python scripts/bgm_audition.py --dir songs/ --length 92.5 --recommend "a.mp3,b.mp3"
生成同目录的 audition.html:按气质分组(克制陪衬 / 中性通用 / 明亮节奏 / 极亮噪声)、每首含波形 SVG 与播放器、推荐项带徽标。
音频必须用相对路径 + 本机静态服务播放(data: URI 会被预览面板拦掉,播放器显示 0:00/0:00):
cd songs && python -m http.server 18080 --bind 127.0.0.1
# 打开 http://127.0.0.1:18080/audition.html
端口被拒(WinError 10013)就换一个。不要绑 0.0.0.0。
3. 响度对齐与烘焙 bgm_match.py
# 预演(默认,只算不动手)
python scripts/bgm_match.py --narration voice/narr.wav --bgm songs/a.mp3 --length 92.5
# 确认后执行
python scripts/bgm_match.py --narration voice/narr.wav --bgm songs/a.mp3 --length 92.5 \
--yes --out audio/bgm_final.wav
计算口径:
增益 = 旁白说话窗口 p05 − 配乐窗口 p99 − margin(默认 8dB)
含义是让配乐最强的 1% 段落,仍比旁白最弱的说话段低一个安全余量。实测一般落在相对原曲 −20 ~ −26dB。
裁切策略:曲长超片长时,在可裁剪区间内找能量谷(乐句间隙)作切点,保住尾部自然收束。烘焙时 atrim + volume + afade in/out 一次性写进 wav,草稿里 volume 保持 1.0。
4. 混音验收 bgm_verify.py
python scripts/bgm_verify.py --final final.mp4 --narration voice/narr.wav --head-offset 2.5
python scripts/bgm_verify.py --final final.mp4 --narration voice/narr.wav \
--bgm audio/bgm_final.wav --mix-out audio/mix_preview.mp3
必须用等功率口径:成片与旁白都保持双声道,窗口电平用 sqrt((L²+R²)/2)。若下混成单声道再算,会引入约 −3dB 系统性偏差,足以把 +2.6dB 的轻微压声误判成「旁白被压了 2.4dB」。
合格线:
| 项 | 阈值 |
|---|---|
| 说话窗口差值中位 | ≤ +1.0 dB |
| 说话窗口差值最大 | ≤ +3.0 dB |
| 硬违规(单窗口 > +6dB) | 0 个 |
| 停顿窗口配乐覆盖 | 100%(否则报未覆盖段) |
同时会报停顿窗口的混音电平——这是「配乐确实在场」的唯一客观证据;并给出覆盖度,用于发现「配乐短于片长」造成的片头/片尾无音乐段。
硬红线
- 视频要发布=商用,只能用免版税或 CC0/CC-BY 音源。禁用任何来路不明的「热门 BGM」。
- 授权含 NC(非商用) 的曲目,不可用于变现视频。
- 每首选定曲目必须留档:曲目页 URL + 作者 + 授权页截图。发布被投诉时这是唯一凭据。
- 禁止把音乐本身再分发、转售,或用于同类素材服务。
- 需署名的曲目(CC-BY)必须在片尾或简介写出署名,保留原名与来源链接。
源清单、取链方法、核验流程见 references/sources-license.md。
自检清单
- [ ] 每首选定曲目的授权原文已核对,截图已存档
- [ ] 候选曲已下载到项目目录(不是缓存目录),文件大小正常
- [ ] 试听页音频引用全部可解析(相对路径,非
data:URI) - [ ] 增益由「旁白 p05 − 配乐 p99 − margin」算出,不是凭感觉
- [ ] 「不超过人声」已量化验收:硬违规 0,且给出余量中位/最大值
- [ ] 混音试听真峰 < −1dBFS,无削波
- [ ] 动工前已拿到用户报的编号,未替用户拍板风格
- [ ] 写草稿用新名字,构建后报真实总时长
- [ ] 配乐起点对齐画面(片头封面段也要有音乐),不是跟旁白一起整体后移
- [ ] 配乐覆盖片长全长(覆盖度检查通过)
项目目录建议
项目/
├─ songs/ 候选曲(扫描与试听页只认这里)
├─ voice/ 旁白音轨
├─ audio/ 烘焙产物(bgm_final.wav、混音试听)
├─ final.mp4 成片
└─ BGM_LICENSE.md 授权台账
常见错误速查
| 现象 | 根因 | 正解 |
|---|---|---|
| 试听页播放器 0:00/0:00 | 音频内嵌 data: URI 被拦 |
改相对路径 + 本机静态服务 |
| 起服务 WinError 10013 | 端口被保留/沙箱拒 | 换端口,只绑 127.0.0.1 |
| 「旁白被压了 2.4dB」 | 单声道上混 −3dB 假象 | 双声道 + 两声道均方 |
| 混音后音量掉一半 | amix 的 normalize 默认开 |
normalize=0 |
| 剪映提示草稿损坏 | 同名覆盖留脏 meta | 每次用新草稿名 |
| 报「疑似配乐缺失」但确有配乐 | 配乐短于片长,中位被静音段拉低 | 看 p90 + 覆盖度 |
Pixabay 返回 Just a moment |
Cloudflare 挑战 | 单页抓取,或改用 Mixkit |
| 搜索页批量抓必被拦 | 触发 CF | 不要写批量循环 |
完整 12 条案例见 references/pitfalls.md。
边界声明
- 不做曲库:本技能不提供音乐,只负责「从合法源里选对 + 调对」。曲源需现场按
sources-license.md核验。 - 不做版权法律意见:授权核验是工程留档,不构成法律结论。涉及重大商业发布,请自行咨询专业意见。
- 不替你拍板风格:工具给出客观指标与分组,最终选哪首由用户报编号决定。
- 不改画面:只处理音频轨(配乐选型、响度对齐、混音验收、写入草稿)。视频剪辑本身不在范围内。
- 依赖 ffmpeg:四个脚本均需 PATH 中可用的
ffmpeg/ffprobe;无第三方 Python 包依赖。
平台差异提示
- YouTube:Pixabay 标注
Content ID Registered的曲目可能收到版权声明(视频仍可发布,收益可能归权利人)。国内平台无此机制。 - 国内平台:主要风险来自权利人投诉与平台曲库比对。用免版税源 + 留档截图,基本可排除。