OpenAI Whisper论文笔记

news2024/11/15 23:43:52

OpenAI Whisper论文笔记

OpenAI 收集了 68 万小时的有标签的语音数据,通过多任务、多语言的方式训练了一个 seq2seq (语音到文本)的 Transformer 模型,自动语音识别(ASR)能力达到商用水准。本文为李沐老师论文精读的学习笔记。本文的模型权重,推理代码及 API 均以开源,相关博客也介绍了一些有趣的例子。

Paper:https://cdn.openai.com/papers/whisper.pdf

Code:https://github.com/openai/whisper

Blog:https://openai.com/blog/whisper

在互联网上,可获取的带标注的语音数据有很多,如电影及其字幕,歌曲及其歌词等。语音数据似乎很容易通过爬虫收集。但是,目前并没有(公开的)大规模语音数据集。这是因为这些带标注的语音数据的版权问题很难处理。即使某些公司通过收集这些数据训练了大语音模型,也不会声明自己的数据是爬去自存在版权问题的作品,更不会将数据公开。在 Whisper 文章中,同样没有详细说明数据来源,只是介绍了数据清洗和筛选的方法。

本文标题为 Robust Speech Recognition via Large-Scale Weak Supervision ,其中 Large-Scale 是 OpenAI 的 “传统艺能”,也是最近学术界的一个火热方向。即“大力出奇迹”,大模型、大数据的训练。Weak Supervision 是指本文所用数据虽然是有标注的,但并不是为了训练模型专门进行的人工标注,所以是质量较低的标注,故称为 “弱监督”。

摘要

在摘要部分,作者指明,本文通过扩大语音识别弱监督数据的规模,达到 68 万小时,并在大规模数据上进行多语言、多任务的训练。得到了一个泛化性能很好的模型。该模型在常见语音识别数据集上,不需要微调,直接以 zero-shot 的方式进行测试,结果与在这些数据集上训练过的语音识别模型性能相当。

导言

最近的语音识别方面的进展是使用无标签的数据进行自监督预训练。如 Wav2Vec,收集了大量无标签的语音数据,通过对比学习的方式预训练语音编码器。在编码器预训练完成之后,再在标准的语音识别数据集上微调,得到的结果优于只在语音识别训练集训练的模型。自监督预训练使用到的无标签语音数据规模最多已经达到 100 万小时。

考虑在 NLP 领域常见的两类预训练方式:BERT,Transformer 编码器类 和 GPT,Transformer 解码器类。BERT 中,预测掩码掉的单词和预测下一个句子是为了训练编码器理解自然语言而构造的预训练任务,它们不是现实中真正要用的 NLP 任务。因此,BERT 类预训练方法需要在对应下游任务上进行微调。GPT 类的预训练任务标准的语言模型,预测句子的下一个单词。这种方式可以通过构造 prompt,实现 zero-shot 测试,无需微调。然而,在语音识别领域,这种方式预测的是下一帧音频,而非语音识别结果,故而也必须微调一个解码器。总之,在语音识别领域,如果没有文本标签,很难实现无需微调的预训练。(Wav2Vec-U 在无监督语音识别训练方面取得了一些相关进展,不需要微调。)

在语音识别领域,自监督预训练的方式可以训练一个不错的编码器,但是预训练阶段没有标签,无法训练解码器。因此在实际用于语音识别之前,还需要在有标签数据上进行微调,比较麻烦,并且容易造成过拟合。一个理想的语音识别系统,应当不需要根据不同的场景进行微调,即应该实现开箱即用。

既然需要有标签数据,那么在语音识别人工标注数据集上训练,不就能训练出无需微调的语音识别系统了吗?遗憾的是,目前人工标注的语音识别数据集规模都比较小,七个数据集加起来也只有 5000 小时左右。一个自然的思路是,在数据的质量和数量之间进行权衡。既然高质量的人工标注成本较高,得到的数据集规模较小,那么是否可以放宽对标注质量的要求,使用电影-字幕,歌曲-歌词等自然带标注的语音识别数据,从而扩大数据规模呢?本文的思路就是这样。

本文收集了 68 万小时的语音识别数据,除了数据的规模大幅上升之外,数据的多样性也更加丰富。在这 68 万小时的语音数据中,有 11.7 万小时涵盖了除英语外的其他 96 中语言,有 12.5 万小时是其他语言到英语的翻译数据。

方法

数据处理

