跳至主要内容

如何在本地运行 SAM Audio

了解如何在本地运行 SAM Audio 基础模型,在 RTX 3090 GPU 上通过简单直观的提示分离人声与声音,体验最前沿的音频分割效果。
· 10分钟 阅读

使用 AI 探索

您也许已经熟悉图像和视频分割,但音频分割则少有人深入探讨。它指的是在一段音频流中分离并隔离不同声音的能力,例如从背景音乐中提取说话声,或在群组会议中只保留某一个人的声音。直到最近,这些任务还需要专门的、面向特定任务的工具和大量手动处理。

在本教程中,我们将探索 SAM Audio——Segment Anything Model 的音频扩展。我们将搭建本地环境、安装必要依赖、加载模型,并在 RTX 3090 GPU 上进行推理。

同时,我们会可视化展示 SAM Audio 如何以比传统音频处理方法更直观、更“临床级”精确的方式,精准分割音频信号中的特定部分。

什么是 SAM Audio?

SAM Audio 是首款同类的统一多模态模型,旨在让音频分离像与声音本身交互一样直观。受视觉领域Segment Anything Model成功的启发,SAM Audio 允许用户通过自然提示,从复杂的音频混合中隔离任意声音,无论是通过文本、视频中的视觉线索,还是标注时间片段。该统一方法用一个在语音、音乐和通用声音上都稳定可靠的系统,取代了零散的、单一用途的音频工具,即使在真实世界的“野外”场景中也能良好工作。

Sam-audio pipeline

来源:facebookresearch/sam-audio

SAM Audio 的核心是 Perception Encoder Audiovisual(PE-AV),这是一台强大的引擎,通过对音频与视觉信号进行时间上的联合编码,使“所见”与“所闻”对齐。

基于 Meta 开源的 Perception Encoder,PE-AV 提供了丰富且时间精确的表示,使其在多模态音频分离中达成最先进的性能。

SAM Audio 与 PE-AV 携手,为创意媒体、无障碍与音频理解带来新的可能,使专业级音频分割比以往更快速、更易用、也更易于控制。

SAM Audio 教程

下面我将带您一步步在本地使用 SAM Audio。

1. 环境搭建

SAM Audio 是一个受控访问的模型(gated model),这意味着您必须先申请访问权限,才能下载并在本地使用。首先访问 Hugging Face 模型页面facebook/sam-audio-large并填写访问申请表。通常约 10 分钟即可获批,但在某些情况下,可能会根据您的所在地或 Meta 的其他政策而被拒绝。

Accessing the gated Sam-Audio model

来源:facebook/sam-audio-large · Hugging Face

访问获批后,启动本地 Jupyter Notebook,并直接从官方仓库安装 SAM Audio 库:

!pip install -q git+https://github.com/facebookresearch/sam-audio.git

使用 SAM Audio 时常见的问题是 Jupyter 内核崩溃或意外重启。通常是由于不兼容的 torchcodec 版本导致。要修复此问题,请先卸载现有版本,再明确安装推荐版本:

!pip uninstall -y torchcodec
!pip install --no-cache-dir "torchcodec==0.7.0" -f https://download.pytorch.org/whl/torchcodec/

为加速模型与依赖的下载,我们将使用 hf_transfer:

!pip install hf_transfer

最后,使用访问令牌登录 Hugging Face Hub。请确保您已在 Hugging Face 账号中生成 API 令牌,并将其存储为环境变量(HF_TOKEN):

import os
from huggingface_hub import login

login(token=os.environ["HF_TOKEN"])

2. 加载 SAM Audio 模型(CUDA 上的 FP16)

此步骤中,我们将下载并加载SAM Audio 基础模型。虽然 SAM Audio 也提供大模型变体,但基础模型在显存占用上轻量许多,分离质量却几乎不逊色。

这使其非常适合本地实验,尤其适用于像 RTX 3090 这样的消费级 GPU。

为避免显存不足(OOM)错误,务必以FP16(半精度)而非 FP32 的方式加载模型。

