音频课程文档
用于音频分类的预训练模型和数据集
并获得增强的文档体验
开始使用
用于音频分类的预训练模型和数据集
Hugging Face Hub 上有超过 500 个用于音频分类的预训练模型。在本节中,我们将介绍一些最常见的音频分类任务,并为每个任务推荐合适的预训练模型。使用 pipeline()
类,在模型和任务之间切换非常简单——一旦你知道如何为一个模型使用 pipeline()
,你就可以用它来处理 Hub 上的任何模型,无需更改代码!这使得用 pipeline()
类进行实验变得非常快,让你能够迅速为你的需求选择最佳的预训练模型。
在我们深入探讨各种音频分类问题之前,让我们快速回顾一下通常使用的 Transformer 架构。标准的音频分类架构是基于任务的性质而设计的;我们希望将一个音频输入序列(即我们的输入音频数组)转换成一个单一的类别标签预测。仅编码器(encoder-only)模型首先通过一个 Transformer 块传递输入,将输入音频序列映射到一个隐藏状态表示序列。然后,这个隐藏状态表示序列通过取所有隐藏状态的平均值,并将得到的向量传递给一个线性分类层,从而映射到一个类别标签输出。因此,对于音频分类,人们偏爱使用仅编码器模型。
仅解码器(decoder-only)模型给任务带来了不必要的复杂性,因为它们假定输出也可以是一个预测序列(而不是单个类别标签预测),因此会生成多个输出。因此,它们的推理速度较慢,通常不被使用。编码器-解码器(encoder-decoder)模型也因同样的原因而基本被忽略。这些架构选择与自然语言处理(NLP)中的选择类似,在 NLP 中,像 BERT 这样的仅编码器模型更适合序列分类任务,而像 GPT 这样的仅解码器模型则保留给序列生成任务。
现在我们已经回顾了音频分类的标准 Transformer 架构,让我们开始探索音频分类的不同子集,并介绍最流行的模型!
🤗 Transformers 安装
在撰写本文时,音频分类 pipeline 所需的最新更新仅在 🤗 Transformers 仓库的 main
分支上,而不在最新的 PyPi 版本中。为确保我们在本地拥有这些更新,我们将使用以下命令从 main
分支安装 Transformers:
pip install git+https://github.com/huggingface/transformers
关键词识别
关键词识别(Keyword spotting, KWS)是在一段口语中识别出关键词的任务。所有可能的关键词构成了预测的类别标签集。因此,要使用预训练的关键词识别模型,你应该确保你的关键词与模型预训练时所用的关键词相匹配。下面,我们将介绍两个用于关键词识别的数据集和模型。
Minds-14
让我们继续使用你在上一个单元中探索过的 MINDS-14 数据集。如果你还记得,MINDS-14 包含了人们用多种语言和方言向电子银行系统提问的录音,并为每个录音提供了 intent_class
(意图类别)。我们可以根据通话的意图对录音进行分类。
from datasets import load_dataset
minds = load_dataset("PolyAI/minds14", name="en-AU", split="train")
我们将加载 checkpoint "anton-l/xtreme_s_xlsr_300m_minds14"
,这是一个在 MINDS-14 上微调了大约 50 个 epoch 的 XLS-R 模型。它在 MINDS-14 的所有语言的评估集上达到了 90% 的准确率。
from transformers import pipeline
classifier = pipeline(
"audio-classification",
model="anton-l/xtreme_s_xlsr_300m_minds14",
)
最后,我们可以将一个样本传递给分类 pipeline 来进行预测
classifier(minds[0]["audio"])
输出
[
{"score": 0.9631525278091431, "label": "pay_bill"},
{"score": 0.02819698303937912, "label": "freeze"},
{"score": 0.0032787492964416742, "label": "card_issues"},
{"score": 0.0019414445850998163, "label": "abroad"},
{"score": 0.0008378693601116538, "label": "high_value_payment"},
]
太棒了!我们识别出这次通话的意图是支付账单,概率为 96%。你可以想象这种关键词识别系统被用作自动化呼叫中心的第一阶段,我们希望根据客户的查询对来电进行分类,并相应地为他们提供情境化支持。
语音指令
Speech Commands 是一个口语词汇的数据集,旨在评估音频分类模型在简单命令词上的表现。该数据集包含 15 个关键词类别,一个静音类别,以及一个包含假阳性的未知类别。这 15 个关键词是单个词,通常用于设备端控制基本任务或启动其他进程。
一个类似的模型正在你的手机上持续运行。这里,我们没有单个命令词,而是有特定于你设备的“唤醒词”,例如“Hey Google”或“Hey Siri”。当音频分类模型检测到这些唤醒词时,它会触发你的手机开始监听麦克风,并使用语音识别模型来转录你的语音。
音频分类模型比语音识别模型要小得多、轻量得多,通常只有几百万个参数,而语音识别模型则有数亿个。因此,它可以在你的设备上持续运行而不会耗尽电池!只有当检测到唤醒词时,才会启动更大的语音识别模型,之后它会再次关闭。我们将在下一个单元中介绍用于语音识别的 Transformer 模型,所以到课程结束时,你应该具备构建自己的语音激活助手所需的工具!
与 Hugging Face Hub 上的任何数据集一样,我们可以在不下载或将其加载到内存的情况下,了解它包含的音频数据类型。在 Hub 上访问 Speech Commands 的数据集卡片后,我们可以使用数据集查看器滚动浏览数据集的前 100 个样本,听取音频文件并检查任何其他元数据信息。