数据部分是本文最核心的贡献。由于数据够多,模型够强,本文模型直接预测原始文本,而不经过任何标准化(standardization)。从而模型的输出就是最终识别结果,而无需经过反向的文本归一化(inverse text normalization)后处理。所谓文本归一化包括如将所有单词变小写,所有简写展开,所有标点去掉等操作,而反向文本归一化就是上述操作的反过程。在 Whisper 中,这些操作统统不用,因为数据足够多,可以覆盖所有的情况。

在本文收集的语音数据中,包含了不同环境、不同语言、不同说话人等多样的数据,这有助于训练出文件的语音识别系统。然而,文本标签的多样性对模型的学习是一种阻碍。为了解决这个问题,本文使用了几种自动过滤方法,来提高文本标签的质量。

  • 首先,收集自互联网的语音识别数据,很有可能文本标签就是来自现有的语音识别系统的识别结果。之前有研究工作表明,在训练数据中混有机器生成的标签数据会损害模型的性能。为此,本文根据机器识别结果的一些特点,过滤掉了这些数据。
  • 另外,本文对数据中语音所属语言和文本所属语言进行检测。如果文本是非英语的其他语言,则要求语音也必须是同种语言;如果文本是英语,则语音可以是任何语言(因为本文方法中有一个其他语言到英语的翻译任务)。
  • 本文用一个语音识别模型在收集的数据上进行测试,发现在一些错误率极高的数据中,存在音频信息不完整、字幕声音不匹配等低质量数据,这些数据同样会被过滤掉。

另外,可能在收集的数据中含有标准语音识别数据集中的内容,为了避免对测试结果产生影响,这部分数据同样需要去掉。

最后,将音频切分为 30s 的片段,配上对应文本,得到训练数据。

模型

Whisper 使用的模型改动不大,就是 Transformer 第一次提出时的 encoder-decoder 架构。

Whisper 的输出侧是声音信号,声音信号的预处理是将音频文件重采样到 16000 Hz,并计算出 80 通道的梅尔频谱,计算时窗口大小为 25ms,步长为 10ms。然后将数值归一化到 -1 到 1 之间,作为输入数据。可以认为是对于每一个时间点,提取了一个 80 维的特征。之前数据处理部分提到每个音频悲切氛围 30s 的片段,这里步长为 10,所以每 30 秒有 3000 个时间点。综上,对于一个 30 秒的音频数据,我们提取到形状为 3000x80 的特征。对应到 NLP 中,可以理解为句子长度为 3000,每个词的词嵌入维度为 80。

3000x80 的输入数据首先通过两个 1D 卷积层,得到 1500x80 的特征。后面的处理就是标准的 Transformer encoder-decoder结构了。将这个特征送入到 Transformer encoder 中,提取处的特征作为交叉注意力输入送给 decoder。decoder 每次预测下一个 token,其输入是对应多任务学习的一些预设 token 和 prompt。

在这里插入图片描述

多任务

语音识别系统除了识别出语音中的语言文本(转录)之外,还需要做一些其他的任务。比如是否有人在说话(voice activity detection, VAD)、谁在说话(speaker diarization),和反向文本归一化等。通常,在语音识别系统中,这些任务分别由不同的模型来处理,但在本文中,这通通由 Whisper 一个模型完成。多个语音任务由同一个模型完成,有利有弊。好处是 all-in-one 的模型听起来比较 fancy,比较符合我们对于语音识别系统的期待。坏处是多个任务中如果某几个性能相对较差,整个模型难以调试。而且,如果需求只是做某一个比较简单的任务(如 VAD),一般来说一个简单的模型就可以胜任,但是 Whisper 需要跑起整个大模型。

Whisper 模型共处理四个任务,如图左上所示。一是给定英文语音,转录成英文文本;二是给定其他语言语音,转录并翻译成英文文本;三是给定其他语言语音,转录成该语言文本;四是给定只有背景音乐的音频,识别出无人说话。

所有这些任务都由解码器预测的 token 序列表示,从而使得一个模型能够处理多个任务。这几个任务及模型输出 token 的关系可以从图中下方的图示中的 token 序列看出:在 START OF TRANSCRIPT token 之后,如果当前无人说话,则识别为 NO SPEECH 。如果有人说话,则识别出当前语音所属的语言 LANGUAGE TAG 。然后有两种可能的任务 TRANSCRIBE 还是翻译任务 TRANSLATE ,这两种任务又分为两种形式:带时间戳的和不带时间戳的,分别穿插或不穿插时间戳 token ,预测出文本 token。最后到达 EOT token,整个流程结束。