RTX 3090 对 FP16 支持出色,切换到半精度几乎能将显存占用减半,且对推理质量影响不明显。

import torch
import torchaudio
from pathlib import Path

from sam_audio import SAMAudio, SAMAudioProcessor

MODEL_ID = "facebook/sam-audio-base"  # base model
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model = SAMAudio.from_pretrained(MODEL_ID).eval()

# Use fp16 on GPU to cut VRAM roughly in half (3090 supports fp16 well)
model = model.to(device=device, dtype=torch.float16).eval()

processor = SAMAudioProcessor.from_pretrained(MODEL_ID)

print("Device:", device)
print("Sampling rate:", processor.audio_sampling_rate)

首次运行时,下载可能需要一段时间。SAM Audio 会拉取多个组件与检查点,共同构成完整的音频分割流水线,包括感知编码器与生成式分离模块。这是预期行为,且仅首次发生,文件会在本地缓存以供后续运行使用。

Downloading all the necessary files for the SAM-Audio pipeline

模型加载完成后,建议检查一下 GPU 显存使用情况,确保一切在可控范围内:

!nvidia-smi

您应该会看到,SAM Audio 基础模型大约占用 14 GB 显存,能在 RTX 3090 上轻松容纳。这样便能为推理与实验留出足够余量,不会触发内存问题,使本地音频分割任务的环境更稳定可靠。

SAM-Audio base model only takes 13GB VRAM on half precision.

3. 从 AudioCaps 加载示例音频

要测试 SAM Audio,我们需要一个包含多个重叠声源的真实音频样本。本教程将使用AudioCaps 的一个示例,这是一个广泛用于音频理解与描述生成的基准数据集。

AudioCaps 包含从真实环境收集的短而多样的音频片段,非常适合评估音频分离模型。

我们使用 datasets 库直接从 Hugging Face 加载数据集。样本音频以 Parquet 格式存储,包含波形数据及采样率等元数据。

from datasets import load_dataset
from IPython.display import Audio

# Get an example audio from AudioCaps
dset = load_dataset(
    "parquet",
    data_files="hf://datasets/OpenSound/AudioCaps/data/test-00000-of-00041.parquet",
)

samples = dset["train"][8]["audio"].get_all_samples()
Audio(samples.data, rate=samples.sample_rate)

这段代码会下载 AudioCaps 测试集的一个分片,并提取一个音频片段用于演示。Audio 小部件可让您在笔记本中直接收听原始混合音频,有助于在分割前了解原始音频的复杂程度。听起来如下:

4. 可视化音轨

用耳朵聆听是理解音频混合最快的方式,但可视化波形可以帮助您看清事件发生在何处。

波形图更易于识别高能量时刻(如按喇叭、鼓掌或呼喊)、较安静的区域(停顿或背景噪声),以及常对应短促声音事件的突发尖峰。

一旦开始分离声音,这将尤其有用,因为您可以将原始混合音频与分割产出进行对比,快速验证 SAM Audio 是否提取到了正确的区域。

下面是一个简单的辅助函数,可在固定时长内绘制波形(以保持可读性)。它支持单声道与立体声,并会自动将张量移至 CPU,便于在笔记本中顺畅运行。

import matplotlib.pyplot as plt
import torch

def plot_waveform(wav, sr, title="Waveform", max_seconds=15):
    """
    wav: Tensor [C, T] or [T]
    sr: sample rate (int)
    """
    if isinstance(wav, torch.Tensor):
        w = wav.detach().cpu()
    else:
        w = torch.tensor(wav)

    if w.ndim == 1:
        w = w.unsqueeze(0)

    # limit duration for readability
    max_samples = int(sr * max_seconds)
    w = w[:, :max_samples]

    t = torch.arange(w.shape[1]) / sr

    plt.figure(figsize=(14, 3))
    for c in range(w.shape[0]):
        plt.plot(t, w[c].numpy(), label=f"ch{c}")
    plt.title(title)
    plt.xlabel("Time (s)")
    plt.ylabel("Amplitude")
    if w.shape[0] > 1:
        plt.legend()
    plt.tight_layout()
    plt.show()
