Whisper是一种令人激动的新型语言模型,采用了全新的语音识别方法,即使是低质量的音频,Whisper也能产生高质量的结果,并且对各种声音和语言的适应性极强,无需进行微调。
Whisper是开源的,有一系列可用的模型尺寸,可以作为众多语音转文字应用的有效解决方案,包括翻译、智能个人助理、车辆语音控制系统、客户服务运营等等。
在这篇文章中,我们将探讨Whisper与其他语音识别模型的不同之处,并将展示如何使用在Graphcore(拟未) IPU上运行的预构建的Paperspace Gradient Notebook,来起用Whisper Tiny的Hugging Face实现。
Whisper有什么聪明之处?
OpenAI的Whisper创始人们开始着手解决自动语音识别(ASR)迄今面临的几个基本挑战:
语音模型训练花费不低
许多ASR模型依赖于超高质量的标记音频/文本数据来进行监督学习。遗憾的是,这种符合“黄金标准”的训练数据是很缺乏的。以这种方式训练的模型能够在理想的条件下产生良好的语音识别结果。然而,由于它们对不同训练示例的接触有限,往往不能很好地进行概括,在处理低质量的真实世界音频时可能会遇到困难,并且通常需要额外的语音微调来为特定的用例做好准备。
显然,改进这类模型的方法是在更多的数据上训练它们,但高质量数据集的短缺导致人工智能从业者转向了反方向,开始使用大量未标记的音频来开发无监督学习的ASR模型。
以这种方式创建的模型能够实现非常高质量的语音表示,但需要随后进行微调,以便为特定的ASR任务做好准备。除了需要额外的工作,在语音识别中使用的微调过程已被证明会产生一些过度拟合的问题,从而限制模型的泛化性。
Whisper的创始人们将这个问题描述为“一个限制其实用性和稳健性的关键弱点”,并着手设计一个“开箱即用”的ASR模型。
“弱”训练数据如何使我们变得更强
Whisper解决方案从相同的高质量标记音频数据集开始,并利用更大的“弱监督数据集”(如视频字幕)对其进行扩充。这种方法在一定程度上受到计算机视觉研究的影响,该研究表明更大的、弱监督的数据集实际上可以提高模型的稳健性和泛化性。
我们使用了一些技术来检测和删除质量最低的数据,例如由其他ASR技术生成的视频转录,因为其局限性有转移到Whisper中的风险。
最终,我们使用了680,000小时的标记音频数据来训练Whisper,远远超出以前的监督模型。其中几乎五分之一的训练数据是非英语的,涉及96种语言。该数据集还包括125,000小时的其他语言到英语的翻译。
多任务transformer
Whisper采用经典的编码器-解码器转换架构,并将其应用于成对的音频/文本,使用从音频中生成的编码来实现对文本组件的下一个标记预测。
有一点非常重要,Whisper在解码器中包括特殊的标记,指示它执行不同的语言任务,如[转录]或[翻译]。
这种方法与许多ASR模型不同,后者使用各种子系统来处理语音转文本过程的不同方面,如语音活动检测、识别不同的说话者和规范化文本格式。这种架构需要额外的资源来协调各子系统之间复杂的相互作用。

性能
ASR模型的性能通常用单词错误率(WER)来衡量。

[图片和标题文字来自OpenAI Whisper论文]
如上图所示,Whisper用于长篇转写的WER可与基于符合“黄金标准”的数据集上训练的专有音频语音识别(ASR)系统相媲美。然而,由于其更大的训练数据语料库和使用“弱标记”的示例,在使用其他训练基准测试时,Whisper证明了更强的稳健性,而且无需进行微调。

值得注意的是,不同语种的单词错误率差异很大。下图显示了使用Feurs数据集的Whisper Large v2的性能差异。在这个例子中,西班牙语和意大利语的表现甚至好于英语,而津巴布韦的绍纳语和巴基斯坦的信德语表现最差,开箱即用。Whisper Tiny的表现可能会有所不同。
.png?width=1423&height=1835&name=2023-04-21%2014%2029%2007%20(1).png)
在Graphcore IPU上使用Whisper
开发人员可以通过Paperspace Gradiant Notebook在Graphcore IPU上使用预训练的Whisper Tiny(39m参数)进行推理。
用户可以从六小时的免费试用开始,如果需要的话,也可以升级到付费版本。
欲了解更多,可使用IPU运行的其他版本的Whisper,请通过此表与我们联系。
在IPU上的Paperspace Gradient Notebook中运行Whisper非常简单。
我们将使用Hugging Face的IPU优化的transformer库,optimum-graphcore。
您可能还需要一些其他的库来处理声音文件,对模型的输入进行标记并绘制结果。
按照本指南,您可以在很短的时间内转录音频内容。
%%capture
%pip install optimum-graphcore==0.6.0
%pip install soundfile==0.12.1 librosa==0.10.0.post2 tokenizers==0.12.1
%pip install matplotlib==3.7.1
%matplotlib inline
接下来,让我们导入今天要使用的库的其中一部分。
# Generic imports
from datasets import load_dataset
import matplotlib
import librosa
import IPython
import random
# IPU specific imports
from optimum.graphcore import IPUConfig
from optimum.graphcore.modeling_utils import to_pipelined
# HF related imports
from transformers import WhisperProcessor, WhisperForConditionalGeneration
我们现在可以选择要使用的模型及其配置。我们要选的是Whisper tiny.en,它可以实现最快的执行速度,同时确保很好的转录质量,因为它只专注于一种语言——英语。我们将使用两个IPU来运行这个模型,在第一个IPU上放置Transformer模型的编码器,在第二个IPU上放置解码器。通过在我们的模型上调用.half(),我们可以使用fp16的精度,从而使吞吐量接近fp32的两倍。
model_spec = "openai/whisper-tiny.en"
# Instantiate processor and model
processor = WhisperProcessor.from_pretrained(model_spec)
model = WhisperForConditionalGeneration.from_pretrained(model_spec)
# Adapt whisper to run on the IPU
ipu_config = IPUConfig(ipus_per_replica=2)
pipelined_model = to_pipelined(model, ipu_config)
pipelined_model = pipelined_model.parallelize(for_generation=True).half()
模型已经就绪,现在让我们获取一些音频数据来进行转录。我们使用的是众所周知的librispeech,它包含了成对的音频数据和相应的转录。如果您使用自己的音频,需要将其转换为Whisper可以识别的文件格式,我们建议使用在线工具,如FFmpeg(在线音频转换器)。
# Load the dataset and read an example soundfile
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
test_sample = ds[2]
sample_rate = test_sample['audio']['sampling_rate']
然后,我们创建一个函数来调用我们的Whisper模型并调用音频数据。之后,我们将生成的转录数据打印到控制台,并观察它是否与我们从librispeech中得到的基本事实相匹配,并直接观察我们刚刚转录的音频。
def transcribe(data, rate):
input_features = processor(data, return_tensors="pt", sampling_rate=rate).input_features.half()
# This triggers a compilation the first time around (unless a precompiled model is available)
sample_output = pipelined_model.generate(input_features, max_length=448, min_length=3)
transcription = processor.batch_decode(sample_output, skip_special_tokens=True)[0]
return transcription
test_transcription = transcribe(test_sample["audio"]["array"], sample_rate)
print(f"Expected: {test_sample['text']}\n")
print(f"Transcribed: {test_transcription}")

希望您也认为,在Graphcore IPU上使用Whisper开始转录既快速又简单易行。
当然,Whisper还有很多才能,如翻译和多语言转录。如果您想在IPU上进一步使用Whisper,或探索该模型的更大版本,请随时与我们联系。