视频声音
日期:2026-10-22 · 类型:技能 · 状态:有效
概述: 视频的声音来源于一个事件列表(每个出现在屏幕上、消失或碰撞的元素对应一个事件)以及一个命令 som.py,该命令将每个音效的峰值精确对齐到正确的帧,将音乐置于人声之下,并输出混音和报告。声音不必等待渲染:一旦动画的时间确定,声音就可以开始制作。混音的标准由唯一的拥有人 06-metodo/regras.md 管理;本技能提供方法、命令和主表。
何时使用
- 任何包含运动、界面、教程、广告或仅需背景音乐且需要同步音效的视频。
- 带旁白的视频:干声在前,音乐在下,音效适当降噪。
- 看起来“死寂”的人物或场景视频:需要场景音(环境与拟音)。见 references/som-de-cena.md。
- 处理音乐:测量节拍和落点(
batida.py)或分离人声(separar.py)。
方法
- 每个可见动作对应一个声音,声音描绘动作。 卡片进入发出 pop,按钮发出 click,画面切换发出 whoosh,印章发出 bang,数字滚动发出 roll。密度按动作计算,而非按词语:人声下最多两个音效同时响起。
- 只有图像激发了声音才加入。 静态过渡中使用 whoosh、没有钟表的场景中使用时钟声、没有任何内容上升的 riser 都会让声音脱离视频。混音前,先观看视频并记录哪些东西在动、何时动、用什么材质。
- 音峰落在事件的画面上。 Click、pop、印章、撞击:音峰位于事件元素接触画面的帧上。Whoosh:音峰位于动作中间(大约开始后 0.2 秒;默认映射已实现此效果)。Riser:在落点或剪切处干燥结束。
- 调性仅用于高潮、过渡和惊喜。 撞击、印章和 logo 处使用和弦;大的过渡处使用短衬底;揭示时刻使用铃声。绝不在 click、pop 或按键上使用,否则会变成“小曲”并令人疲劳。仅在音乐已知调性时传递
--tom(例如Am)。 - 音乐按时刻使用,而非背景毯。 轻柔开场;落点前减速;呼吸;在低音鼓上达到高潮。有旁白时,音乐保持远低于人声,在呼吸和无语音段落中升起。
- 落点前呼吸。 在落点前的最后一个节拍上,乐器声干燥下降约 0.3–0.5 秒(
--drop T实现此效果),关键词或最大的画面变化落在落点的第一个帧上。使用batida.py测量落点,而非目测。 - 仅在最密集处分层。 在落点、logo 和结尾处 2–3 个音效同时发声;其余时刻每个动作一个音效。当同一音效重复时,改变音量(映射会在类别中切换变种)。
- 干声。 旁白不带混响或回声。
- 聆听分离的层。
som.py会写入escuta/voz.wav、musica.wav、efeitos.wav和tonais.wav。同步性在效果 stem 中检查,而非混音轨道中。
主要参数
拥有人:06-metodo/regras.md。若其他位置指定了不同值,则以该文件为准。混音台已自动应用这些值。
| 项目 | 值 |
|---|---|
| 带人声或音乐的 Master | -14 LUFS 集成,真实峰值 ≤ -1 dBTP(限制器 4×) |
| 人声下音乐 | 有语音时 约 15 dB 低于(报告会测量;可接受 12–18) |
| 无语音、有真实音乐的混音 | 音轨先校准至 -19 LUFS;效果 ×2.2;限制器;Master -14 |
| 纯场景音片段 | -25 LUFS 集成(上限 -24),短期 ≤ -20,瞬时 ≤ -16,峰值 ≤ -3。绝不归一化至 -14 |
| 场景音与人声混合 | 场景音 stem ≥ 15 LU 低于人声 |
| 音效库 | 短音效 -20 LUFS 瞬时峰值,衬底 -24,峰值 ≤ -3 dBTP;位置 at = evento − pico_ms/1000 |
| 同步性 | 效果 stem 中位数 ≤ 25 ms |
| 节拍 | beat_this,File2Beats(checkpoint_path="final0");剪切不超过节拍 ±2 帧 |
分步指南
所有命令从工作室根目录运行。
- 音效库准备好了吗? 如果
05-biblioteca/som/sfx/catalogo.json不存在:执行uv run scripts/som/sintetizar_sfx.py。已录制的声音:uv run scripts/som/nivelar.py <pack 文件夹>(详情见 05-biblioteca/som/README.md)。 - 事件。 从动画引擎导出
eventos.json到项目的audio/文件夹。格式、接受的类型以及如何从 After Effects、HyperFrames 和 Remotion 导出:见 references/eventos.md。 - 有节拍的音乐?
uv run scripts/som/batida.py musica.mp3 --fps 30会给出 BPM、强拍和可能的落点。在该网格上制作剪切。 - 需要音乐中的人声或乐器部分?
uv run scripts/som/separar.py musica.mp3(人声 + 乐器)或--modo 6(六个 stem)。 - 混音:
输出uv run scripts/som/som.py --eventos 04-projetos/<video>/audio/eventos.json \ --voz 04-projetos/<video>/audio/voz.wav --musica 04-projetos/<video>/audio/musica.wav \ --video 04-projetos/<video>/render/previa.mp4 --drop 12.4mix.wav、escuta/*.wav、relatorio-som.json和previa-som.mp4(图像被复制;只有声音改变)。 - 阅读报告并纠正直到没有警告。 “eventos sem som” 表示映射不认识的类型:将类型改为已知类型,在事件中添加
"som": "categoria",或编写--mapa(见下文)。LUFS、峰值和“音乐低于人声”超出目标范围也会出现警告。 - 场景音?
uv run scripts/som/verificar_som_de_cena.py <仅场景混音>或... escuta/efeitos.wav --voz escuta/voz.wav。不通过则不能交付。 - 聆听。 带声音的预览会发送给工作室拥有人批准。在最终视频中,运行相同命令加上
--video render/final.mp4:这仅仅是 remux,无需重新渲染。
项目自定义音效(--mapa)
一个包含 MAPA = {tipo: função(M, e)} 的 .py 文件,仅在你列出的类型上覆盖默认映射:
# 04-projetos/<video>/audio/mapa.py
MAPA = {
"logo": lambda M, e: (M.poe("logo", e["t"], -11), M.poe("impacto", e["t"], -16), M.golpe(e["t"], -20)),
"moeda": lambda M, e: M.poe("sucesso/sucesso-2", e["t"], -14, st=3), # st = 半音升调
}
映射中可用的 Mesa 函数:M.poe(som, t, ganho_db, pan, alinha="pico"|"ini"|"fim", st=semitons, fim=duração, fade=s, sala=True)、M.tonal(t, lufs)、M.golpe(t, lufs)、M.textura(t0, t1, lufs)、M.riser(t_pico)。som 接受一个类别(如 "whoosh",会在变种间切换)、库中的文件(如 "whoosh/whoosh-2")或文件路径。
命令
| 脚本 | 用途 |
|---|---|
uv run scripts/som/som.py --eventos E.json [--voz V] [--musica M] [--video P.mp4] [--tom Am] [--drop T] [--mapa mapa.py] | 完整混音、报告以及粘贴到视频上的声音 |
uv run scripts/som/sintetizar_sfx.py [--amostra prova.wav] | 生成初始合成音效库 |
uv run scripts/som/nivelar.py PASTA [--categoria X] [--cama] [--destino D] | 将音效包标准化并更新目录 |
uv run scripts/som/verificar_som_de_cena.py MIX.wav [--voz VOZ.wav] | 拒绝过大的场景音(退出码 1) |
uv run scripts/som/batida.py MUSICA [--fps 30] [--json grade.json] [--video render.mp4] | 节拍、强拍、BPM 和落点(beat_this) |
| `uv run scripts/som/separar.py MUSICA [--modo voz | 6] [--saida PASTA]` |
som.py 的其他选项:--voz-entra、--musica-entra、--musica-de(对齐片段)、--dur、--impacto T0 T1(音乐提升至人声水平)、--lufs、--pico、--fx -10(效果相对于人声的 LUFS)、--saida。
batida.py 和 separar.py 使用 AI,需要额外依赖:uv sync --extra cpu(或使用 NVIDIA 显卡时 --extra gpu)。模型在首次使用时自动下载(beat_this 约 80 MB;每个分离模型约 300–700 MB,保存在 ~/.cache/estudio-ia/ 中)。如果没有额外依赖,这两个脚本会停止并显示安装说明。
常见错误
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| 场景视频中音效“过大” | 场景音被归一化为 -14 | 无语音或音乐时 som.py 会瞄准 -25;用 verificar_som_de_cena.py 检查 |
| 无声视频中音效被音乐淹没 | 音轨被母带处理为 -8 到 -11 LUFS | 混音台会将音轨校准至 -19 并将效果提升 ×2.2;若仍被淹没,则在事件中增大 vol |
| whoosh 音效“延迟” | 事件标记在动作结束时 | 标记动作开始;映射会在 0.2 秒后将峰值放置在动作中间 |
| 重复相同音效听起来像机器人 | 某个类别只有一个变种 | 为该类别添加更多音效,或在 --mapa 中使用不同的 st |
| 报告:“类别互换” | 库中没有该类别 | 运行 sintetizar_sfx.py 或使用该类别标准化一个音效包 |