数据集预览是在决定使用某个音频数据集之前体验它的绝佳方式。你可以选择 Hub 上的任何数据集,滚动浏览样本,并收听不同子集和分割的音频,以判断它是否适合你的需求。一旦你选定了数据集,加载数据以便开始使用就变得非常简单。
让我们就这样做,使用流式模式加载 Speech Commands 数据集的一个样本:
speech_commands = load_dataset(
"speech_commands", "v0.02", split="validation", streaming=True
)
sample = next(iter(speech_commands))
我们将加载一个官方的 Audio Spectrogram Transformer checkpoint,它在 Speech Commands 数据集上进行了微调,其命名空间为 "MIT/ast-finetuned-speech-commands-v2"
classifier = pipeline(
"audio-classification", model="MIT/ast-finetuned-speech-commands-v2"
)
classifier(sample["audio"].copy())
输出
[{'score': 0.9999892711639404, 'label': 'backward'},
{'score': 1.7504888774055871e-06, 'label': 'happy'},
{'score': 6.703040185129794e-07, 'label': 'follow'},
{'score': 5.805884484288981e-07, 'label': 'stop'},
{'score': 5.614546694232558e-07, 'label': 'up'}]
酷!看起来这个样本以高概率包含了单词“backward”。我们可以听一下这个样本来验证这是否正确
from IPython.display import Audio
Audio(sample["audio"]["array"], rate=sample["audio"]["sampling_rate"])
现在,你可能想知道我们是如何选择这些预训练模型来在这些音频分类示例中向你展示的。事实是,为你的数据集和任务找到预训练模型非常直接!我们首先需要做的是访问 Hugging Face Hub 并点击“Models”选项卡:https://huggingface.co/models
这将显示 Hugging Face Hub 上的所有模型,按过去 30 天的下载量排序

你会注意到在左侧,我们有一系列选项卡,可以选择按任务、库、数据集等筛选模型。向下滚动并从音频任务列表中选择“Audio Classification”任务

我们现在看到了 Hub 上 500 多个音频分类模型的子集。为了进一步筛选这个选择,我们可以按数据集筛选模型。点击“Datasets”选项卡,然后在搜索框中输入“speech_commands”。当你开始输入时,你会看到 speech_commands
的选项出现在搜索框下方。你可以点击这个按钮,将所有音频分类模型筛选为那些在 Speech Commands 数据集上微调过的模型

