音频分类的预训练模型和数据集
Hugging Face Hub 托管着 500 多个用于音频分类的预训练模型。在本节中,我们将介绍一些最常见的音频分类任务,并为每项任务推荐合适的预训练模型。使用 pipeline()
类,在模型和任务之间切换非常简单 - 一旦您了解了如何对一个模型使用 pipeline()
,您就可以在 Hub 上将其用于任何模型而无需更改代码!这使得使用 pipeline()
类进行实验变得非常快,您可以快速选择最适合您需求的预训练模型。
在深入探讨各种音频分类问题之前,让我们快速回顾一下通常使用的 Transformer 架构。标准的音频分类架构受任务性质的启发;我们希望将音频输入序列(即我们的输入音频数组)转换为单个类别标签预测。仅编码器模型首先通过传递 Transformer 块中的输入来将输入音频序列映射到隐藏状态表示序列。然后,通过对隐藏状态取平均值并将结果向量通过线性分类层,将隐藏状态表示序列映射到类别标签输出。因此,对于音频分类,更倾向于使用仅编码器模型。
仅解码器模型为任务引入了不必要的复杂性,因为它们假设输出也可以是预测的序列(而不是单个类别标签预测),因此会生成多个输出。因此,它们的推理速度较慢,并且往往不会被使用。编码器-解码器模型由于相同的原因而被大量忽略。这些架构选择类似于 NLP 中的选择,其中仅编码器模型(如 BERT)更适合序列分类任务,而仅解码器模型(如 GPT)保留用于序列生成任务。
现在我们已经回顾了音频分类的标准 Transformer 架构,让我们进入不同的音频分类子集并介绍最流行的模型吧!
🤗 Transformers 安装
在撰写本文时,音频分类管道所需的最新更新仅位于 🤗 Transformers 存储库的 main
版本上,而不是最新的 PyPi 版本上。为了确保我们本地拥有这些更新,我们将使用以下命令从 main
分支安装 Transformers
pip install git+https://github.com/huggingface/transformers
关键词识别
关键词识别 (KWS) 是在语音话语中识别关键词的任务。可能的关键词集构成预测类别标签集。因此,要使用预训练的关键词识别模型,您应该确保您的关键词与模型预训练的关键词匹配。下面,我们将介绍两个用于关键词识别的数据集和模型。
Minds-14
让我们继续使用您在上一个单元中探索过的相同 MINDS-14 数据集。如果您还记得,MINDS-14 包含人们用多种语言和方言向电子银行系统提问的录音,并且每个录音都有 intent_class
。我们可以根据电话的意图对录音进行分类。
from datasets import load_dataset
minds = load_dataset("PolyAI/minds14", name="en-AU", split="train")
我们将加载检查点 "anton-l/xtreme_s_xlsr_300m_minds14"
,这是一个在 MINDS-14 上微调了大约 50 个周期的 XLS-R 模型。它在评估集上对来自 MINDS-14 的所有语言实现了 90% 的准确率。
from transformers import pipeline
classifier = pipeline(
"audio-classification",
model="anton-l/xtreme_s_xlsr_300m_minds14",
)
最后,我们可以将样本传递给分类管道以进行预测
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%。您可以想象这种关键词识别系统用作自动呼叫中心的第一个阶段,我们希望根据客户的查询对传入的客户电话进行分类,并相应地为他们提供情境化的支持。
语音命令
语音命令是一个包含口语单词的数据集,旨在评估音频分类模型在简单命令词上的性能。该数据集包含 15 类关键词、一个用于静音的类别和一个用于包含误报的未知类别。这 15 个关键词是通常在设备上用于控制基本任务或启动其他进程的单个单词。
类似的模型会持续运行在您的手机上。在这里,我们没有单个命令词,而是有特定于您的设备的“唤醒词”,例如“你好 Google”或“你好 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))
我们将加载一个在 Speech Commands 数据集上微调的官方音频频谱图 Transformer检查点,位于命名空间"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 并点击“模型”选项卡:https://huggingface.co/models
这将显示 Hugging Face Hub 上的所有模型,按过去 30 天的下载量排序。
您会在左侧注意到我们有一系列选项卡,可以选择按任务、库、数据集等筛选模型。向下滚动并从音频任务列表中选择任务“音频分类”。
现在,我们看到了 Hub 上 500 多个音频分类模型的子集。为了进一步细化此选择,我们可以按数据集筛选模型。点击“数据集”选项卡,并在搜索框中输入“speech_commands”。当您开始输入时,您会看到 speech_commands
的选择出现在搜索选项卡下方。您可以点击此按钮将所有音频分类模型过滤为在 Speech Commands 数据集上微调的模型。
太好了!我们看到我们有 6 个预训练模型可用于此特定数据集和任务。您会认识到这些模型中的第一个,即我们在前面示例中使用的音频频谱图 Transformer 检查点。这个在 Hub 上筛选模型的过程正是我们选择要向您展示的检查点的方式!
语言识别
语言识别 (LID) 是从候选语言列表中识别音频样本中所用语言的任务。LID 可以成为许多语音管道的重要组成部分。例如,给定一个未知语言的音频样本,可以使用 LID 模型对音频样本中使用的语言进行分类,然后选择在此语言上训练的适当语音识别模型来转录音频。
FLEURS
FLEURS(语音通用表示的少样本学习评估)是一个用于评估 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 的检查点?它们在内部使用哪些 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 中可能声音的信息并相应地构建您的标签!
你可能想知道为什么我们不将零样本音频分类管道用于**所有**音频分类任务?看起来,我们可以通过预先定义适当的类别标签来对任何音频分类问题进行预测,从而绕过分类任务需要与模型预训练标签匹配的限制。这归结于零样本管道中使用的CLAP模型的性质:CLAP是在通用音频分类数据上进行预训练的,类似于ESC数据集中的环境声音,而不是像LID任务中那样专门的语音数据。如果你给它英语语音和西班牙语语音,CLAP会知道这两个例子都是语音数据🗣️,但它无法像专门的LID模型那样区分这些语言。
接下来做什么?
我们已经介绍了许多不同的音频分类任务,并展示了您可以从Hugging Face Hub下载的最相关的数据集和模型,并使用pipeline()
类只需几行代码即可使用它们。这些任务包括关键词识别、语言识别和零样本音频分类。
但是,如果我们想做一些新的事情呢?我们已经在语音处理任务上进行了大量的工作,但这只是音频分类的一个方面。另一个流行的音频处理领域涉及音乐。虽然音乐本质上具有与语音不同的特征,但我们已经了解到的许多相同原理可以应用于音乐。
在下一节中,我们将逐步指导您如何使用🤗 Transformers对音乐分类任务进行Transformer模型的微调。到最后,您将拥有一个微调的检查点,您可以将其插入pipeline()
类,从而能够像我们在这里对语音进行分类一样对歌曲进行分类!