plot_waveform(samples.data, samples.sample_rate, title="Traffic noise + Horn")

在此示例中,您通常会注意到代表持续背景噪声(车流)的繁忙、密集的波形,以及常与短促且更响亮的事件(如喇叭声)相匹配的更尖锐的峰值。

Audio wave form with background noise

5. 为推理准备音频

在运行 SAM Audio 之前,我们需要确保输入波形符合模型预期。实践中,来自数据集的原始音频在形状、数据类型(dtype)、声道数与采样率方面可能各不相同。如果跳过这一步,您常会遇到报错(维度不对)、效果变差(采样率不匹配)或浪费 GPU 显存(dtype 不合适)。

我们将标准化以下内容:

  • 形状:SAM Audio 期望的音频格式为[C, T](通道在前)。
  • 精度:先转换为 float32 以便安全处理,然后再与模型 dtype 匹配(在 CUDA 上为 FP16)。
  • 采样率:重采样到模型所需的采样率(从处理器获取)。
  • 声道:转换为单声道,以简化分离并保持推理一致性。
  • 设备与 dtype:将波形移至 GPU,并与模型权重 dtype 保持一致,以避免隐式类型转换和额外内存开销。
wav = torch.tensor(samples.data)

# Ensure [C, T]
if wav.ndim == 1:
    wav = wav.unsqueeze(0)  # [1, T]
elif wav.ndim == 2 and wav.shape[0] > wav.shape[1]:
    wav = wav.transpose(0, 1)  # [T, C] -> [C, T]

wav = wav.float()

orig_sr = int(samples.sample_rate)
target_sr = int(processor.audio_sampling_rate)

if orig_sr != target_sr:
    wav = torchaudio.functional.resample(wav, orig_sr, target_sr)

# Mono
wav = wav.mean(0, keepdim=True)  # [1, T]

# Move to device + match model dtype (FP16 on CUDA)
wav = wav.to(device=device, dtype=next(model.parameters()).dtype)

duration_s = wav.shape[-1] / target_sr
print(f"Resampled duration: {duration_s:.2f}s @ {target_sr} Hz")

如果一切设置正确,您应会看到如下输出:

Resampled duration: 10.00s @ 48000 Hz

这表明:(1)音频时长符合预期;(2)波形已使用模型偏好的采样率。

6. 使用 SAM Audio 进行音频分离

接下来是有趣的部分:我们将实际从原始混音中分离目标声音。SAM Audio 支持使用自然提示来完成这一点,在本示例中,我们将从包含车流噪声与喇叭声的片段中提取“鸣笛声(a horn honking)”。

我们将同时使用两种引导方式:

  • 文本提示(description):告诉模型我们想要什么(“A horn honking”)。
  • 时间片锚点(anchors):告诉模型目标在时间上出现在哪里(以秒为单位)。

这会让分离在混乱的音频或目标声音很短时更可靠。

锚点格式中:

  • + 表示将该时间区域作为目标声音的正证据纳入;
  • [6.3, 7.0] 表示以秒为单位的时间窗(开始、结束)。
description = "A horn honking"
anchors = [[["+", 6.3, 7.0]]]  # batch -> one sample -> one anchor

# (Optional) sanity-check anchors
assert 0 <= anchors[0][0][1] < anchors[0][0][2] <= duration_s + 1e-6, "Anchor out of range!"
inputs = processor(
    audios=[wav],
    descriptions=[description],
    anchors=anchors,
).to(device)

with torch.inference_mode():
    result = model.separate(inputs)
target_np = result.target[0].detach().float().cpu().numpy()
resid_np = result.residual[0].detach().float().cpu().numpy()
Audio(target_np, rate=processor.audio_sampling_rate)

