首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Meta 重磅开源 SAM Audio:第一次,剪音频像剪视频一样简单了。

Meta 重磅开源 SAM Audio:第一次,剪音频像剪视频一样简单了。

作者头像
开源星探
发布2026-03-16 20:11:47
发布2026-03-16 20:11:47
1290
举报
文章被收录于专栏:翩翩白衣少年翩翩白衣少年

在多媒体编辑领域,音频处理一直是个「玄学」。

如果你有一段录音,里面混杂着人声、背景音乐、汽车喇叭声和狗叫声。你想把 “狗叫声”单独提取出来,或者反过来,你想把除了人声以外的所有声音都静音

在以前,这需要专业的音频工程师,配合复杂的 EQ(均衡器)、频谱仪和昂贵的降噪插件,甚至手动去画波形,搞半天还不一定干净。

但就在前两天,Meta 甩出了一个王牌模型:SAM Audio,一款统一音频分割模型。

它继承了图像界 Segment Anything 的衣钵,主打一个核心理念:万物皆可分割,声音也不例外。

它和最新的统一多模态视频模型:可灵O1的作用很类似。

只要你给它一个提示(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 语言100%开发,所以你只需要准备好 Python 3.10 及以上的开发环境和支持CUDA的显卡即可。

下载或克隆代码

代码语言:javascript
复制
git clone https://github.com/facebookresearch/sam-audio.git
cd sam-audio

安装依赖

代码语言:javascript
复制
pip install .

在正式使用前,还需要下载模型才可,目前推出了三款模型,可自行下载。

1、使用文本提示,即自然语言描述来分离声音。

代码语言:javascript
复制
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>" # audio file path or torch tensor
description = "<description>"

batch = processor(
    audios=[file],
    descriptions=[description],
).to("cuda")

result = model.separate(batch)

# Save separated audio
sample_rate = processor.audio_sampling_rate
torchaudio.save("target.wav", result.target.cpu(), sample_rate)      # The isolated sound
torchaudio.save("residual.wav", result.residual.cpu(), sample_rate)  # Everything else

2、视觉提示,使用掩码视频帧分离视频中与特定视觉对象相关的声音。

代码语言:javascript
复制
import torch
import numpy as np
from sam_audio import SAMAudio, SAMAudioProcessor
from torchcodec.decoders import VideoDecoder

# NOTE: Requires SAM3 for creating masks
# pip install git+https://github.com/facebookresearch/sam3.git
from sam3.model_builder import build_sam3_video_predictor

# Load SAM-Audio model
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")

# Load video
video_file = "path/to/video.mp4"
decoder = VideoDecoder(video_file)
frames = decoder[:]

# Create mask using SAM3 (example with text prompt)
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",  # Visual object to isolate
    })
    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)

# Process with visual prompting
inputs = processor(
    audios=[video_file],
    descriptions=[""],
    masked_videos=processor.mask_videos([frames], [mask]),
).to(device)

with torch.inference_mode():
    result = model.separate(inputs)

3、跨度提示(时间锚点)

指定目标声音出现或不出现的时间范围。这为模型提供了一个具体的示例,说明需要隔离的内容。

代码语言:javascript
复制
import torch
import torchaudio
from sam_audio import SAMAudio, SAMAudioProcessor

# Load model and processor
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")

# Define anchors: [type, start_time, end_time]
# "+" means the sound IS present in this time range
# "-" means the sound is NOT present in this time range
anchors = [
    ["+", 6.3, 7.0],  # Sound occurs between 6.3 and 7.0 seconds
]

# Process with span prompting
inputs = processor(
    audios=[audio_file],
    descriptions=["A horn honking"],
    anchors=[anchors],
).to(device)

with torch.inference_mode():
    result = model.separate(inputs)

多个锚点的示例:

代码语言:javascript
复制
anchors = [
    ["+", 2.0, 3.5],   # Sound present from 2.0 to 3.5 seconds
    ["+", 8.0, 9.0],   # Sound present from 8.0 to 9.0 seconds
    ["-", 0.0, 1.0],   # Sound NOT present from 0.0 to 1.0 seconds
]

输出格式:

model.separate() 方法返回一个结果对象,其中包含:

  • result.target:分离出的声音(您所要求的)
  • result.residual:其他一切(剩余部分)

两者都是 list[torch.Tensor] 每个张量均为一维波形的情况。

写在最后

Meta 这次开源 SAM Audio,再次证明了多模态是 AI 的未来。

它打破了视觉和听觉的界限,让“音频编辑”这件事变得像“修图、剪视频”一样可视化、语义化。

从 SAM(图像/视频)到 SAM Audio(音频),你会发现一个明显趋势:

AI 不再只是“生成内容”,而是在重做“操作方式”。

而其统一分割的意义并不是一个功能,而是一种范式。

它更像是在音频领域,第一次明确提出:

音频分割,也可以是统一、可组合、可提示的。

SAM Audio 本质上,就是把“剪声音”这件事,从专业技能,拉回到直觉层面

后面大多会被许多 AIGC 创作者们应用到 ComfyUI 工作流中,一套连招丝滑剪辑音频。

如果你做内容、做音频、做视频,或者正在研究多模态模型,这个项目都非常值得关注。

GitHub:https://github.com/facebookresearch/sam-audio HF模型:https://huggingface.co/facebook/sam-audio-large

如果本文对您有帮助,也请帮忙点个 赞👍 + 在看 哈!❤️

在看你就赞赞我!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源星探 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目背景
  • 核心能力
  • 快速入手
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档