Google 最近发布了 Gemini Embedding 2,这是他们的首个原生多模态向量模型。文本、图像、视频、音频、文档,全都被映射到了同一个 3072 维的向量空间中。这是**全能型向量模型 (omni embedding models)** 这一大趋势的一部分:从 jina-embeddings-v4 到 Omni-Embed-Nemotron 再到 Omni-5,这些统一模型在单一架构中处理所有模态。

引起我们关注的是音频。大多数人听到“多模态向量模型”时会想到图像,或许还有视频。音频是被遗忘的模态:更难收集,更难标注,且研究人员较少。在 Jina AI,我们恰好探索过这个问题,作为我们全能向量模型研发工作的一部分,我们构建了小型(参数量 < 1.2B)音频向量模型。Gemini Embedding 2 的发布是一个分享我们在此过程中所学经验的好时机。
音频向量模型
一个音频向量模型是一个音频剪辑的固定长度向量表示。给定一个原始波形,模型会生成一个稠密向量(通常为 768 到 3072 维),用于捕获声音的语义内容。含义相似的两个剪辑会产生相似的向量,且在共享的向量模型空间中,音频剪辑会靠近其对应的文本描述。这是全能向量模型拼图中的一块:一旦你能将音频与文本、图像一起嵌入到同一个向量空间中,你就能解锁跨越所有模态的跨模态检索。
自 2022 年以来的主流方法是 对比性语言-音频预训练 (CLAP),它将 CLIP 扩展到了音频领域。LAION-CLAP 通过 630K 对数据和特征融合扩大了这一规模。最强的变体(Elizalde et al., 2023)在 250M 参数量下,使用跨 22 个不同音频任务的音频编码器配合自回归解码器,在 4.6M 对数据上进行训练,在 AudioCaps 上达到了 42.0 的 cvR@5。
我们采取了不同的路线:将已经理解音频的多模态大模型转化为向量模型。
架构
首先看输入和输出。输入是原始音频:从任何标准格式(WAV、MP3、FLAC)解码并重采样为 16kHz 单声道的波形。音频编码器将该波形转换为 128-bin 的 log-mel 声谱图,然后将其处理为特征词元序列,速率约为每秒 150 个词元。一段 10 秒的剪辑大约会变成 1,500 个词元。最大输入长度为 30 秒;更长的音频需要分段。输出是一个单一的稠密向量(即向量模型输出的向量),根据大模型主干网络的大小,通常为 896 到 3584 维。
我们从 Qwen2.5-Omni 开始,这是一个具有原生音频理解能力的多模态大模型。它包含三个部分:一个通过约 4.5M 的线性投影将波形转换为特征向量的音频编码器(约 0.6-0.8B 参数);一个同时处理音频特征和文本词元的大模型主干网络(0.5-7B 参数),每个 Transformer 层增加约 0.2B 参数;以及一个将最后一个隐藏状态均值池化为单个向量模型向量的池化层。两种模态共享相同的大模型主干网络,因此它们在预训练阶段就已经大致对齐。

训练目标是 InfoNCE 对比损失。每种模态被独立编码,双向计算损失并取平均:
def training_step(audio_batch, text_batch):
audio_embeds = model.encode_audio(audio_batch) # [B, D]
text_embeds = model.encode_text(text_batch) # [B, D]
audio_embeds = F.normalize(audio_embeds, dim=-1)
text_embeds = F.normalize(text_embeds, dim=-1)
sim = audio_embeds @ text_embeds.T / temperature # [B, B]
labels = torch.arange(len(sim), device=sim.device)
loss = (F.cross_entropy(sim, labels) +
F.cross_entropy(sim.T, labels)) / 2
return loss
训练数据
五个音频-文本对数据集,总计 18.1 万个样本:
| Dataset | Samples | Description |
|---|---|---|
| AudioSetStrong | 108K | Temporally-labeled events, GPT-generated captions (subset of AudioSet) |
| FSD50K | 41K | Human-labeled sound events, 200 classes |
| Clotho | 19K | Audio captioning, detailed descriptions |
| UrbanSound8K | 9K | Urban sound classification |
| MACS | 4K | Urban acoustic scenes |
CLAP 使用了完整的 AudioSet(200 万+ 音频)以及其他来源,总计 460 万对数据。我们仅使用了 AudioSetStrong(约 10 万)。从预训练的多模态大模型开始,可以大幅减少所需的数据量。
def load_sample(audio_path, caption):
waveform, sr = torchaudio.load(audio_path)
waveform = torchaudio.transforms.Resample(sr, 16000)(waveform)
audio_inputs = processor.feature_extractor(
waveform, sampling_rate=16000, return_tensors="pt"
)
text_inputs = processor.tokenizer(caption, padding=True, return_tensors="pt")
return audio_inputs, text_inputs
四种方法
目标:打造一款参数量低于 1.2B 且优于 CLAP 的音频向量模型。
**全模型微调。** 在音频-文本对上微调 Qwen2.5-Omni-7B:AudioCaps T2A cvR@5 = 63.2,Clotho T2A = 39.2。这是上限,但 7B 是无法部署的。Tevatron 2.0 同样仅在 AudioCaps 上进行了微调(61.2,但在 Clotho 上仅为 11.9,显示出单一数据集训练的泛化能力较差)。ColQwen-Omni 在没有任何音频数据的情况下在视觉文档任务上进行了微调,通过跨模态迁移达到了 37.4。
**层剪枝。** 从 7B 模型中移除 Transformer 层。每一层约为 0.2B,因此一个 10 层的模型总计约为 3.5B。