太棒了!我们看到,对于这个特定的数据集和任务,我们有 6 个预训练模型可用。你会认出这些模型中的第一个就是我们在上一个示例中使用的 Audio Spectrogram Transformer checkpoint。在 Hub 上筛选模型的这个过程,正是我们选择 checkpoint 来向你展示的方式!
语种识别
语种识别(Language identification, LID)是从候选语言列表中识别出音频样本中所说语言的任务。LID 可以在许多语音处理流水线中扮演重要角色。例如,对于一个未知语言的音频样本,可以使用 LID 模型来分类音频样本中所说的语言,然后选择一个在该语言上训练过的合适的语音识别模型来转录音频。
FLEURS
FLEURS (Few-shot Learning Evaluation of Universal Representations of Speech) 是一个用于评估 102 种语言语音识别系统的数据集,其中包括许多被归类为“低资源”的语言。请查看 Hub 上的 FLEURS 数据集卡片,并探索其中包含的不同语言:google/fleurs。你能在里面找到你的母语吗?如果找不到,最接近的语言是什么?
让我们使用流式模式从 FLEURS 数据集的验证集中加载一个样本:
fleurs = load_dataset("google/fleurs", "all", split="validation", streaming=True)
sample = next(iter(fleurs))
太棒了!现在我们可以加载我们的音频分类模型。为此,我们将使用一个在 FLEURS 数据集上微调过的 Whisper 版本,它目前是 Hub 上性能最好的 LID 模型。
classifier = pipeline(
"audio-classification", model="sanchit-gandhi/whisper-medium-fleurs-lang-id"
)
然后我们可以将音频通过我们的分类器并生成一个预测:
classifier(sample["audio"])
输出
[{'score': 0.9999330043792725, 'label': 'Afrikaans'},
{'score': 7.093023668858223e-06, 'label': 'Northern-Sotho'},
{'score': 4.269149485480739e-06, 'label': 'Icelandic'},
{'score': 3.2661141631251667e-06, 'label': 'Danish'},
{'score': 3.2580724109720904e-06, 'label': 'Cantonese Chinese'}]
我们可以看到,模型以极高的概率(接近 1)预测该音频为南非荷兰语。FLEURS 数据集包含来自多种语言的音频数据——我们可以看到可能的类别标签包括北索托语、冰岛语、丹麦语和粤语等。你可以在数据集卡片上找到完整的语言列表:google/fleurs。
交给你了!你能在 Hub 上为 FLEURS LID 找到其他什么 checkpoint 吗?它们在底层使用了哪些 Transformer 模型?
零样本音频分类
在传统的音频分类范式中,模型从一个*预定义*的可能类别集合中预测一个类别标签。这为使用预训练模型进行音频分类设置了障碍,因为预训练模型的标签集必须与下游任务的标签集相匹配。对于前面的 LID 示例,模型必须预测其训练时所用的 102 个语种类别的其中之一。如果下游任务实际上需要 110 种语言,模型将无法预测这 110 种语言中的 8 种,因此需要重新训练才能实现完全覆盖。这限制了迁移学习在音频分类任务中的有效性。
零样本音频分类是一种方法,它将一个在一组有标签样本上训练的预训练音频分类模型,使其能够对来自先前未见过的类别的新样本进行分类。让我们看看如何实现这一点!
目前,🤗 Transformers 支持一种用于零样本音频分类的模型:CLAP 模型。CLAP 是一个基于 Transformer 的模型,它同时接收音频和文本作为输入,并计算两者之间的*相似度*。如果我们传递一个与音频输入高度相关的文本输入,我们将得到一个高相似度分数。相反,传递一个与音频输入完全无关的文本输入将返回一个低相似度。
我们可以利用这种相似度预测来进行零样本音频分类,方法是向模型传递一个音频输入和多个候选标签。模型将为每个候选标签返回一个相似度分数,我们可以选择得分最高的那个作为我们的预测。
让我们举个例子,我们使用一个来自环境语音挑战(ESC)数据集的音频输入。
dataset = load_dataset("ashraq/esc50", split="train", streaming=True)
audio_sample = next(iter(dataset))["audio"]["array"]
然后我们定义我们的候选标签,它们构成了可能的分类标签集。模型将为我们定义的每个标签返回一个分类概率。这意味着我们需要*先验地*知道我们分类问题中可能的标签集,以便正确的标签包含在该集合中,从而被赋予一个有效的概率分数。请注意,我们可以将完整的标签集传递给模型,也可以传递我们认为包含正确标签的手动选择的子集。传递完整的标签集会更详尽,但代价是分类准确率较低,因为分类空间更大(前提是正确的标签在我们选择的标签子集中)。
candidate_labels = ["Sound of a dog", "Sound of vacuum cleaner"]
我们可以将两者都输入到模型中,以找到与音频输入*最相似*的候选标签。
classifier = pipeline(
task="zero-shot-audio-classification", model="laion/clap-htsat-unfused"
)
classifier(audio_sample, candidate_labels=candidate_labels)
输出
[{'score': 0.9997242093086243, 'label': 'Sound of a dog'}, {'score': 0.0002758323971647769, 'label': 'Sound of vacuum cleaner'}]
好的!模型似乎很确定我们听到的是狗的声音——它以 99.96% 的概率预测了它,所以我们就以此为预测。让我们听听音频样本来确认我们是否正确(别把音量调得太高,否则你可能会被吓一跳!)
Audio(audio_sample, rate=16000)
完美!我们听到了狗叫声 🐕,这与模型的预测一致。你可以尝试使用不同的音频样本和不同的候选标签进行实验——你能否定义一组标签,在整个 ESC 数据集上都有很好的泛化能力?提示:想一想在哪里可以找到关于 ESC 中可能声音的信息,并据此构建你的标签!
你可能想知道,为什么我们不把零样本音频分类 pipeline 用于**所有**音频分类任务?看起来我们可以通过*先验地*定义合适的类别标签来对任何音频分类问题进行预测,从而绕开了我们的分类任务需要与模型预训练时所用标签相匹配的限制。这归结于零样本 pipeline 中使用的 CLAP 模型的性质:CLAP 是在*通用*音频分类数据上预训练的,类似于 ESC 数据集中的环境声音,而不是像我们在 LID 任务中那样的专门针对语音数据。如果你给它英语语音和西班牙语语音,CLAP 会知道这两个例子都是语音数据 🗣️ 但它无法像专门的 LID 模型那样区分这两种语言。
接下来呢?
我们已经介绍了一些不同的音频分类任务,并展示了最相关的数据集和模型,你可以从 Hugging Face Hub 下载它们,并使用 pipeline()
类仅需几行代码即可使用。这些任务包括关键词识别、语种识别和零样本音频分类。
但是,如果我们想做一些**新**的事情呢?我们已经广泛地研究了语音处理任务,但这只是音频分类的一个方面。另一个流行的音频处理领域涉及**音乐**。虽然音乐的固有特征与语音不同,但我们已经学到的许多相同原理也可以应用于音乐。
在下一节中,我们将通过一个分步指南,向你展示如何使用 🤗 Transformers 在音乐分类任务上微调一个 Transformer 模型。到最后,你将拥有一个微调好的 checkpoint,可以将其插入到 pipeline()
类中,使你能够以与我们在这里分类语音完全相同的方式来分类歌曲!