实验(选)

注意 Whisper 是没有在人工标注的语音识别数据集上训练的,即 zero-shot 的设定。而对比的方法都是在这些数据集上训练过的,因此,要达到与它们持平的性能也是不容易的。

语音识别常用的评估指标是词错误率(Word Error Rate, WER)。即预测结果和目标结果的编辑距离除以句长。

由于不同的数据集有不同的标注格式,如大小写、括号、数字间的逗号等。为了保证公平的对比,在测试 Whisper 性能时会进行手动的 text normalizer,来对齐测试数据集。当然,这在实际使用中是不需要的。

英文语音识别

下图展示了不同语音识别模型在 LibriSpeech dev-clean 上的性能(横轴)和在多个数据集上的平均性能(纵轴)。LibriSpeech 是一个比较干净、比较简单的数据集,因此相对于其他数据集,各模型在 LibriSpeech 数据集上的性能更好。可以看到,虽然很多有监督方法在该数据集上训练之后能够得到很低的错误率(~1.6%),但这些模型在多个数据集上测试的平均错误率却非常高(>20%),很可能是这些有监督方法过拟合了 LibriSpeech 数据集。而 Whisper 虽然在 LibriSpeech 上错误率没有特别低,但是在多数据集测试中错误率也不错。这足以说明 Whisper 优秀的泛化性能。

在这里插入图片描述

多语言语音识别

下表是各模型在多语言语音识别数据集上的性能。可以看到,在小数据集 MLS 上,Whisper 表现更好;而在更大的 VoxPopuli 上,在训练集上训练过的有监督方法性能更好。
在这里插入图片描述

下图是不同语言的语音识别错误率随训练数据量的变化。可以看到,整体上随着训练数据的增多, 错误率是会下降的。另外,观察到在相同训练数据量的情况下, ZHKO,即中文、韩文等语言的错误率相对较高。这可能有两个原因,一是东亚语言与世界主流的英语、法语等差别较大,无法从多语言联合训练中受益,二是 Whisper 的 tokenizer 对于这类语言也不太友好。
在这里插入图片描述

多语言/多任务联合训练与仅英语训练对比

蓝线表示全部使用英语数据进行训练,橙线表示多语言、多任务联合训练的结果。可以看到,随着训练数据量的增加,多语言、多任务联合训练对英语本身的语音识别性能也是有帮助的。

在这里插入图片描述

总结

Whisper 通过弱监督预训练的方式,再加上大规模、多样性、多语言的训练数据,不需要自监督(self-supervised)和自训练(self-training),即可取得很好的性能。并且在处理任何语音识别任务时也不需要微调,可以以 zero-shot 的方式工作,大大提高了语音识别系统的稳健性。

笔者认为,Whisper 的意义在于指明了只要有大规模数据,通过一个简单的 Transformer encoder–decoder 架构就能训练出可靠的语音识别模型。并且开源了他们的训练权重。它的缺点也很明显,目前 Whisper 对推理基本无优化,Large 模型需要约 10 G 显存,速度也比较慢。不过在未来,肯定会有一系列工作从算法上或者从工程上来优化 Whisper 的推理部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring源码-doCreateBean

先看段代码: Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean " beanName "&qu…

Yolov5(v5.0) + pyqt5界面设计

1.下载安装pyqt5工具包以及配置ui界面开发环境 pip install PyQt5 pip install PyQt5-tools 2.点击File->Settings->External Tools进行工具添加,依次进行Qt Designer、PyUIC环境配置. 2.1 添加QtDesigner Qt Designer 是通过拖拽的方式放置控件&#xff0c…

GUI编程--PyQt5--QWidget2

文章目录事件事件传递父子关系扩展Z轴的层级关系事件 自定义控件类(QWidget),然后重写对应的事件方法即可。 控件显示时触发,showEvent(QShowEvent) 控件关闭时触发,closeEvent(QCloseEvent) 事件传递 案例&#xff1…

MYSQL -- Binlog数据还原