| Layers | Params | AudioCaps T2A cvR@5 | Clotho T2A cvR@5 |
|---|---|---|---|
| 20 | 5.8B | 63.2 | 39.2 |
| 10 | 3.5B | 58.2 | 36.5 |
| 5 | 2.3B | 56.0 | 36.0 |
Batch size(32、64、128)没有产生实质性的影响。较大的 Batch size 最初会有所帮助,但后期可能会导致性能下降:128 的 Batch size 在 Clotho 上于 2K 步时达到 31.3 NDCG,但在 10K 步时降至 29.3。
**仅文本模态迁移。** 仅在文本对(MultiNLI、SNLI、FEVER、SciFact)上进行微调,依靠预训练的跨模态对齐。这在完整的 7B 模型上有效(AudioCaps 46.1,优于 CLAP 的 42.0),但在剪枝后的 10 层模型上完全失败(cvR@5 = 5.9)。跨模态连接分布在整个网络中,在剪枝后无法存续。
**模块组合。** 突破点:从一个模型中提取音频编码器,并从另一个模型中提取一个小模型大模型,甚至是跨模型系列的。Qwen2.5-Omni 分三个阶段进行训练:(1) 固定大模型,训练音频/视觉编码器;(2) 所有参数解除固定;(3) 32K 上下文。我们组合了来自不同阶段的模块:
| Config | Audio Encoder | LLM | Params |
|---|---|---|---|
| M1 | Qwen3-Omni (0.6B, pre-stage-1) | Qwen2.5-0.5B | 1.1B |
| M2 | Qwen3-Omni (0.6B, pre-stage-1) | Qwen2.5-3B | 3.6B |
| M3 | Qwen2.5-Omni-3B (0.8B, post-stage-3) | Qwen2.5-3B | 3.8B |
| M4 | Qwen2.5-Omni-3B (full) | Full 3B | 3.8B |
实现细节:Qwen3-Omni 使用 Qwen3OmniMoePreTrainedModel,而独立的 Qwen3 使用 Qwen3ForCausalLM。我们初始化了一个具有匹配维度的 Omni 模型壳,并将权重复制到相应的位置。

评估
评估音频向量模型从根本上说是关于检索质量:给定一个文本查询,模型能否找到正确的音频剪辑?核心挑战在于“正确”取决于数据集。AudioCaps 拥有具体的描述(“一个男人在说话,接着是关门声”),而 Clotho 则拥有抽象的说明(“伴有远处轰鸣声的安静氛围”)。一个只会死记硬背表面音频特征的模型在 AudioCaps 上会表现良好,但在 Clotho 上会感到吃力。我们最关心的是跨描述风格的泛化能力。
CV-Recall@5 (cvR@5):对于每个文本查询,检查前 5 个结果中是否包含正确的音频剪辑。所有查询的二进制分数的平均值。这是 MTEB 音频检索中的标准指标。
def evaluate_cvr_at_k(model, dataset, k=5):
audio_embeds = model.encode_audio(dataset.audio_clips)
text_embeds = model.encode_text(dataset.text_queries)
sim = F.normalize(audio_embeds) @ F.normalize(text_embeds).T
hits = 0
for i in range(len(dataset.text_queries)):
top_k = sim[:, i].argsort(descending=True)[:k]
if dataset.ground_truth[i] in top_k:
hits += 1
return hits / len(dataset.text_queries)
来自 MTEB 的三个评估数据集:AudioCaps(源自视频,人工标注)、AudioSetStrong(带时间标签,GPT 描述)、Clotho(多样化的抽象描述)。CLAP 使用了完整的 AudioSet(200 万+ 数据),而我们使用了 AudioSetStrong(约 10 万数据),这在一定程度上解释了 CLAP 在该基准测试中的优势。

应用场景
音频向量模型的应用正日益超越传统的检索领域。在智能体系统中,音频向量模型可以实现意图路由:接收语音输入的智能体可以将音频转换为向量,并根据语义相似度将其路由到正确的工具或子智能体,而无需等待完整的转录。声音事件分类为工业环境下的实时监控、智能家居自动化和安防系统提供了动力。在多模态智能体工作流中,音频向量模型让智能体能够像处理文本和图像一样,对音频内容进行搜索、对比和推理。音乐和媒体应用利用它们进行相似性搜索、版权检测和内容推荐。随着语音接口成为 AI 智能体的默认交互模式,能在设备端运行的小型音频向量模型对于低延迟、保护隐私的应用变得至关重要。
结论
从预训练的多模态大模型(MLLM)开始是提升性能最关键的手段。它在一个包中提供了跨模态对齐、强大的文本编码器和性能出色的音频编码器。模块组合是最有前景的方向:将来自不同模型和训练阶段的音频编码器与大模型结合,开启了一个几乎从未被探索过的设计空间。我们的模型在 AudioCaps 上占据主导地位,但在 Clotho 上仅与 CLAP 持平,Clotho 抽象的描述暴露了 AudioCaps 未能发现的弱点。跨模态迁移在模型压缩后无法很好地保持。
这项工作是迈向全能向量模型(omni embedding model)的一步:即用单一模型将文本、图像、音频、视频和文档嵌入到统一的检索空间中。模块组合方法表明,通过重用预训练组件,可以高效地启动新模态。接下来的步骤包括:开发激活参数量小于 5 亿(500M)的 MoE 架构,将模块组合与模态迁移结合,以及通过 WavCaps、MusicCaps 和语音数据集扩大数据规模。






