Whisper是用于自动语音识别(ASR)和语音翻译的预训练模型。经过680,000小时标记数据的训练,Whisper模型展示了对许多数据集和领域进行归纳的强大能力 没有 微调的必要性。

耳语是由来自OpenAI的亚历克·拉德福德等人在论文《通过大规模弱监督的鲁棒语音识别》中提出的。原始代码库可以在这里找到。

与Whisper large模型相比,large-v2模型的训练周期是Whisper large模型的2.5倍,并增加了正则化以提高性能。

放弃:此模型卡的部分内容由拥抱脸团队编写,部分内容是从原始模型卡复制和粘贴的。

模型细节

Whisper是一种基于转换器的编码器-解码器模型,也称为 序列对序列 模型。它在使用大规模弱监督标注的68万小时标记语音数据上进行训练。

这些模型是在纯英语数据或多语言数据上训练的。纯英语模型接受了语音识别任务的训练。多语言模型接受了语音识别和语音翻译的训练。对于语音识别,该模型预测 相同的 语言就像音频。对于语音翻译,该模型预测转录到 不同的 语言到音频。

Whisper检查点有五种不同型号的配置。最小的四个在纯英语或多语言数据上被训练。最大的检查站只使用多种语言。所有十个预先训练好的检查点都可以在拥抱脸中心找到。下表总结了这些检查点,并链接到集线器上的模型:

whisper处理器
whisper处理器
  1. 预处理音频输入(将其转换为模型的log-Mel频谱图)
  2. 后处理模型输出(将它们从标记转换成文本)

通过传递适当的& # 34;上下文令牌& # 34;。这些上下文标记是在解码过程开始时提供给解码器的标记序列,并且采用以下顺序:

& lt| startoftranscript | & gt& lt| en | >;& lt|转录| >& lt|translate| >& lt| notimestamps | & gt

因此,典型的上下文标记序列可能如下所示:

& lt| startoftranscript | & gt& lt| en | >;& lt|转录| >& lt| notimestamps | & gt

它告诉模型在语音识别的任务下用英语解码,而不是预测时间戳。

这些令牌可以是强制的,也可以是非强制的。如果它们是强制的,则模型被制作来预测每个位置的每个标记。这允许你控制耳语模型的输出语言和任务。如果不强制,Whisper模型将自动预测输出语言和任务本身。

可以相应地设置上下文标记:

