Google 9 月 23 日展示了在 Flow 中制作的六个创意工具,其中 Mondo Sónico 可以生成背景氛围、拟音和情境音效,并输出独立、可编辑的声音轨道。对 AI 视频团队,分轨带来的新问题是:镜头改版后,旧脚步声、环境声或混音是否仍被误用?发布前要把每条声音绑定到画面版本和时间范围,而不是只看它们能否播放。

图 1|镜头换版时,配套的音效版本也要重新核对。
分轨导出为什么仍可能把音效混错?
Google 的 9 月 23 日文章把 Mondo Sónico 描述为生成自定义背景氛围、拟音和情境音效,并让结果在独立可编辑轨道上自动同步,便于单独导出 stem。这是工具能力说明;最终剪辑、转码、加字幕或重新生成视频后,团队仍需要核对这些 stem 对应的画面范围。不能把"工具当时同步了"当成"最终导出一定同步"。

图 2|三类声音在独立轨道上可编辑,但必须归到同一镜头版本。
常见错位不是整段音轨完全跑偏,而是某个镜头只改了起点、速度或动作节奏。比如脚步落地的画面从 1.20 秒移到 1.36 秒,原拟音文件依然可以正常播放,听感却不再对应动作。另一种风险是同名文件覆盖:foley_final.wav 被新一轮生成改写,审批记录却仍指向旧版。解决办法是给每个 stem 记文件哈希、对应 shot_revision_id 和进入时间线的偏移量。

图 3|"能播放"不等于"动作点正确",要核对具体同步锚点。
一张音轨清单该记录什么?
最小清单以 video_asset_id 为根:每条声音记录 stem_id、stem_role、file_sha256、sample_rate、duration_ms、timeline_start_ms、shot_revision_id 和 approval_status。stem_role 可以用 ambience、foley、music 等有限值。视频一旦换版,先判断原声音是否仍适用;如果重新生成,产生新的 stem_id,不要沿用旧审批。

图 4|声音文件、镜头修订、时间线位置与批准记录要能相互追溯。

图 5|同一环境声可复用,放入不同镜头时仍须分别记录偏移。
混音还要区分"源文件"和"最终导出"。一条音轨在工程里可能经过裁剪、变速、响度调整或左右声道处理,原文件哈希不能证明导出的混音一定用了它。交付清单应另存最终视频文件哈希、导出时间和本次混音的 stem ID 列表。若音效跨多个镜头复用,每次实例化都另记时间线位置。若同一视频有竖屏、横屏两个剪辑版本,它们可能共享环境声素材,但时间线偏移与最终混音记录应分别维护。

图 6|素材可复用,最终时间线和混音版本不能混成一条记录。
发布前怎样做一轮本地机械检查?
FFmpeg 的官方文档说明了输入流选择及 -map 显式映射。下面的示例只做本地文件预检 :用 ffprobe 读出 stem 的时长与采样率,和清单中的目标值比较;再核对文件哈希。它不会判断拟音是否踩在正确帧上,也不调用 Flow 接口。把一条记录写入 stem.json,运行 python3 check_stem.py stem.json。示例时长容差为 40 毫秒,实际要依据帧率和声音制作规范设定。

图 7|机械检查负责发现错文件、错时长和采样率不符。
python
import hashlib
import json
import subprocess
import sys
from pathlib import Path
row = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
required = ("video_asset_id", "stem_id", "file", "sha256",
"duration_ms", "sample_rate")
missing = [key for key in required if not row.get(key)]
if missing:
raise SystemExit(f"missing: {', '.join(missing)}")
path = Path(row["file"])
if not path.is_file():
raise SystemExit("stem file missing")
if hashlib.sha256(path.read_bytes()).hexdigest() != row["sha256"]:
raise SystemExit("stem file changed")
probe = subprocess.check_output([
"ffprobe", "-v", "error", "-select_streams", "a:0",
"-show_entries", "stream=sample_rate,duration",
"-of", "json", str(path)
], text=True)
stream = json.loads(probe)["streams"][0]
if int(stream["sample_rate"]) != int(row["sample_rate"]):
raise SystemExit("sample rate changed")
if abs(round(float(stream["duration"]) * 1000) - int(row["duration_ms"])) > 40:
raise SystemExit("stem duration changed")
print("local stem check passed")
随后用耳朵和波形检查动作锚点、对白遮蔽、片头片尾渐变,再从最终导出反查一遍。不要只看每条 stem 的长度相同;采样率和容器正确也无法证明声音与画面语义相符。若需显式组合多个音轨,先在编辑器中确定轨道顺序,再用 ffmpeg -map 检查最终文件实际包含哪些流,避免默认自动选流造成漏轨。

图 8|局部 stem 通过后,还要在最终导出里核对动作点和流映射。
哪些情况必须停下,让剪辑师确认?
镜头修订 ID 与 stem 记录不一致、同名文件哈希变化、拟音锚点偏离画面动作、最终视频缺音轨,或多人同时修改混音工程时,都应把交付状态留在待核对。AI 能快速产出声音层,工程系统应负责暴露具体差异;是否接受声音设计,仍由人按画面和品牌要求判断。保留旧 stem 和旧视频版本,才能在问题被发现时真正回退。

图 9|版本或同步关系不明时停止交付,原声画组合保持可回退。