如果一切正常,输出会非常令人惊艳:目标音频应听起来像一段干净的喇叭声轨,大部分背景已被移除。这正是 SAM Audio 的关键理念:无需完美的分轨或手动编辑,您只需用直观的提示引导模型,它就能为您隔离所需声音。下面是听感示例:

用耳朵聆听是最佳证据,但通过波形图也能直观看到发生了什么。

plot_waveform(target_np, processor.audio_sampling_rate, title="Cleand Audio with only Horn")

在已分离的输出中,您通常会看到喇叭出现的位置有清晰的尖峰,而其余波形则相对安静。

cleaned audio waveform

SAM Audio 还会返回残差信号,即移除目标后“剩下的音频”。

plot_waveform(resid_np, processor.audio_sampling_rate, title="Residual Audio with no Horn")

这里我们只能看到车流/背景噪声,不再有喇叭声。

Residual audio waveform

7. 从数据集中再加载一个样本

我们来试一个更难、更接近真实世界的示例。这次我们选择一段非英语使用者在嘈杂背景中通话的音频(街噪、环境声、重叠声音)。

这正是音频分离真正发挥作用的情境:语音存在,但由于混音凌乱而难以听清。

首先,加载一个新样本并收听原始混合音频:

samples_2 = dset["train"][45]["audio"].get_all_samples()
Audio(samples_2.data, rate=samples_2.sample_rate)

接着,可视化该波形。

plot_waveform(samples_2.data, samples_2.sample_rate, title="Background Noise and a Man Talking")

您会在大部分片段中看到密集且高能量的信号,这通常意味着强烈的背景噪声与重叠音频:

Audio waveform visualization

我们将与之前相同地进行预处理:确保形状为 [C, T],重采样到处理器目标采样率,转为单声道,并以 FP16 迁移到 GPU。

# Convert numpy → torch
wav = torch.tensor(samples_2.data)

# Ensure [C, T]
if wav.ndim == 1:
    wav = wav.unsqueeze(0)
elif wav.ndim == 2 and wav.shape[0] > wav.shape[1]:
    wav = wav.transpose(0, 1)

wav = wav.float()

orig_sr = int(samples.sample_rate)
target_sr = int(processor.audio_sampling_rate)

# Resample if needed
if orig_sr != target_sr:
    wav = torchaudio.functional.resample(wav, orig_sr, target_sr)

# Mono
wav = wav.mean(0, keepdim=True)

# Move to GPU + FP16
wav = wav.to(device=device, dtype=next(model.parameters()).dtype)

duration_s = wav.shape[-1] / target_sr
print(f"Duration: {duration_s:.2f}s @ {target_sr} Hz")

您应会看到类似如下的输出:

Duration: 10.00s @ 48000 Hz

在上一个示例中,我们通过时间片锚点与文本提示帮助了模型。这里我们仅使用文本提示,这是测试模型在缺少额外引导时泛化能力的好方法。

description = "A man speaking"

inputs = processor(
    audios=[wav],
    descriptions=[description],
).to(device)

with torch.inference_mode():
    result = model.separate(inputs)
target_np = result.target[0].detach().float().cpu().numpy()

plot_waveform(target_np, processor.audio_sampling_rate, title="Clean Audio with a Man Talking")

最后,绘制已分离语音的波形。与原始混合相比,波形应更干净、不那么“繁忙”,尤其是在早先被背景噪声主导的区域:

Clean audio waveform

如果在执行上述代码时遇到任何问题,请参考下方链接的 DataLab 笔记本,内含完整可运行的参考与更多指导:Using SAM-Audio Locally — DataLab。

SAM Audio 的应用场景

SAM Audio 面向真实世界的音频理解与编辑。它不依赖任务特定工具,而是通过自然提示,在语音、音乐与日常环境中分离并隔离声音。

