使用OpenAI的Whisper 模型进行语音识别

news2024/9/24 3:26:40

语音识别是人工智能中的一个领域,它允许计算机理解人类语音并将其转换为文本。该技术用于 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://avoid.overfit.cn/post/acab33d88ef54228ad50b8a66324659f

还有许多操作可以用Whisper完成,你可以根据本文的代码自行尝试。

作者:Shradrobo

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

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

相关文章

无穷小的比较——“高等数学”

各位CSDN的uu们你们好呀,今天小雅兰的内容是无穷小的比较,下面,就让我们一起进入高等数学的世界吧 回顾 定义 性质 定理 定理1: 定理2:等价无穷小替换定理 常用的等价无穷小 例题 小结 回顾 两个无穷小的商当然不一定还…

Android深入系统完全讲解(38)

9.6 配置 native 方法 9.6.1 CMakeLists.txt 文件中内容,配置生成一个 so 库add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native…

一刷代码随想录——数组

概念数组是存放在连续内存空间上的相同类型数据的集合连续:增删需移动后续元素,删除的本质是覆盖类型:相同用数组,不同用结构数组下标从0开始C中二维数组连续分布vector的底层实现是array,严格来讲vector是容器&#x…

C++11 并发指南四( 详解三 stdfuture stdshared_future)

C11 并发指南四( 详解三 std::future & std::shared_future) 文章目录C11 并发指南四( 详解三 std::future & std::shared_future)std::future 介绍std::future 成员函数std::shared_future 介绍std::future_error 介绍其他与 std::future 相关的函数介绍其他与 std::f…

SWIFT Framework .NET 2023.1 Crack

SWIFT 组件 SWIFT Components 多年来一直致力于银行机构软件、在线交易软件、CRM 和零售和商业解决方案中的计费应用程序,以及医药和高度关键任务的 24/7 运营应用程序。作为定制银行解决方案的开发商,SWIFT Components 拥有所有银行产品和部门的专业知识…

【python从零入门 | 03】基本数据类型之“除法“

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目

设置/恢复系统隐藏文件 - Windows系统

设置/恢复系统隐藏文件 - Windows系统前言普通隐藏文件显示文件设置/取消隐藏系统隐藏文件显示文件设置/取消隐藏前言 本文介绍Windows系统如何设置/恢复隐藏文件,隐藏文件包含普通隐藏文件和系统隐藏文件,系统隐藏文件一般是受保护的系统文件&#xff…

Android 蓝牙开发——Avrcp协议(十二)

SDK路径:frameworks/base/core/java/android/bluetooth/ 服务路径:packages/apps/Bluetooth/src/com/android/bluetooth/ 在使用协议类的时候无法找到该类,由于安卓源码中关于蓝牙协议的 Client 部分或相关接口都被 hide 给隐藏掉了&#xf…

【通信原理(含matlab程序)】实验一 双边带模拟调制和解调

💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ &#x…

AcWing - 寒假每日一题2023(DAY 11——DAY 15)

文章目录一、AcWing 4656. 技能升级(困难)1. 实现思路2. 实现代码二、AcWing 4454. 未初始化警告(简单)1. 实现思路2. 实现代码三、AcWing 4509. 归一化处理(简单)1. 实现思路2. 实现代码四、AcWing 4699. …

OpenCV实战(8)——直方图详解

OpenCV实战(8)——直方图详解0. 前言1. 直方图概念2. 直方图计算2.1 灰度图像直方图计算2.2 彩色图像直方图计算3. 应用查找表修改图像3.1 查找表3.2 拉伸直方图提高图像对比度3.3 在彩色图像上应用查找表4. 图像直方图均衡化5. 完整代码小结系列链接0. …

操作流程违规作业监测系统 yolov7

操作流程违规作业监测系统通过pythonyolov7网络深度学习技术,对高危场景下作业人员未按照操作流程进行正常操作行为进行实时分析识别检测,发现现场人员违规作业操作行为,不需人为干预,立即自动抓拍存档预警。YOLOv7 在 5 FPS 到 1…

在 VSCode 中像写 TypeScript 一样写 JavaScript

大家好,我是前端西瓜哥。 我们在 VSCode 编辑器中编写 js 代码,是会提供类型提示的。 VSCode 会推断一个变量是什么类型,并在你输入内容的时候,提供对应的 API 属性或方法补全。 如下图,在 js 文件中,ar…

【Java】到底什么是包?|最通俗易懂讲解|保姆级

博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 目录Part1:类比理解:Part2:与包(package)正式见面:2.1:包的本质--文件夹2.2&…

学习C++基本数值类型

写在前面 正在学习C/C/Javascript,面向初学者撰写专栏 博主原创C/C笔记(干货),如有错误之处请各位读者指正 请读者评论回复、参与投票,反馈给作者,我会获得持续更新各类干货的动力。 致粉丝:可以…

力扣刷题记录——709. 转换成小写字母、771. 宝石与石头、704. 二分查找

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——709. 转换成小写字母、771. 宝石与石头…

C++11并发指南二(stdthread详解)

C11并发指南二(stdthread详解) 文章目录C11并发指南二(stdthread详解)std::thread 构造move 赋值操作其他成员函数上一篇博客《 C11 并发指南一(C11 多线程初探)》中只是提到了 std::thread 的基本用法,并给出了一个最…

{(leetcode 题号:169. 多数元素)+(189. 轮转数组)}时间复杂度与空间复杂度分析:

目录 一. 基本概念 1.时间复杂度 2.空间复杂度 二.实例分析 实例(1):旋转数组 方法1:暴力旋转法(时间复杂度加空间复杂度分析) 方法2 :三步整体逆序法 (时间复杂度加空间复杂度分析) 实例(2):斐波那契递归的时间复杂度和空间复杂度分析 实例(3):169. 多数元素…

模拟实现C库函数(1)

"啊~所有经历给它赋予魔力。"很久没更新过C专栏的文章了,借复习(review)的机会,本节的内容针对我们一些常见、常用的C库函数的模拟实现。“当你行走了一段时间后,回头往往那不管是起初咿咿呀呀胡乱踩陷的小坑时,还是之后…

C++11并发指南三(stdmutex详解)

C11并发指南三&#xff08;std:mutex详解&#xff09; 文章目录C11并发指南三&#xff08;std:mutex详解&#xff09;<mutex> 头文件介绍Mutex 系列类(四种)Lock 类&#xff08;两种&#xff09;其他类型函数std::mutex 介绍std::mutex 的成员函数std::recursive_mutex 介…