model . config . forced _ decoder _ ids = whisper processor . get _ decoder _ prompt _ ids(language = & # 34;英语& # 34;,task = & # 34转录& # 34;)

这迫使模型在语音识别的任务下用英语进行预测。

抄本

英语对英语

在这个例子中,上下文标记是& # 39;非受迫& # 39;,意味着模型自动预测输出语言(英语)和任务(转录)。

& gt& gt& gt从变压器导入WhisperProcessor,WhisperForConditionalGeneration & gt;& gt& gt从数据集导入load _ dataset & gt& gt& gt#加载模型和处理器& gt& gt& gtprocessor = whisperprocessor . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtmodel = whisperforconditionalgeneration . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtmodel . config . forced _ decoder _ ids = None & gt;& gt& gt#加载虚拟数据集并读取音频文件& gt& gt& gtds = load _ dataset(& # 34;HF-内部测试/librispeech _ ASR _ dummy & # 34;, "干净& # 34;,拆分= & # 34;验证& # 34;)& gt& gt& gtsample = ds[0][& # 34;音频& # 34;]& gt;& gt& gtinput_features =处理器(示例[& # 34;数组& # 34;],sampling _ rate = sample[& # 34;sampling _ rate & # 34],return _ tensors = & # 34pt & # 34).输入特征& gt& gt& gt#生成令牌ids & gt& gt& gtpredicted _ ids = model . generate(input _ features)>& gt& gt#将令牌id解码为文本& gt& gt& gttranscription = processor . batch _ decode(predicted _ ids,skip _ special _ tokens = False)[& # 39;& lt| startoftranscript | & gt& lt| en | >;& lt|转录| >& lt| notimestamps | & gt奎尔特先生是中产阶级的使徒,我们很高兴欢迎他的福音。& lt|endoftext| >']& gt;& gt& gttranscription = processor . batch _ decode(predicted _ ids,skip _ special _ tokens = True)[& # 39;奎尔特先生是中产阶级的使徒,我们很高兴欢迎他的福音。']
skip _ special _ tokens = True

法语对法语

以下示例通过适当设置解码器id来演示法语到法语的转录。

& gt& gt& gt从变压器导入WhisperProcessor,WhisperForConditionalGeneration & gt;& gt& gt从数据集导入音频,load _ dataset & gt& gt& gt#加载模型和处理器& gt& gt& gtprocessor = whisperprocessor . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtmodel = whisperforconditionalgeneration . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtforced _ decoder _ ids = processor . get _ decoder _ prompt _ ids(language = & # 34;法语& # 34;,task = & # 34转录& # 34;)& gt& gt& gt#加载流数据集并读取第一个音频样本& gt& gt& gtds = load _ dataset(& # 34;common _ voice & # 34, "fr & # 34,拆分= & # 34;测试& # 34;,streaming = True)& gt;& gt& gtds = ds . cast _ column(& # 34;音频& # 34;音频(sampling _ rate = 16 _ 000))& gt;& gt& gtinput _ speech = next(ITER(ds))[& # 34;音频& # 34;]& gt;& gt& gtinput_features =处理器(input _ speech[& # 34;数组& # 34;],sampling _ rate = input _ speech[& # 34;sampling _ rate & # 34],return _ tensors = & # 34pt & # 34).输入特征& gt& gt& gt#生成令牌ids & gt& gt& gtpredicted _ ids = model . generate(input _ features,forced _ decoder _ ids = forced _ decoder _ ids)& gt;& gt& gt#将令牌id解码为文本& gt& gt& gttranscription = processor . batch _ decode(predicted _ ids)[& # 39;& lt| startoftranscript | & gt& lt|fr| >& lt|转录| >& lt| notimestamps | & gt一天,一个孩子在网上工作。& lt|endoftext| >']& gt;& gt& gttranscription = processor . batch _ decode(predicted _ ids,skip _ special _ tokens = True)[& # 39;一天,一个孩子在网上工作。']

翻译

将任务设置为& # 34;翻译& # 34;强制耳语模型执行语音翻译。

法语到英语

& gt& gt& gt从变压器导入WhisperProcessor,WhisperForConditionalGeneration & gt;& gt& gt从数据集导入音频,load _ dataset & gt& gt& gt#加载模型和处理器& gt& gt& gtprocessor = whisperprocessor . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtmodel = whisperforconditionalgeneration . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtforced _ decoder _ ids = processor . get _ decoder _ prompt _ ids(language = & # 34;法语& # 34;,task = & # 34翻译& # 34;)& gt& gt& gt#加载流数据集并读取第一个音频样本& gt& gt& gtds = load _ dataset(& # 34;common _ voice & # 34, "fr & # 34,拆分= & # 34;测试& # 34;,streaming = True)& gt;& gt& gtds = ds . cast _ column(& # 34;音频& # 34;音频(sampling _ rate = 16 _ 000))& gt;& gt& gtinput _ speech = next(ITER(ds))[& # 34;音频& # 34;]& gt;& gt& gtinput_features =处理器(input _ speech[& # 34;数组& # 34;],sampling _ rate = input _ speech[& # 34;sampling _ rate & # 34],return _ tensors = & # 34pt & # 34).输入特征& gt& gt& gt#生成令牌ids & gt& gt& gtpredicted _ ids = model . generate(input _ features,forced _ decoder _ ids = forced _ decoder _ ids)& gt;& gt& gt#将令牌id解码为文本& gt& gt& gttranscription = processor . batch _ decode(predicted _ ids,skip _ special _ tokens = True)[& # 39;一个非常有趣的工作,我们将最终被赋予这个主题。']

估价

这段代码显示了如何在LibriSpeech test-clean上评估Whisper Large:

& gt& gt& gt从数据集导入load _ dataset & gt& gt& gt从变压器导入WhisperForConditionalGeneration,WhisperProcessor & gt& gt& gt进口火炬& gt& gt& gt从评估导入负载>& gt& gtlibrispeech _ test _ clean = load _ dataset(& # 34;librispeech _ asr & # 34, "干净& # 34;,拆分= & # 34;测试& # 34;)& gt& gt& gtprocessor = whisperprocessor . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;)& gt& gt& gtmodel = whisperforconditionalgeneration . from _ pre trained(& # 34;open ai/whisper-large-v2 & # 34;).到(& # 34;cuda & # 34)& gt& gt& gtdef map _ to _ pred(batch):& gt;& gt& gtaudio = batch[& # 34;音频& # 34;]& gt;& gt& gtinput_features =处理器(音频[& # 34;数组& # 34;],sampling _ rate = audio[& # 34;sampling _ rate & # 34],return _ tensors = & # 34pt & # 34).输入特征& gt& gt& gt批次[& # 34;参考& # 34;]= processor . tokenizer . _ normalize(batch[& # 39;正文& # 39;])& gt;& gt& gt& gt& gt& gtwith torch . no _ grad():& gt;& gt& gtpredicted _ ids = model . generate(input _ features . to(& # 34;cuda & # 34))[0]& gt;& gt& gttranscription = processor . decode(predicted _ ids)>& gt& gt批次[& # 34;预测& # 34;]= processor . tokenizer . _ normalize(transcription)& gt;& gt& gt退货批次& gt& gt& gtresult = librispeech _ test _ clean . map(map _ to _ pred)& gt;& gt& gtwer = load(& # 34;wer & # 34)& gt& gt& gtprint(100 * wer . compute(references = result[& # 34;参考& # 34;],预测=结果[& # 34;预测& # 34;])) 3.0003583080317572

长格式转录

pipeline chunk _ length _ s = 30 return _时间戳=True
& gt& gt& gt进口火炬& gt& gt& gt从变压器导入管道& gt& gt& gt从数据集导入load _ dataset & gt& gt& gt设备= & # 34;cuda:0 & # 34;如果torch . cuda . is _ available()else & # 34;cpu & # 34& gt& gt& gt管道=管道(& gt& gt& gt"自动语音识别& # 34;,& gt& gt& gt型号= & # 34;open ai/whisper-large-v2 & # 34;,& gt& gt& gtchunk_length_s=30,&& gt& gt设备=设备,& gt& gt& gt)& gt& gt& gtds = load _ dataset(& # 34;HF-内部测试/librispeech _ ASR _ dummy & # 34;, "干净& # 34;,拆分= & # 34;验证& # 34;)& gt& gt& gtsample = ds[0][& # 34;音频& # 34;]& gt;& gt& gt预测=管道(sample . copy())[& # 34;正文& # 34;] "奎尔特先生是中产阶级的使徒,我们很高兴欢迎他的福音。"& gt& gt& gt#我们还可以返回预测的时间戳& gt& gt& gtprediction = pipe(sample,return _ timestamps = True)[& # 34;大块& # 34;] [{'正文& # 39;: '奎尔特先生是中产阶级的使徒,我们很高兴欢迎他的福音。', '时间戳& # 39;: (0.0, 5.44)}]

微调

预训练的Whisper模型展示了对不同数据集和领域进行归纳的强大能力。但是,对于某些语言和任务,可以通过以下方式进一步提高其预测能力 微调。博客文章《用珞变形金刚微调Whisper》提供了一步一步的指南,用少至5小时的标记数据微调Whisper模型。

评估用途

这些模型的主要预期用户是人工智能研究人员,他们正在研究当前模型的鲁棒性、泛化、能力、偏差和约束。然而,Whisper作为ASR解决方案对开发者来说也是非常有用的,特别是对于英语语音识别。我们认识到,一旦模型发布,就不可能将访问限制在“预期的”用途,也不可能围绕什么是或不是研究制定合理的指导方针。

这些模型主要在自动语音识别和语音翻译成英语任务上进行训练和评估。它们在大约10种语言中显示出很强的ASR结果。它们可能表现出额外的能力,特别是如果在某些任务上进行微调,如语音活动检测、说话人分类或说话人双音化,但尚未在这些领域进行稳健的评估。我们强烈建议用户在部署模型之前,在特定的上下文和领域中对模型进行可靠的评估。

特别是,我们警告不要使用耳语模型来转录未经个人同意的录音,或声称使用这些模型进行任何类型的主观分类。我们建议不要在高风险领域使用,如决策环境,其中准确性的缺陷可能会导致结果的明显缺陷。该模型旨在转录和翻译语音,使用该模型进行分类不仅不被评估,而且也不合适,尤其是推断人类属性。

培训用数据

这些模型接受了680,000小时的音频和从互联网上收集的相应文字记录的训练。这些数据的65%(或438,000小时)代表英语音频和匹配的英语抄本,大约18%(或126,000小时)代表非英语音频和英语抄本,而最后17%(或117,000小时)代表非英语音频和相应的抄本。这些非英语数据代表了98种不同的语言。

正如在附带的论文中所讨论的,我们看到在给定语言中的转录性能与我们在该语言中使用的训练数据量直接相关。

性能和限制

我们的研究表明,与许多现有的ASR系统相比,这些模型表现出对口音、背景噪声、技术语言以及从多种语言到英语的零镜头翻译的改进的鲁棒性;语音识别和翻译准确率接近最新水平。

然而,因为模型是使用大规模噪声数据以弱监督方式训练的,所以预测可能包括在音频输入中实际上没有说出的文本(即幻觉)。我们假设这种情况发生是因为,考虑到他们对语言的一般知识,模型将试图预测音频中的下一个单词与试图转录音频本身结合起来。

我们的模型在不同语言之间的表现不均衡,我们观察到在低资源和/或低可发现性语言或我们具有较少训练数据的语言上的准确性较低。这些模型还在特定语言的不同口音和方言上表现出不同的表现,这可能包括不同性别、种族、年龄或其他人口统计标准的说话者之间更高的单词错误率。我们的完整评估结果将在本次发布的附带文件中提供。

此外,该模型的序列到序列架构使其易于产生重复文本,这可以通过光束搜索和温度调度在一定程度上减轻,但不是完美的。本文对这些局限性进行了进一步的分析。很可能这种行为和幻觉在资源较少和/或可发现性较低的语言中更严重。

更广泛的影响

我们预计Whisper模型的转录能力可以用于改进辅助工具。虽然Whisper模型不能用于开箱即用的实时转录,但它们的速度和大小表明,其他人可能能够在它们的基础上构建应用程序,实现近实时的语音识别和翻译。基于Whisper模型构建的有益应用程序的实际价值表明,这些模型的不同性能可能具有实际的经济意义。

发布Whisper还有潜在的双重用途问题。虽然我们希望该技术主要用于有益的目的,但让ASR技术更容易获得可以让更多的行为者建立强大的监控技术或扩大现有的监控工作,因为速度和准确性允许对大量音频通信进行可负担的自动转录和翻译。此外,这些型号可能具有开箱即可识别特定个人的能力,这反过来又会带来与双重用途和不同性能相关的安全问题。在实践中,我们希望转录成本不是扩大监测项目的限制因素。

BibTeX条目和引用信息

@misc{radford2022whisper,doi = { 10.48550/arXiv . 2212.04356 },URL = { https://arXiv . org/ABS/2212.04356 },作者= {拉德福德,亚历克和金,钟旭和徐,陶和布罗克曼,格雷格和麦克莱维,克里斯汀和苏茨基弗,伊利亚},标题= {通过大规模弱监督的鲁棒语音识别},发布者= {arXiv},年份=。