OpenAI的Whisper模型进行语音识别使用详解
作者:deephub 发布时间:2022-02-24 23:50:51
语音识别是人工智能中的一个领域,它允许计算机理解人类语音并将其转换为文本。该技术用于 Alexa 和各种聊天机器人应用程序等设备。而我们最常见的就是语音转录,语音转录可以语音转换为文字记录或字幕。
wav2vec2、Conformer 和 Hubert 等最先进模型的最新发展极大地推动了语音识别领域的发展。这些模型采用无需人工标记数据即可从原始音频中学习的技术,从而使它们能够有效地使用未标记语音的大型数据集。它们还被扩展为使用多达 1,000,000 小时的训练数据,远远超过学术监督数据集中使用的传统 1,000 小时,但是以监督方式跨多个数据集和领域预训练的模型已被发现表现出更好的鲁棒性和对持有数据集的泛化,所以执行语音识别等任务仍然需要微调,这限制了它们的全部潜力 。为了解决这个问题OpenAI 开发了 Whisper,一种利用弱监督方法的模型。
本文将解释用于训练的数据集的种类以及模型的训练方法,以及如何使用Whisper
Whisper 模型介绍
使用数据集:
Whisper模型是在68万小时标记音频数据的数据集上训练的,其中包括11.7万小时96种不同语言的演讲和12.5万小时从”任意语言“到英语的翻译数据。该模型利用了互联网生成的文本,这些文本是由其他自动语音识别系统(ASR)生成而不是人类创建的。该数据集还包括一个在VoxLingua107上训练的语言检测器,这是从YouTube视频中提取的短语音片段的集合,并根据视频标题和描述的语言进行标记,并带有额外的步骤来去除误报。
模型:
主要采用的结构是编码器-解码器结构。
重采样:16000 Hz
特征提取方法:使用25毫秒的窗口和10毫秒的步幅计算80通道的log Mel谱图表示。
特征归一化:输入在全局内缩放到-1到1之间,并且在预训练数据集上具有近似为零的平均值。
编码器/解码器:该模型的编码器和解码器采用Transformers。
编码器的过程:
编码器首先使用一个包含两个卷积层(滤波器宽度为3)的词干处理输入表示,使用GELU激活函数。
第二个卷积层的步幅为 2。
然后将正弦位置嵌入添加到词干的输出中,然后应用编码器 Transformer 块。
Transformers使用预激活残差块,编码器的输出使用归一化层进行归一化。
模型框图:
解码的过程:
在解码器中,使用了学习位置嵌入和绑定输入输出标记表示。
编码器和解码器具有相同的宽度和数量的Transformers块。
训练
为了改进模型的缩放属性,它在不同的输入大小上进行了训练。
通过 FP16、动态损失缩放,并采用数据并行来训练模型。
使用AdamW和梯度范数裁剪,在对前 2048 次更新进行预热后,线性学习率衰减为零。
使用 256 个批大小,并训练模型进行 220次更新,这相当于对数据集进行两到三次前向传递。
由于模型只训练了几个轮次,过拟合不是一个重要问题,并且没有使用数据增强或正则化技术。这反而可以依靠大型数据集内的多样性来促进泛化和鲁棒性。
Whisper 在之前使用过的数据集上展示了良好的准确性,并且已经针对其他最先进的模型进行了测试。
优点:
Whisper 已经在真实数据以及其他模型上使用的数据以及弱监督下进行了训练。
模型的准确性针对人类听众进行了测试并评估其性能。
它能够检测清音区域并应用 NLP 技术在转录本中正确进行标点符号的输入。
模型是可扩展的,允许从音频信号中提取转录本,而无需将视频分成块或批次,从而降低了漏音的风险。
模型在各种数据集上取得了更高的准确率。
Whisper在不同数据集上的对比结果,相比wav2vec取得了目前最低的词错误率
模型没有在timit数据集上进行测试,所以为了检查它的单词错误率,我们将在这里演示如何使用Whisper来自行验证timit数据集,也就是说使用Whisper来搭建我们自己的语音识别应用。
使用Whisper 模型进行语音识别
TIMIT 阅读语音语料库是语音数据的集合,它专门用于声学语音研究以及自动语音识别系统的开发和评估。它包括来自美国英语八种主要方言的 630 位演讲者的录音,每人朗读十个语音丰富的句子。语料库包括时间对齐的拼字、语音和单词转录以及每个语音的 16 位、16kHz 语音波形文件。该语料库由麻省理工学院 (MIT)、SRI International (SRI) 和德州仪器 (TI) 共同开发。TIMIT 语料库转录已经过手工验证,并指定了测试和训练子集,以平衡语音和方言覆盖范围。
安装:
!pip install git+https://github.com/openai/whisper.git
!pip install jiwer
!pip install datasets==1.18.3
第一条命令将安装whisper模型所需的所有依赖项。jiwer是用来下载文字错误率包的datasets是hugface提供的数据集包,可以下载timit数据集。
导入库
importwhisper
frompytubeimportYouTube
fromglobimportglob
importos
importpandasaspd
fromtqdm.notebookimporttqdm
加载timit数据集
fromdatasetsimportload_dataset, load_metric
timit=load_dataset("timit_asr")
计算不同模型尺寸下的Word错误率
考虑到过滤英语数据和非英语数据的需求,我们这里选择使用多语言模型,而不是专门为英语设计的模型。
但是TIMIT数据集是纯英文的,所以我们要应用相同的语言检测和识别过程。另外就是TIMIT数据集已经分割好训练和验证集,我们可以直接使用。
要使用Whisper,我们就要先了解不同模型的的参数,大小和速度。
加载模型
model=whisper.load_model('tiny')
tiny可以替换为上面提到的模型名称。
定义语言检测器的函数
deflan_detector(audio_file):
print('reading the audio file')
audio=whisper.load_audio(audio_file)
audio=whisper.pad_or_trim(audio)
mel=whisper.log_mel_spectrogram(audio).to(model.device)
_, probs=model.detect_language(mel)
ifmax(probs, key=probs.get) =='en':
returnTrue
returnFalse
转换语音到文本的函数
defspeech2text(audio_file):
text=model.transcribe(audio_file)
returntext["text"]
在不同模型大小下运行上面的函数,timit训练和测试得到的单词错误率如下:
从u2b上转录语音
与其他语音识别模型相比,Whisper 不仅能识别语音,还能解读一个人语音中的标点语调,并插入适当的标点符号,我们下面使用u2b的视频进行测试。
这里就需要一个包pytube,它可以轻松的帮助我们下载和提取音频
defyoutube_audio(link):
youtube_1=YouTube(link)
videos=youtube_1.streams.filter(only_audio=True)
name=str(link.split('=')[-1])
out_file=videos[0].download(name)
link=name.split('=')[-1]
new_filename=link+".wav"
print(new_filename)
os.rename(out_file, new_filename)
print(name)
returnnew_filename,link
获得wav文件后,我们就可以应用上面的函数从中提取文本。
来源:https://segmentfault.com/a/1190000043357797
猜你喜欢
- 在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。尽管 ORDER BY
- 一、%号占位符这是一种引入最早的一种,也是比较容易理解的一种方式.使用方式为:1、格式化字符串中变化的部分使用占位符2、变量以元组形式提供3
- 环境:A机器和B机器都是LINUX系统,但由于B机器已经空间不足,所以停掉不停操作数据库的服务后 ,准备在A机器进行导出操作。导出语句 ex
- 1、需要将时间字符串转换成datetime类型,语法:data[‘time'] = pd.to_datetime(data[‘tim
- 问题:关于如何生成随机记录(二)如何从指定表中随机抽取一定量的记录?sql server 中 select top 10 * fr
- 问题你想对在Unix系统上面运行的程序设置内存或CPU的使用限制。解决方案resource 模块能同时执行这两个任务。例如,要限制CPU时间
- 看了好多登录注册和注销的教程,很乱,很迷,然后总结了一下,简单的做了一个登录,注册和注销的页面。1,首先,使用pycharm创建一个项目单击
- 一、常量常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为
- 随着网络的发展,人们通过各种方式使用它。今天,网络购物,跟朋友或者不认识的人聊天,管理银行账户,以及一些日常应用,共享照片或视频,等等。事实
- 在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse,
- 一个不错的js星级评分代码,可以评多个指标。相关文章推荐:用css制作星级投票评分功能 效果图:<script language=&q
- 在TypeScript 项目中,我们经常需要使用声明一系列的ts类型。然而,手动写的效率实在太低,编写一个自动生成ts类型的工具可以解放生产
- 1.在模板中,我们经常要使用一些url,实现页面之间的跳转,比如某个a标签中需要定义href属性。当然如果通过硬编码的方式直接将这个url固
- import 机制功能Python 的 import 机制基本上可以切分为三个不同的功能:Python运行时的全局模块池的维护和搜索;解析与
- 本文借用HTML的css语法,将样式表应用到窗口部件。这里只是个简单的例子,实际上样式表的语法很丰富。以下类似于css: StyleShee
- 在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址。shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或\
- 学习目的:掌握下拉列表框的用法,并理解AutoPostBack属性; 理解IsPoskBack及用法; 初识DataTable的
- type 所有类是type生成的a = 1b = "abc"print("type a:{}&qu
- 查看某一列中有多少中取值:数据集名.drop_duplicates(['列名'])#实际为删除重复项,删除后对原数据集不修改
- 阅读上一篇:javascript面向对象编程(二) [Interface,Class.implement 接口及实现]接口规定了一些方法,如