在多媒体内容创作中,音频的精细化处理一直是一个颇具挑战性的环节。
想象一个场景:你有一段录音,其中混杂着人声、背景音乐、汽车喇叭声和狗叫声。如果你希望单独提取出“狗叫声”,或者反过来,只想保留人声而将其余所有背景音静音。
在传统工作流中,这通常需要专业的音频工程师,借助复杂的EQ(均衡器)、频谱分析工具乃至昂贵的降噪插件,甚至需要手动编辑波形,耗费大量时间且效果难以保证。
近日,Meta开源了一个具有突破性的模型:SAM Audio,这是一个统一的音频分割模型。它继承了图像领域Segment Anything Model(SAM)的核心思想,并将其拓展至音频领域,其核心理念可以概括为:万物皆可分割,声音也不例外。
它只需要一个简单的提示(Prompt),就能像一把精准的“手术刀”,从复杂的混合音轨中剥离出目标声音。提示的形式可以非常多样,包括文本、视觉信息或时间区间。
随着Meta的开源,音频剪辑的体验有望变得像编辑视频一样直观和高效。
项目背景
如果你对AI计算机视觉领域有所关注,一定听说过Segment Anything Model(SAM)。它的核心理念简单却影响深远:不预设特定任务或对象,完全通过“提示”来分割任意目标。
无论是点选、框选还是输入一段文本描述,模型都能准确地从图像中分割出你指定的目标。
SAM Audio 正是将这套强大的范式完整地迁移到了音频世界。它旨在证明,音频,同样可以是“Anything”。
核心能力
SAM Audio 的核心优势在于其支持三种互补的提示方式,并且这些方式可以单独或组合使用,极大地增强了控制的灵活性与精度。
1. 文本提示
这是最直观的方式。例如,直接输入“狗叫声”、“婴儿哭声”、“女性说话声”或“歌声”等自然语言描述,模型便能从混合音频中自动识别并分离出对应的声音轨道。这让你首次可以“用语言来剪辑音频”。
2. 视觉提示
当处理对象是视频时,SAM Audio 的能力更为强大。你可以直接点击视频画面中发出声音的人或物体,模型会结合视觉与音频信息,仅提取该目标对应的声音。这一步本质上是实现了 “画面理解 → 声音定位 → 音频分割” 的链条。对于Vlog、访谈或多角色视频的后期处理,这堪称一个梦想级的功能。
3. 时间跨度提示
这是 SAM Audio 一项业内首创且非常实用的创新。你可以直接标记目标声音出现(或不出现)的具体时间段。例如,明确告诉模型:“只在 00:30–01:10 这段时间内,处理某个声音。” 这使得模型无需“全局扫描”,而是聚焦于指定的时间窗口,处理速度更快、结果更精准、控制也更直接。
4. 提示组合
真正强大的地方在于,上述提示方式并非互斥,而是可以叠加组合使用。例如:在指定的时间段内,点选视频中的某个人物,再附加上“说话声”的文本描述。这已经超越了传统的“音频剪辑”,进入了 “多模态协同理解与精准分割” 的新境界,这是过去传统音频工具几乎无法实现的。
快速上手
SAM-Audio 完全由Python开发,你需要准备 Python 3.10 或更高版本的环境,以及支持CUDA的显卡。
1. 下载代码并安装依赖
git clone https://github.com/facebookresearch/sam-audio.git
cd sam-audio
pip install .
安装完成后,需要从Hugging Face下载预训练模型。目前官方提供了多款模型可供选择。
2. 使用文本提示分离声音
from sam_audio import SAMAudio, SAMAudioProcessor
import torchaudio
model = SAMAudio.from_pretrained("facebook/sam-audio-large")
processor = SAMAudioProcessor.from_pretrained("facebook/sam-audio-large")
model = model.eval().cuda()
file = "<audio file>" # 音频文件路径或torch张量
description = "<description>" # 如“狗叫声”
batch = processor(
audios=[file],
descriptions=[description],
).to("cuda")
result = model.separate(batch)
# 保存分离出的音频
sample_rate = processor.audio_sampling_rate
torchaudio.save("target.wav", result.target.cpu(), sample_rate) # 目标声音
torchaudio.save("residual.wav", result.residual.cpu(), sample_rate) # 其余声音
3. 使用视觉提示(需配合SAM3)
此方法需要额外的视觉分割模型SAM3来生成目标掩码(mask)。
import torch
import numpy as np
from sam_audio import SAMAudio, SAMAudioProcessor
from torchcodec.decoders import VideoDecoder
# 注意:需要安装SAM3用于创建视觉掩码
# pip install git+https://github.com/facebookresearch/sam3.git
from sam3.model_builder import build_sam3_video_predictor
# 加载SAM-Audio模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SAMAudio.from_pretrained("facebook/sam-audio-large").to(device).eval()
processor = SAMAudioProcessor.from_pretrained("facebook/sam-audio-large")
# 加载视频并解码帧
video_file = "path/to/video.mp4"
decoder = VideoDecoder(video_file)
frames = decoder[:]
# 使用SAM3创建视觉掩码(此处以文本提示为例)
video_predictor = build_sam3_video_predictor()
response = video_predictor.handle_request({
"type": "start_session",
"resource_path": video_file,
})
session_id = response["session_id"]
masks = []
for frame_index in range(len(decoder)):
response = video_predictor.handle_request({
"type": "add_prompt",
"session_id": session_id,
"frame_index": frame_index,
"text": "The person on the left", # 要隔离的视觉对象描述
})
mask = response["outputs"]["out_binary_masks"]
if mask.shape[0] == 0:
mask = np.zeros_like(frames[0, [0]], dtype=bool)
masks.append(mask[:1])
mask = torch.from_numpy(np.concatenate(masks)).unsqueeze(1)
# 使用视觉提示进行处理
inputs = processor(
audios=[video_file],
descriptions=[""],
masked_videos=processor.mask_videos([frames], [mask]),
).to(device)
with torch.inference_mode():
result = model.separate(inputs)
4. 使用时间跨度(锚点)提示
你可以通过指定时间锚点来告诉模型目标声音出现的位置。
import torch
import torchaudio
from sam_audio import SAMAudio, SAMAudioProcessor
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SAMAudio.from_pretrained("facebook/sam-audio-large").to(device).eval()
processor = SAMAudioProcessor.from_pretrained("facebook/sam-audio-large")
# 定义锚点: [类型, 开始时间(秒), 结束时间(秒)]
# “+”表示目标声音在此时间段内出现
# “-”表示目标声音在此时间段内未出现
anchors = [
["+", 6.3, 7.0], # 声音出现在6.3到7.0秒之间
]
inputs = processor(
audios=[audio_file],
descriptions=["A horn honking"], # 声音描述
anchors=[anchors],
).to(device)
with torch.inference_mode():
result = model.separate(inputs)
你还可以定义多个锚点来提供更丰富的上下文:
anchors = [
["+", 2.0, 3.5], # 声音出现在2.0到3.5秒
["+", 8.0, 9.0], # 声音出现在8.0到9.0秒
["-", 0.0, 1.0], # 声音在0.0到1.0秒未出现
]
model.separate()方法返回的结果对象包含:
result.target:分离出的目标声音。
result.residual:剩余的音频部分。
两者均为list[torch.Tensor],每个张量代表一个一维音频波形。
总结与展望
Meta 此次开源 SAM Audio,再次凸显了多模态是人工智能发展的重要方向。它打破了视觉与听觉的藩篱,使得“音频编辑”能够像“修图”和“剪视频”一样,变得可视化、语义化。
从 SAM(图像/视频分割)到 SAM Audio(音频分割),我们可以观察到一个清晰的趋势:AI 正在重塑内容的“操作方式”,而不仅仅是生成内容。其“统一分割”的理念并非仅仅是一个新功能,更代表了一种新的范式。它首次在音频领域明确提出:音频分割同样可以是统一、可组合、可通过提示来驱动的。
本质上,SAM Audio 将“声音剪辑”这项任务,从依赖专业技能的领域,拉回到了符合人类直觉的层面。预计未来,它将被广泛集成到各类AIGC创作工具(如ComfyUI)的工作流中,实现更丝滑的音频后期处理。
无论你是内容创作者、音频工程师、视频制作者,还是多模态AI的研究者,这个项目都值得高度关注。