这些特性使其在需要干净、可控音频的创意、专业与研究工作流程中都颇具价值。

  • 播客与语音录音清理:将说话人与背景噪声和环境声分离,提升播客、采访与语音录音的语音清晰度。
  • 音乐制作与 Stem 提取:从混音曲目中分离人声或单个乐器,用于混音、采样、母带处理或创意声音设计。
  • 影视与视频后期制作:移除诸如车流、风声或人群等不需要的背景声,同时保留对白与重要音效。
  • 无障碍与助听增强:在嘈杂环境中增强语音,有助于助听工具与以无障碍和清晰沟通为目标的应用。
  • 音频研究与声音分析:对复杂的真实世界录音进行分割,用于声学事件检测、音频取证与声景分析等研究任务。

结语

老实说,关于如何在本地实际运行 SAM Audio 的资料并不多。我尝试过在 Kaggle 的 T4 GPU 上运行,但失败了;也尝试过用 UV 和虚拟 Python 环境搭建,同样失败。

我反复遇到的主要问题是依赖冲突。直接从 GitHub 仓库安装 SAM Audio 往往会覆盖现有的音频与 PyTorch 库,从而导致 Jupyter 内核崩溃。

因此我强烈建议从干净环境开始(使用 Conda 或全新的 Python 虚拟环境),先安装 PyTorch 与 CUDA,再添加所需库。在本教程中,一旦通过重新安装正确版本的 torchcodec 解决了崩溃问题,环境就稳定了。

在本教程中,我们成功在 RTX 3090 上运行了 SAM Audio 基础模型,显存占用约 14 GB,对于本地推理来说非常合理。推理速度很快,音频分离质量也相当出色。您还可以将此设置扩展到基于视频的提示,让 SAM Audio 与 SAM 3 协同,根据视觉线索来隔离音频。

想进一步了解 SAM 3,建议查看我们的SAM 3 教程。

SAM Audio 常见问题

在本地运行 SAM Audio 的最低硬件要求是什么?

想要较为从容地运行 SAM Audio 基础模型,需要至少 14–16 GB 显存 的 GPU(如 NVIDIA RTX 3090 或 4080)。

  • 建议:使用 FP16(半精度)模式,可将内存占用降低约 50%。
  • 注意:大模型变体要重得多,通常需要数据中心级 GPU(如 A100)或多块消费级 GPU 才能顺利运行。
SAM Audio 能否立即免费下载和使用?

代码是开源的,但模型权重是受控访问的。未申请访问权限,无法直接运行。

  • 如何获取访问:前往 SAM Audio 的 Hugging Face 页面,接受许可协议并等待审批(通常约 10–30 分钟)。随后需在终端使用 Hugging Face API 令牌登录(huggingface-cli login)。
SAM Audio 实际能分离哪些类型的声音?

与此前仅专注于语音或音乐的模型不同,SAM Audio 是一个“通用”分离器。

  • 可分离:特定乐器(鼓、吉他)、人类语音(即便在嘈杂人群中)、环境声(喇叭、警笛、犬吠)。
  • 可使用:文本提示(如 “A man talking”)、视觉线索(视频掩膜)或基于时间的锚点。
我该使用基础模型还是大模型?

对大多数本地实验与个人开发者而言,基础模型是最佳选择。

  • 基础版:可运行在高端消费级 GPU(RTX 3090/4090)上,分离质量令人印象深刻,足以胜任播客编辑或基础 stem 提取。
  • 大模型:在“干净度”和伪影更少方面略有提升,但显存需求显著更高,若无量化或强大硬件,对多数本地环境并不现实。
Abid Ali Awan

作者

Abid Ali Awan

作为一名持证的数据科学家,我热衷于利用前沿技术打造创新的机器学习应用。凭借在语音识别、数据分析与报告、MLOps、对话式人工智能以及自然语言处理方面的扎实背景,我不断打磨构建智能系统的能力,力求带来切实影响。除技术专长外,我也擅长沟通,能够将复杂概念提炼为清晰、简明的表述。因此,我成为数据科学领域备受关注的博主,与不断壮大的数据专业人士社区分享洞见与实践经验。目前,我专注于内容创作与编辑,借助大语言模型打造有力且吸引人的内容,帮助企业与个人更好地发挥数据价值。

主题