使用Transformer的语音转文本完整入门指南
Transformer语音转文本指南
介绍
我们在处理音频数据时比我们意识到的要多得多。世界上充满了音频数据和相关的问题需要解决。我们可以使用机器学习来解决许多这些问题。您可能已经熟悉使用图像、文本和表格数据来训练机器学习模型,并且使用机器学习来解决这些领域的问题。随着Transformer结构的出现,已经有可能以比以前已知的方法更高的准确性来解决与音频相关的问题。我们将学习使用变压器进行语音转文本的音频机器学习基础知识,并学习使用Huggingface库来解决与音频相关的机器学习问题。
学习目标
- 了解音频机器学习的基础知识并获得相关背景知识。
- 了解音频数据是如何收集、存储和处理以用于机器学习的。
- 了解一个常见且有价值的任务:使用机器学习进行语音转文本。
- 学习如何使用Huggingface工具和库来处理音频任务-从找到数据集到训练模型,并使用它们来解决音频问题,利用Huggingface Python库进行机器学习。
本文是作为“数据科学博文马拉松”的一部分发布的。
背景
自从在2010年代初期,深度学习革命发生以来,Transformer结构可能是自那时以来最重大的突破。Transformer使得以前无法解决的任务成为可能,并简化了许多问题的解决方案。虽然最初旨在改善自然语言翻译的结果,但很快被应用于不仅自然语言处理的其他任务,而且还跨领域应用- ViT或Vision Transformer被应用于解决与图像相关的任务,Decision Transformer用于在强化学习代理中进行决策制定,最近的一篇名为MagViT的论文演示了Transformer在各种与视频相关的任务中的应用。
这一切始于现在著名的论文Attention is All You Need,该论文介绍了Attention机制,从而导致了Transformer的诞生。本文不假设您已经了解Transformer架构的内部工作原理。
尽管在公共领域和普通开发人员领域,ChatGPT和GitHub Copilot是非常有名的名字,但深度学习已经在许多实际的用例中被应用于许多领域- 视觉、强化学习、自然语言处理等等。
近年来,我们已经了解到许多其他的用例,比如药物发现和蛋白质折叠。音频是一个迷人的领域,但深度学习尚未完全解决;在某种意义上,Imagenet数据集中的图像分类问题已经被卷积神经网络解决了。
先决条件
- 我假设您具有使用Python的经验。基本的Python知识是必要的。您应该对库及其常见用法有一定的了解。
- 我还假设您了解机器学习和深度学习的基础知识。
- 之前对Transformer的了解不是必需的,但会有帮助。
关于音频数据的注意事项:此平台不支持插入音频,因此我已经创建了一个带有所有代码和音频数据的Colab笔记本。您可以在这里找到它。在Google Colaboratory中启动它,您可以从笔记本中在浏览器中播放所有音频。
音频机器学习简介
您可能已经看到过音频机器学习的应用。说“嗨Siri”或“好的,谷歌”会启动它们各自平台的助手-这就是与音频相关的机器学习在实际应用中的案例。这个特定的应用被称为“关键词检测”。
但在这个领域中,有很大的机会可以使用Transformer来解决许多问题。但是,在使用Transformer之前,让我快速告诉您在Transformer出现之前如何解决与音频相关的任务。
在Transformer之前,音频数据通常会被转换为梅尔频谱图-一种描述所处理音频片段的图像,并将其视为图像的一部分,然后将其馈入卷积神经网络进行训练。在推理过程中,音频样本首先被转换为梅尔频谱图表示,然后CNN架构将基于该表示进行推断。
探索音频数据
现在我将快速介绍一下`librosa` Python包。它是一个非常有用的用于处理音频数据的包。我将生成一个梅尔频谱图,以便让您了解它们的外观。您可以在网络上找到librosa的文档。
首先,通过终端运行以下命令安装librosa库:
pip install librosa
然后,在你的笔记本中,你只需要简单地导入它:
import librosa
我们将使用库中捆绑的一些数据来探索库的一些基本功能。
array, sampling_rate = librosa.load(librosa.ex("trumpet"))
我们可以看到librosa.load()方法返回一个音频数组和一个采样率,用于表示小号的声音。
import matplotlib.pyplot as plt
import librosa.display
plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)
这将把音频数据值绘制成如下图形:
在X轴上,我们看到的是时间,而在Y轴上,我们看到的是剪辑的振幅。通过以下方式听录音:
from IPython.display import Audio as aud
aud(array, rate=16_000)
你可以在我为这篇博客文章创建的Colab笔记本中听到这个声音。
使用librosa直接绘制一个梅尔频谱图。
import numpy as np
S = librosa.feature.melspectrogram(y=array, sr=sampling_rate,
n_mels=128, fmax=8_000)
S_dB = librosa.power_to_db(S, ref=np.max)
plt.figure().set_figwidth(12)
librosa.display.specshow(S_dB, x_axis="time",
y_axis="mel", sr=sampling_rate,
fmax=8000)
plt.colorbar()
我们使用梅尔频谱图而不是其他表示形式,因为它包含比其他表示形式更多的信息- 频率和振幅在一个曲线中。你可以访问Analytics Vidhya上的这篇不错的文章了解更多关于频谱图的知识。
这正是在转换器(Transformers)出现之前,音频机器学习中的大多数输入数据的样子- 用于训练卷积神经网络。
使用Transformers进行音频机器学习
正如在“Attention is All You Need”论文中介绍的,注意机制成功解决了与语言相关的任务,因为从高层次来看,注意头部在预测下一个标记时决定了序列中哪一部分值得比其他部分更多的关注。
现在,音频是一个非常适合的序列数据的例子。音频本质上是由自然界中的振动- 或者我们的语音器官- 生成的连续信号,例如人类语音或动物的声音。但是计算机既不能处理连续数据,也不能存储连续数据。所有数据都是以离散方式存储的。
音频也是如此。只有在某些时间间隔内的值被存储;这些值足够好地用于听歌、看电影以及通过电话或互联网与自己交流。
而转换器也可以处理这些数据。
就像自然语言处理(NLP)一样,我们可以根据不同的需求使用不同的转换器架构。我们将为我们的任务使用一个编码器-解码器架构。
从Huggingface Hub获取训练数据
如前所述,我们将为每个处理步骤使用Huggingface库。你可以访问Huggingface数据集Hub来查看音频数据集。我们将在这里使用的数据集是MINDS数据集。它是来自不同语言的说话者的语音数据集。并且数据集中的所有示例都已经完全注释。
让我们加载数据集并对其进行一些探索。
首先,安装Huggingface数据集库。
pip install datasets
通过
pip install添加
确保我们下载了带有音频相关功能支持的datasets库。
然后我们来探索MINDS数据集。我强烈建议您查看数据集的Huggingface页面并阅读数据集卡片。
在Huggingface数据集页面上,您可以看到数据集有非常相关的信息,例如任务、可用语言和使用数据集的许可证。
现在我们将加载数据并了解更多信息。
from datasets import load_dataset, Audio
minds = load_dataset("PolyAI/minds14", name="en-AU",
split="train")
minds = minds.cast_column("audio", Audio(sampling_rate=16_000))
请注意数据集的加载方式。名称在前,我们只对澳大利亚口音的英语感兴趣,并且只对训练集感兴趣。
在进行训练或推理任务之前,我们希望所有的音频数据具有相同的采样率。这是通过代码中的`Audio`方法完成的。
我们可以查看单个示例,如下所示:
example = minds[0]
example
输出
{‘path’: ‘/root/.cache/huggingface/datasets/downloads/extracted/a19fbc5032eacf25eab0097832db7b7f022b42104fbad6bd5765527704a428b9/en-AU~PAY_BILL/response_4.wav’,‘audio’: {‘path’: ‘/root/.cache/huggingface/datasets/downloads/extracted/a19fbc5032eacf25eab0097832db7b7f022b42104fbad6bd5765527704a428b9/en-AU~PAY_BILL/response_4.wav’,‘array’: array([2.36119668e-05, 1.92324660e-04, 2.19284790e-04, …,9.40907281e-04, 1.16613181e-03, 7.20883254e-04]),‘sampling_rate’: 16000},‘transcription’: ‘我想用我的卡支付电费,请您帮忙’,‘english_transcription’: ‘我想用我的卡支付电费,请您帮忙’,‘intent_class’: 13,‘lang_id’: 2}
这很容易理解。它是一个Python字典。我们有路径和采样率存储在其中。查看字典中的transcription键。这包含了我们在自动语音识别中感兴趣的标签。`[“audio”][“array”]`包含了我们将用于训练或推理的音频数据。
我们可以很容易地听任何我们想要的音频示例。
from IPython.display import Audio as aud
aud(example["audio"]["array"], rate=16,000)
您可以在Colab Notebook中听音频。
现在,我们清楚地了解了数据的外观和结构。我们现在可以继续使用预训练模型进行自动语音识别的推理。
探索Huggingface模型库
Huggingface模型库中有许多可以用于各种任务的模型,如文本生成、摘要、情感分析、图像分类等。我们可以根据我们想要的任务对模型进行排序。我们的用例是语音转文本,我们将探索专门为此任务设计的模型。
为此,您应该导航到https://huggingface.com/models,然后在左侧边栏中点击您想要的任务。在这里,您可以找到可以直接使用的模型,或者找到适合微调特定任务的候选模型。
在上面的图片中,我已经选择了自动语音识别作为任务,然后右侧列出了所有相关的模型。
注意不同的预训练模型。像wav2vec2这样的架构可以有许多针对特定数据集微调的模型。
你需要进行一些搜索,并记住可以用于使用该模型或微调的资源。
我认为来自Facebook的wav2vec2-base-960h模型非常适合我们的任务。再次强烈建议你访问模型页面并阅读模型卡片。
使用Pipeline方法进行推理
Huggingface拥有非常友好的API,可以帮助处理各种与transformers相关的任务。我建议你查看我编写的一个Kaggle笔记本,其中提供了许多使用Pipeline方法的示例:Huggingface Pipeline的简明介绍。
之前,我们找到了我们任务所需的模型,现在我们将使用我们在上一节中看到的Pipeline方法。
首先,安装Huggingface transformers库。
pip install transformers
然后,导入Pipeline类并选择任务和模型。
from transformers import pipeline
asr = pipeline("automatic-speech-recognition",
model="facebook/wav2vec2-base-960h")
print(asr(example["audio"]["example"])) # 这里的example是数据集中的一个示例
输出结果如下:
{'text': '我想用我的CAD支付电费,请您帮助'}
你可以看到这与我们上面看到的注释非常匹配。
通过这种方式,你可以从任何其他示例中获取推理结果。
结论
在本指南中,我介绍了音频数据处理和探索的基础知识,以及音频机器学习的基础知识。在简要讨论了用于音频机器学习的Transformer架构之后,我向你展示了如何在Huggingface hub中使用音频数据集,以及如何使用Huggingface models hub中的预训练模型。
你可以在许多与音频相关的问题上使用这个工作流程,并通过利用Transformer架构来解决它们。
要点
- 音频机器学习涉及解决在音频领域中出现的与音频相关的实际问题-利用机器学习技术。
- 由于音频数据存储为一系列数字,因此可以将其视为序列相关的问题,并使用我们已有的解决其他序列相关问题的工具来解决。
- 由于Transformer成功解决了序列相关的问题,我们可以使用Transformer架构来解决音频问题。
- 由于语音数据和音频数据通常因年龄、口音、说话习惯等因素而变化很大,因此最好使用针对特定数据集的微调解决方案。
- Huggingface在数据集、训练模型以及使用和微调训练的简便方法方面提供了许多与音频相关的解决方案。
资源
1. Huggingface音频机器学习课程,了解更多关于音频机器学习的知识
2. Allen Downey的《Think DSP》深入研究数字信号处理
常见问题
本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。