对表误删或执行缺少条件的修改 SQL 导致修改了表内其他数据时,我们需要想办法将数据恢复回来。 先创建两个测试表 table_1 CREATE TABLE table_1 (id int(0) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL D…

SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

一、前言 在面试中,经常会有一道经典面试题,那就是:怎么防止接口重复提交? 小编也是背过的,好几种方式,但是一直没有实战过,做多了管理系统,发现这个事情真的没有过多的重视。 最近…

[附源码]java毕业设计酒店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

K8s为何需要Pod

Pod是K8s中的最小API对象,更专业的表述是,Pod是K8s项目的原子调度单位,Pod可以看做是一个进程组,K8s则是操作系统 一, 问题 现在有三个服务需要部署在同一个节点上,A占用1G内存,B ,…

【Maven】使用maven profile 动态激活不同环境、依赖打包部署

使用maven profile 动态激活不同环境、依赖打包部署前言一、配置二、激活Profile三、动态依赖 示例一些其他参考:前言 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境、测试环境、生产环境,而我们的软件在不同的环境中…

Java方法与方法重载

目录 如何使用带参数的方法 综合案例 常见错误2-1 常见错误2-2 方法传参 构造方法 构造方法重载 this的用法 方法重载 成员变量和局部变量 成员变量和局部变量的区别 如何使用带参数的方法 1、定义带参数的方法 语法&#xff1a;<访问修饰符> 返回类型 <方…

网络 IO 演变过程

在互联网中提起网络&#xff0c;我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现&#xff0c;脱离不了网络 IO 的选择&#xff0c;因此本文作为一篇个人学习的笔记&#xff0c;特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网…

服务端Skynet(一)——源码浅析

服务端Skynet(一)——源码浅析 文章目录服务端Skynet(一)——源码浅析1、skynet的本质2、skynet基本的数据结构1、skynet_modules管理模块2、skynet_context模块3、skynet_message模块3、skynet启动服务步骤4、启动服务例子(logger)参考文献&#xff1a;skynet设计综述 skynet…

实战Netty!基于私有协议,怎样快速开发网络通信服务?

前言 今天我们一起来来聊聊怎么使用netty。 在工作中&#xff0c;我经常使用netty开发一些服务&#xff0c;掌握netty的工作原理&#xff0c;开发一些服务端以及客户端是非常简单&#xff0c;本篇文章&#xff0c;我们就以具体的协议来进行一个简单的服务的开发。 正文 私有…

一键汇总报告模型可能会需要修改的地方

文章目录如何修改文件夹地址为指定地址?如何取消清除提醒, 避免每次点击弹窗选择?如何取消完成弹窗提醒?如果觉得反复打开工作簿太闪怎么办?如果有些报告的内容页不在第一个Sheet怎么办?如果想修改字段怎么办?运行程序前不想清除原有内容怎么办?报告页有内容但是没有被抓…

混合整数规划的机组组合附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Redis常见面试题(2022)

Redis基础 什么是 Redis&#xff1f; Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xf…

多分类交叉熵理解

多分类交叉熵有多种不同的表示形式&#xff0c;如下图所示&#xff1a; 但是&#xff0c;有时候我们读论文会深陷其中不能自拔。 也有很多读者、观众会纠正其他作者的文章、视频的交叉熵形式。 实际上&#xff0c;上述三种形式都是没有问题的。 这里&#xff0c;我们就要了解…

多媒体内容理解在美图社区的应用实践

导读&#xff1a;移动互联网时代&#xff0c;图像和短视频等多媒体内容爆发&#xff0c;基于计算机视觉的AI算法是多媒体内容分析的基础。在美图社区智能化发展的过程中&#xff0c;视频和图像分类打标、去重以及质量评估的结果&#xff0c;在推荐、搜索以及人工审核等多个场景…

【R语言数据科学】:变量选择(三)主成分回归和偏最小二乘回归

变量选择(三)主成分回归和偏最小二乘回归 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编…

多分类问题的precision和recall以及F1 scores的计算

对于多分类问题&#xff0c;首先&#xff0c;对于每一个类的精准率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;&#xff0c;定义和二分类问题一致&#xff0c;但是计算上不再需要TP,FP,FN等量了&#xff1a;&#xff09; 比如对A, B, C三类有如…

SpringBoot中如何集成ThymeLeaf呢?

转自: SpringBoot中如何集成ThymeLeaf呢&#xff1f; 下文笔者将讲述SpringBoot集成ThymeLeaf的方法&#xff0c;如下所示: 实现思路:1.在pom.xml中引入ThymeLeaf的相关依赖2.在Templates文件夹下编写相应的模板文件例: 1.pom.xml 添加ThymeLeaf依赖<!-- ThymeLeaf 依赖…