转载自:https://huggingface.co/learn/audio-course/en/

Audio课程(二)- 音频应用的入门介绍

  • 声音分类(Audio classification):将音频片段分入不同的类别。我们可以认出该音频是汪汪的狗叫声、喵喵的猫叫声,或者某个特定的音乐风格。
  • 自动语音识别(Automatic speech recognition, ASR):将语音片段自动转录成文字。你可以将一段对话自动转化为文字稿,例如一段“你今天怎么样?”的录音。对于做笔记会很有用!
  • 说话人识别(Speaker diarization):想知道录音里在说话的人是谁吗?我们可以利用🤗 Transformers来识别出一段录音中正在说话的人的身份,例如在一段对话的录音中识别出Alice和Bob各自说话的部分。
  • 由文字生成语音(Text to speech, TTS):由一段文字合成其对应的语音,例如生成一本有声书,语音助手,或者给游戏中的NPC配音。利用🤗 Transformers,你可以轻松地做到!

利用pipeline进行音频分类

音频分类任务需要根据音频的内容对其进行单个和多个标签的识别。这些标签可以代表不同的声音类别,如音乐、语音或噪音,也可以代表更细分的分类,如鸟叫声和引擎声等。

在深入了解音频Transformer的细节和微调(fine-tuning)之前,我们先来看看如何使用🤗 Transformers和现成的预训练模型,在几行代码中构建一个音频分类器。

我们使用和前几个单元相同的MINDS-14 数据集。回忆一下,MINDS-14数据集的内容是许多不同语言和方言的使用者向一个网银系统提问的录音。其标签包含了intent_class,记录了该次对话的目的。dataset that you have explored

和之前一样,我们先加载en-AU子集来测试我们的pipeline,将其上采样至音频模型常见的16千赫兹采样率。

1
2
3
4
5
from datasets import load_dataset
from datasets import Audio

minds = load_dataset("PolyAI/minds14", name="en-AU", split="train")
minds = minds.cast_column("audio", Audio(sampling_rate=16_000))

我们可以使用🤗 Transformers中的audio-classification pipeline来构建一个将音频分入一个类别集的任务。在我们的设定下,我们需要一个已经针对音频的目的分类在MINDS-14数据集上微调过的模型。运气好的是,在🤗 Hub中已经有了一个这样的模型!让我们使用pipeline()函数来加载该模型:

1
2
3
4
5
6
from transformers import pipeline

classifier = pipeline(
"audio-classification",
model="anton-l/xtreme_s_xlsr_300m_minds14",
)

这个pipeline需要以NumPy数组形式输入的音频数据。对于原始音频数据的预处理操作则已经包含在了该pipeline中。让我们拿一个样本来测试一下:

1
example = minds[0]

回忆一下数据集的结构,我们的原始音频数据是以NumPy数组的形式存储在["audio"]["array"]中的。我们将其直接传递给classifier:

1
classifier(example["audio"]["array"])

输出:

1
2
3
4
5
6
7
[
{"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"},
]

模型非常确信,在这个样本中,顾客的目的是了解关于账单的信息。让我们来看看该样本的真实标签:

1
2
id2label = minds.features["intent_class"].int2str
id2label(example["intent_class"])

输出

1
"pay_bill"

好耶!模型预测正确!我们很幸运地找到了一个预测标签和我们需要的标签完全相同的预训练模型。很多时候,我们所找的预训练模型可以预测的标签集和我们所需要的标签集不会完全相同。这种情况下,我们需要对该预训练模型进行微调fine-tuning),来将其“校准”到我们需要的标签集上。我们在接下来的单元中会学到微调相关的知识。现在,我们来看看另一个语音处理中常见的任务:自动语音识别

利用pipeline进行自动语音识别

自动语音识别Automatic Speech Recognition, ASR)是一个将录音转录为文字的任务。该任务有许多非常实用的应用,包括生成视频字幕、语音助手Siri、Alexa等的语音指令功能等等。

本小节中,我们将使用automatic-speech-recognition pipeline来转录MINDS-14数据集中一段用户询问账单信息的录音。

首先,我们根据利用pipeline进行音频分类一节的方法加载数据并上采样至16千赫兹。

接下来,我们利用🤗 Transformers中的automatic-speech-recognition pipeline来构建自动语音识别的任务:

1
2
3
from transformers import pipeline

asr = pipeline("automatic-speech-recognition")

下面,我们从数据集中选取一个样本,并将该样本的原始音频数据传递给pipeline:

1
2
example = minds[0]
asr(example["audio"]["array"])

输出

1
{"text": "I WOULD LIKE TO PAY MY ELECTRICITY BILL USING MY COD CAN YOU PLEASE ASSIST"}

我们可以将模型转录的结果和该样本标签中真实的转录文字进行对比:

1
example["english_transcription"]

输出:

1
"I would like to pay my electricity bill using my card can you please assist"

看起来模型在文字转录上的效果还不错!和原始转录相比,仅有一个词(card)转录错误。考虑到用户使用的澳大利亚方言中“r”通常不发音,这个结果已经很不错了。 不过我并不推荐用一条鱼来支付你的下一张电费账单就是了!(译注:cod为鳕鱼)

在默认条件下,该pipeline使用的是一个针对英语语言的自动语音识别模型,这在本例中是可以的。如果你想尝试转录MINDS-14数据集中其他语言的子集,你可以在🤗 Hub上找到一个预训练的ASR模型。你可以首先按任务过滤模型列表,然后再按语言过滤。一旦你找到了喜欢的模型,将其名称作为model参数传递给pipeline即可。

让我们尝试一下MINDS-14数据集中德语子集的转录。首先加载de-DE子集:

1
2
3
4
5
from datasets import load_dataset
from datasets import Audio

minds = load_dataset("PolyAI/minds14", name="de-DE", split="train")
minds = minds.cast_column("audio", Audio(sampling_rate=16_000))

接下来,我们获取一个样本并查看其转录:

1
2
example = minds[0]
example["transcription"]

输出

1
"ich möchte gerne Geld auf mein Konto einzahlen"

接下来,我们在🤗 Hub上找到一个针对德语语言的预训练ASR模型,然后将其名称传递给pipeline,并对样本进行转录:

1
2
3
4
from transformers import pipeline

asr = pipeline("automatic-speech-recognition", model="maxidl/wav2vec2-large-xlsr-german")
asr(example["audio"]["array"])

输出

1
{"text": "ich möchte gerne geld auf mein konto einzallen"}

德语也没问题!

当你在解决自己的任务时,从本单元中展示的简单pipeline开始是一个非常有价值的工具,它有以下几个好处:

  • 预训练模型可能已经能够很好地解决你的任务,从而节省了大量时间
  • pipeline()会为你进行所有的预处理和后处理操作,因此你不必再花时间将数据转换为模型正确的格式
  • 如果结果不理想,pipeline仍然可以为你提供一个快速实现的基线,以便在未来对其进行微调
  • 如果你在自己的数据集上微调了一个模型并将其分享到Hub上,整个社区都可以通过pipeline()方法快速轻松地使用它,从而使AI更加易于使用。