OpenAI-Whisper-学习指南-全-
OpenAI Whisper 学习指南(全)
原文:
annas-archive.org/md5/498a61d068550a5ec9498fc70995a63b译者:飞龙
前言
欢迎来到自动语音识别(ASR)和 OpenAI 开创性的 Whisper 技术的世界!在这本书中,学习 OpenAI Whisper,我们将进行一场全面的探索之旅,掌握当今最先进的 ASR 系统之一。
OpenAI 的 Whisper 代表了语音识别的重大进步,提供了无与伦比的准确性、多功能性和易用性。无论您是开发人员、研究人员还是爱好者,本书都将为您提供利用 Whisper 并发挥其全部潜力所需的知识和技能。
在本书的各章中,我们将深入探讨 Whisper 的核心概念、基础架构和实际应用。从第一部分介绍 ASR 的基础知识和 Whisper 在关键特性上的应用开始,我们将为理解这一前沿技术奠定坚实基础。
在第二部分,我们将探讨 Whisper 的架构的复杂细节,包括变压器模型、多任务能力和训练技术。您将获得调整 Whisper 以适应特定领域和语言的实际经验,使您能够根据自己的需求定制模型。
第三部分是真正的激动人心之处,因为我们深入探讨了 Whisper 在各种实际应用和使用案例中的广泛应用。从转录服务和语音助手到无障碍功能和高级技术,例如说话者辨识和个性化语音合成,您将学习如何在各个领域利用 Whisper 的能力。
随着您逐步阅读各章节,您将获得技术技能,并深入了解塑造 ASR 和语音技术领域风貌的道德考量和未来趋势。通过本书的学习,您将具备足够的能力来应对这个快速发展领域中的挑战和机遇。
无论您是想增强现有应用程序、开发创新解决方案还是扩展 ASR 知识,学习 OpenAI Whisper都是您的综合指南。本书将全面介绍 Whisper 及其应用,确保您全面理解 Whisper 及其应用。准备好开始与 OpenAI Whisper 一起进行令人兴奋的发现、掌握和创新之旅吧!
本书的目标读者
学习 OpenAI Whisper专为开发人员、数据科学家、研究人员和业务专业人士设计,他们希望深入了解如何利用 OpenAI 的 Whisper 进行 ASR 任务。
本书的目标读者主要包括以下三个角色:
-
ASR 爱好者:对探索先进语音识别技术潜力充满热情,并希望了解该领域最新发展的个人
-
开发人员和数据科学家:希望将 Whisper 集成到其项目中、利用语音识别能力增强现有应用程序或从头开始构建新解决方案的专业人士
-
研究人员和学术人员:有意研究 Whisper 内部机制、进行实验并推动 ASR 技术边界的学术界或研究机构的个人。
在本书的整个过程中,读者将学习如何设置 Whisper,为特定领域和语言进行微调,并将其应用于现实场景。读者将全面理解 Whisper 的架构、特性,并掌握其有效实施的最佳实践。
本书涵盖内容
第一章,揭开 Whisper 的面纱 – 介绍 OpenAI 的 Whisper,概述了 Whisper 的主要功能和特性,帮助读者掌握其核心功能。你还将亲手操作初始设置和基本使用示例。
第二章,理解 Whisper 的核心机制,深入探讨了 Whisper 的 ASR 系统的原理。它解释了系统的关键组件和功能,阐明了该技术如何解读和处理人类语言。
第三章**,深入探索架构,全面解释了 OpenAI Whisper 的核心——变换器模型。你将探索 Whisper 架构的复杂性,包括编码器-解码器机制,学习变换器模型如何驱动高效的语音识别。
第四章**,为领域和语言特定需求微调 Whisper,带领读者亲自实践,为特定领域和语言需求微调 OpenAI 的 Whisper 模型。读者将学习如何设置一个强大的 Python 环境,整合多样的数据集,并根据目标应用调整 Whisper 的预测,同时确保在各类人群中均衡的表现。
第五章**,在不同场景中应用 Whisper,探讨了 OpenAI 的 Whisper 在将语音转化为文字方面的卓越能力,包括转录服务、语音助手、聊天机器人和辅助功能等应用。
第六章**,扩展 Whisper 应用,探讨了将 OpenAI 的 Whisper 应用扩展到诸如精确的多语言转录、为提升可发现性而建立内容索引、以及将转录用于 SEO 和内容营销等任务*。
第七章**,探索先进的语音功能,深入介绍了提升 OpenAI Whisper 性能的高级技术,例如量化,并探讨了其在实时语音识别中的潜力。
第八章,使用 WhisperX 和 NVIDIA 的 NeMo 进行发言人分离*,专注于使用 WhisperX 和 NVIDIA 的 NeMo 框架进行发言人分离。你将学习如何整合这些工具,准确地识别并将音频录音中的语音段落归属给不同的说话人。
第九章**,《利用 Whisper 进行个性化语音合成》 探讨了如何利用 OpenAI 的 Whisper 进行语音合成,帮助读者创建个性化的语音模型,捕捉目标语音的独特特征。
第十章**,《使用 Whisper 塑造未来》 提供了一个面向未来的视角,探讨了自动语音识别(ASR)领域的发展以及 Whisper 的角色。本章深入分析了即将到来的趋势、预期的功能以及语音技术的发展方向。同时,还讨论了伦理问题,提供了全面的视角。
接下来的部分将讨论为了充分利用本书所需的技术要求和设置。它涵盖了软件、硬件和操作系统的前提条件,以及运行代码示例所推荐的环境。此外,本部分还指导你如何访问本书的 GitHub 仓库中的示例代码文件和其他资源。按照这些说明,你将能够为深入 OpenAI 的 Whisper 世界并充分利用书中的实践示例和练习做好准备。
为了充分利用本书
在本书的大部分内容中,你只需要一个 Google 账号和互联网连接,就能在 Google Colaboratory (Colab) 中运行 Whisper AI 代码。使用 Colab 的免费版本和 GPU 无需付费订阅。熟悉 Python 的人可以在本地环境中运行这个代码示例,而不必使用 Colab。
| 本书涵盖的软件/硬件 | 操作系统要求 |
|---|---|
| Google Colaboratory (Colab) | Windows、macOS 或 Linux 上的 Web 浏览器 |
| Google Drive | |
| YouTube | |
| RSS | |
| GitHub | |
| Python | |
| Hugging Face | |
| Gradio | |
| 基础模型:Google 的 gTTS、StableLM、Zephyr 3B – GGUFLlaVA | |
| Intel 的 OpenVINO | |
| NVIDIA 的 NeMo | |
| 麦克风和扬声器 |
Whisper 的小型模型需要至少 12GB 的 GPU 内存。因此,让我们尽量为我们的 Colab 确保一个不错的 GPU!不幸的是,使用 Google Colab 免费版(例如,Tesla T4 16GB)的好 GPU 变得越来越困难。然而,通过 Google Colab Pro,我们应该不会遇到分配 V100 或 P100 GPU 的问题。
如果你使用的是本书的数字版,我们建议你亲自输入代码或从本书的 GitHub 仓库获取代码(下节提供了链接)。这样可以帮助你避免因复制粘贴代码而产生的潜在错误。
在第四章中微调 Whisper 至少需要一小时。因此,您必须定期监控您在 Colab 中运行的笔记本。有些笔记本实现了一个带有语音录制和音频播放的 Gradio 应用。连接到计算机的麦克风和扬声器可能有助于您体验交互式语音功能。另一种选择是打开 Gradio 在运行时提供的 URL 链接并在手机上查看;您可以通过手机的麦克风来录制声音。
通过满足这些技术要求,您将能够在不同的环境中探索 Whisper,同时享受 Google Colab 提供的流畅体验和 GitHub 上的丰富资源。
下载示例代码文件
您可以从 GitHub 上下载本书的示例代码文件,网址是github.com/PacktPublishing/Learn-OpenAI-Whisper/。如果代码有更新,它将在 GitHub 仓库中进行更新。
我们的丰富书籍和视频目录中还有其他代码包,您可以访问github.com/PacktPublishing/进行查看。
Code in Action
本书的《Code in Action》视频可以在packt.link/gGv9a观看。
使用的约定
本书中使用了几种文本约定。
文本中的代码:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 账号。例如,“用户甚至可以提供如 .mp4 之类的视听格式作为输入,因为 Whisper 会提取音频流进行处理。”
代码块的格式如下:
from datasets import load_dataset, DatasetDict
common_voice = DatasetDict()
common_voice["train"] = load_dataset("mozilla-foundation/common_voice_11_0", "hi", split="train+validation", use_auth_token=True)
common_voice["test"] = load_dataset("mozilla-foundation/common_voice_11_0", "hi", split="test", use_auth_token=True)
print(common_voice)
当我们希望引起您对代码块中特定部分的注意时,相关的行或项目会用粗体显示:
[default]
exten => s,1,Dial(Zap/1|30)
exten => s,2,Voicemail(u100)
exten => s,102,Voicemail(b100)
exten => i,1,Voicemail(s0)
任何命令行输入或输出将如下所示:
!pip install --upgrade pip
!pip install --upgrade datasets transformers accelerate soundfile librosa evaluate jiwer tensorboard gradio
粗体:表示一个新术语、重要的单词或屏幕上出现的单词。例如,菜单或对话框中的单词会以粗体显示。示例:“要获取 GPU,请在 Google Colab 的主菜单中点击 Runtime | Change runtime type,然后将 Hardware accelerator 从 None 更改为 GPU。”
提示或重要说明
如下所示。
联系我们
我们始终欢迎读者的反馈。
一般反馈:如果您对本书的任何部分有疑问,请通过电子邮件联系我们:customercare@packtpub.com,并在邮件主题中提及书名。
勘误:虽然我们已尽力确保内容的准确性,但错误总会发生。如果您在本书中发现错误,我们将非常感谢您向我们报告。请访问 www.packtpub.com/support/errata 并填写表格。
盗版:如果你在互联网上发现我们作品的任何非法复制品,我们将非常感激你提供相关地址或网站名称。请通过 copyright@packt.com 与我们联系,并附上该材料的链接。
如果你有兴趣成为作者:如果你在某个领域拥有专业知识,并且有兴趣写书或为书籍贡献内容,请访问 authors.packtpub.com。
分享你的想法
阅读完学习 OpenAI Whisper后,我们很希望听到你的想法!请点击此处直接前往 Amazon 书评页面并分享你的反馈。
你的评论对我们和技术社区非常重要,能帮助我们确保提供优质内容。
下载这本书的免费 PDF 副本
感谢购买本书!
你喜欢随时阅读,但无法随身携带纸质书籍吗?
你的电子书购买是否与你选择的设备不兼容?
别担心,现在每本 Packt 书籍都可以免费获得无 DRM 限制的 PDF 版本。
随时随地,在任何设备上阅读。从你喜爱的技术书籍中搜索、复制并将代码直接粘贴到你的应用程序中。
福利不止于此,你还可以每天通过邮箱获取独家折扣、新闻通讯和精彩的免费内容。
按照以下简单步骤获得福利:
- 扫描二维码或访问以下链接

packt.link/free-ebook/9781835085929
-
提交你的购买证明。
-
就这样!我们会将你的免费 PDF 和其他福利直接发送到你的邮箱。
第一部分:介绍 OpenAI 的 Whisper
本部分将介绍 OpenAI 的Whisper,一项尖端的自动语音识别(ASR)技术。你将了解 Whisper 的基本特性和功能,包括其关键能力和设置过程。这些基础知识将为更深入探讨该技术及其在现实场景中的应用奠定基础。
本部分包括以下章节:
-
第一章,揭开 Whisper 的面纱 - 介绍 OpenAI 的 Whisper
-
第二章,理解 Whisper 的核心机制
第一章:揭开 Whisper 的面纱——介绍 OpenAI 的 Whisper
自动语音识别(ASR)是人工智能(AI)的一个领域,专注于通过语音实现计算机与人类之间的互动。多年来,ASR 在语音处理方面取得了显著进展,Whisper就是一个近期广受欢迎的革命性 ASR 系统。
Whisper 是由 OpenAI 开发的先进语音识别模型,训练于一个庞大的多语言数据集。凭借其准确的语音转录能力,Whisper 已成为语音应用程序的首选工具,如助手、转录服务等。
本章将探索 Whisper 的基础知识及其功能。我们将从介绍 Whisper 及其在 ASR 领域的重要性开始。接着,我们将揭示 Whisper 的关键特性和优势,了解它与其他语音模型的不同之处。然后,我们将讲解实现 Whisper 的基本指导原则,包括初步的系统配置和基础使用教程,帮助你快速上手。
本章将涵盖以下主题:
-
解构 OpenAI 的 Whisper
-
探索 Whisper 的关键特性和功能
-
设置 Whisper
在本章结束时,你将亲自体验 Whisper,并了解如何利用其核心功能来满足你的语音处理需求。
技术要求
如本章所述,你只需要一个 Google 帐户和互联网连接即可在Google Colaboratory中运行 Whisper AI 代码。使用免费的 Colab 和 GPU 版本不需要付费订阅。熟悉 Python 的人可以在自己的环境中运行此代码示例,而不必使用 Colab。
本章我们使用 Colab,因为它允许快速设置并运行代码,而无需在本地安装 Python 或 Whisper。本章中的代码使用的是小型 Whisper 模型,适用于测试目的。在后续章节中,我们将完成 Whisper 的安装,以利用更高级的自动语音识别(ASR)模型和技术。
本章中的代码示例可以在 GitHub 上找到,链接为github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter01。
解构 OpenAI 的 Whisper
在本节中,我们将踏上探索语音与言语的复杂世界,揭示人类发声的奇迹。语音与言语不仅仅是声音;它们是人类沟通的交响乐,通过生理过程的和谐交互来演绎。本节旨在为你提供对这些过程的基础理解,以及它们在语音识别技术中的重要性,特别是在 Whisper 中。你将学习到,Whisper 作为一个先进的语音识别系统,如何模拟人类的听觉敏锐度,以准确解读和转录语音。这种理解至关重要,因为它为理解 Whisper 的复杂性和功能奠定了基础。
本节的课程有多个价值。首先,它们提供了对语音与言语生物学和认知复杂性的深刻理解,而这些复杂性是理解语音识别技术的基础。其次,它们清晰地展示了这些技术固有的挑战与局限性,以 Whisper 为典型例子。这些知识不仅仅是学术性的;它们直接适用于现实生活中,尤其是在语音识别能发挥变革作用的各种场景中,从提升可访问性到打破语言障碍。
在我们继续前进时,请记住,语音与言语的旅程是艺术与科学的融合——理解自然和掌握技术的结合。本节是你进入广阔且令人兴奋的语音识别世界的第一步,Whisper 将作为你的引路人。
人类发声的奇迹——理解语音与言语
在人类能力的广阔范围内,发声和言语的能力是我们生物结构复杂性的见证。这是一个超越单纯声音产生的现象,将生物学、情感和认知交织在一起,创造了一种我们用来表达内心思想和感受的媒介。本节邀请你探索发声与言语产生的迷人世界,不通过解剖学家的视角,而是以技术专家的好奇心去惊叹大自然最复杂的工具之一。当我们深入探讨这一课题时,请思考像 OpenAI 的 Whisper 这样的技术,在解读和理解这些独特的人的特性时所面临的巨大挑战。
你是否曾想过,当你随意交谈时,背后运作的复杂系统?说话的轻松掩盖了支撑这一过程的复杂生理机制。类似地,当你与像 Whisper 这样的语音识别系统互动时,你是否考虑过支撑它理解和处理你话语的精密编码和算法精确性?
语言和语音的起源根源于呼吸的行为。横膈膜和肋骨在吸气和呼气中扮演着关键角色,为发声提供必要的气流。这个过程从声带在喉部内的战略性开合开始,喉部是发声的核心。当来自肺部的空气通过声带时,它会导致声带振动,从而产生声音。
另一方面,语言的产生是通过各种解剖结构的精确协调来实现的,包括软腭、舌头、下颚和嘴唇。这些结构将声带产生的原始声音雕刻成可识别的语言模式,使得思想和情感得以表达。掌握为了清晰交流所需的肌肉控制的微妙平衡是一个漫长的过程,需要大量的练习。
理解人类声音和语言产生的复杂性在 OpenAI 的 Whisper 中至关重要。作为一个先进的语音识别系统,Whisper 被设计用来模拟人耳的听觉敏锐度,准确地解释和转录人类语言。Whisper 面临的挑战反映了人类语言发展的复杂性,凸显了这一任务的复杂程度。
理解语音识别的复杂性
人类大脑在语言理解方面的能力是认知处理的一个奇迹,几十年来一直吸引着科学家和语言学家的关注。估计一个 20 岁的人大约知道 27,000 到 52,000 个词汇,通常到 60 岁时,这个数字会增加到 35,000 到 56,000 个词汇。每一个词在说出时都会存在一个短暂的瞬间——通常不到一秒钟。然而,大脑能够迅速做出决策,正确识别所说词汇的概率大约为98%。大脑是如何以如此高的精度和速度完成这一壮举的呢?
大脑作为并行神经处理器
大脑作为并行处理器的功能是我们语言理解能力的核心。并行处理意味着它可以同时处理多个任务。与一次处理一个操作的顺序处理器不同,大脑的并行处理能力允许同时激活多个可能的词汇匹配。那么,这在神经活动的背景下是怎样的呢?
一般认为,我们词汇中的每个单词都由大脑中的一个独特处理单元表示。这些单元不是物理实体,而是大脑皮层中的神经元放电模式,单词的神经表征。当我们听到一个单词的开头时,这些单元中的成千上万会立即启动,每个单元都在评估即将到来的听觉信号与它们所对应的单词的匹配可能性。随着单词的推进,许多单元会因为发现不匹配而停用,从而缩小可能性范围。这个过程会持续,直到只剩下一个放电活动模式——这就是识别点。活跃的单元抑制其他单元的活动,这是一个节省宝贵毫秒的机制,使我们能够以每秒最多八个音节的速度理解语言。
获取意义和语境
语音识别的目标不仅仅是识别单词本身;它还涉及获取单词的意义。令人惊讶的是,大脑在单词完全发音之前就开始考虑多重含义。例如,当听到“cap”这个片段时,大脑同时考虑到多个可能性,如“captain”或“capital”。这种潜在意义的爆发最终会被识别点精炼为单一解释。
语境在引导我们理解中起着至关重要的作用。它能加快识别速度,并帮助消除多义词或同音异义词的歧义。对于双语或多语使用者来说,语言语境是一个额外的提示,能够过滤掉其他语言的单词。
晚上的整合过程
大脑如何在不破坏词汇表的情况下整合新词汇?答案在于海马体,这是大脑中最初储存新词的区域,独立于大脑皮层的中心词库。通过一种在睡眠过程中发生的被认为的过程,这些新词逐渐融入大脑皮层的网络,确保现有词汇的稳定性。
当我们的意识在夜间休息时,大脑却在积极地将新词汇融入我们的语言框架。这一夜间活动对保持我们语言能力的动态性至关重要,为我们应对不断发展的交流景观做好准备。
OpenAI 的 Whisper – 一个技术平行体
在人工智能领域,OpenAI 的 Whisper 提供了一个与人类大脑语音识别能力相似的技术平行体。Whisper 是一款最先进的语音识别系统,通过深度学习技术以惊人的准确性转录和理解口语。像大脑通过并行处理来处理语言一样,Whisper 利用神经网络来分析和解释音频信号。
Whisper 的神经网络在庞大的数据集上进行训练,使得系统能够识别不同语言和口音中的各种词汇和短语。该系统的架构与大脑的识别机制相似,通过不断缩小可能的转录范围,直到选择最可能的那一个。
Whisper 还展示了大脑将上下文融入理解的能力。该系统能够从周围的语音中辨别出上下文,从而提高其实时转录的准确性。此外,Whisper 被设计为不断学习和适应,就像人类大脑将新词汇纳入词汇表一样。
Whisper 的算法必须应对各种变量,从口音、语调到背景噪声和语音不规则性,以便准确地将语音转换为文本。通过解剖语音和语音识别的细微差异,我们可以深入了解 Whisper 在处理和理解人类语言时必须克服的挑战和复杂性。
随着我们展望未来,像 Whisper 这样的语音识别技术潜力无穷。它有望打破语言障碍,提升可访问性,并创造更加自然的人机互动。Whisper 与人类大脑语音识别过程的相似性突显了我们认知能力的复杂性,并彰显了人工智能的显著成就。
语音识别的演变与 OpenAI 的 Whisper 的出现
为机器赋予识别和理解人类语音的能力一直是一个巨大的挑战,吸引了过去一个多世纪里技术领域最聪明的头脑。从 19 世纪末期的简单听写机到如今复杂的算法,语音识别技术的发展见证了人类的智慧和毅力。
语音识别的起源
最早的语音识别工作集中在创建元音发音上,为能够破译音素——语音的基本单位——的系统奠定了基础。著名的托马斯·爱迪生在这一领域开创了先河,他发明的听写机能够录制语音,这项技术在大量文书工作中的专业人士中得到了广泛应用。
什么是音素?
音素是语言中最小的有意义的声音单位。改变一个音素可以改变一个词的全部含义。以下是一些音素的例子:
-
词汇“cat”有三个音素:/c/,/a/,和/t/。
-
词汇“bat”也有三个音素:/b/,/a/,和/t/。/b/音素将其含义与“cat”区分开来。
-
词汇“sit”有三个音素:/s/,/i/,和/t/。/s/和/i/音素使其与“cat”有所不同。
语音识别领域在 1950 年代取得了重大进展。1952 年,贝尔实验室创造了第一个可行的语音识别系统 Audrey,能够以 90%的准确率识别由一个人发音的 0 至 9 的数字。1962 年,IBM 推出了 Shoebox,能够识别 16 个英语单词。在 1960 年代,日本研究人员在音素和元音识别方面取得了进展。然而,这种准确性取决于说话者,突显了语音识别固有的挑战:声音、口音和发音在不同个体之间的差异性。
机器理解的到来
一个重要的突破出现在 1970 年代,来自国防高级研究计划局(DARPA)的语音理解研究(SUR)计划。在卡内基梅隆大学,Alexander Waibel 开发了 Harpy 系统,该系统能够理解超过 1000 个单词,词汇量相当于一个小孩子。Harpy 的亮点是使用有限状态网络来减少搜索空间,并使用光束搜索来追求最有前景的解释。
有限状态网络
有限状态网络是由状态和它们之间的转换组成的计算模型。它们可以在保持在定义的状态内的同时识别输入中的模式。它们的作用是通过限制语音组件之间有效的转换,来减少语音识别的搜索空间。这简化了可能解释的解码过程。
示例包括以下内容:
-
限制有效相邻声音之间转换的音素网络。
-
连接语法中允许的单词的词汇网络。
-
语音识别使用嵌套的有限状态网络,跨越不同的语言层次。
光束搜索
光束搜索是一种优化算法,它只追求满足某些标准的最有前景的解决方案,剔除不太可能的候选项。它将计算集中在可能最大化目标指标的解释上。这比穷举地评估所有选项更高效。
示例包括以下内容:
-
语音识别光束搜索,追求可能的转录,同时过滤掉不太可能的词序列。
-
机器翻译光束搜索,确保翻译符合目标语言规则。
-
视频字幕光束搜索,偏向符合预期语法和语义的字幕。
Waibel 的动机是开发 Harpy 和后续系统,如 Hearsay-II,以实现语音翻译,将语音直接转化为另一种语言的文本,而不是使用字典。语音翻译需要通过利用语言学知识来应对自然语言的复杂性。
1970 年代的其他关键发展包括贝尔实验室建立了第一个多语音系统。1980 年代,隐马尔可夫模型(HMMs)和统计语言模型的引入推动了技术进步。到 1980 年代中期,IBM 的 Tangora 能够识别 20,000 个单词,为早期的商业化应用奠定了基础。Tangora 最初被设计为一款为办公室使用的语音操作打字机,用户可以口述文本,然后由系统转录。这项功能大幅提升了办公人员的工作效率。这项技术标志着我们今天所知的语音听写系统的重大进展。
连续语音识别的时代
直到 1990 年代,语音识别系统主要依赖于模板匹配技术,这要求语音必须清晰且缓慢,并且需要在无噪音的环境中进行。这种方法有明显的局限性,因为它缺乏足够的灵活性来适应人类语音的自然变化。
1990 年代,随着神经网络和计算能力的提升,语音识别的准确性和速度迅速提高。IBM 的 Tangora 利用隐马尔可夫模型(HMMs),标志着一个重要进展。这项技术使得语音单元序列可以进行一定程度的预测,从而提高了系统对个体语音模式的适应性。尽管需要大量的训练数据,Tangora 仍能识别出令人印象深刻的英语单词词汇表,开始了商业化应用。
1997 年,Dragon 公司的 NaturallySpeaking 软件——世界上首个连续语音识别器——问世,成为一个分水岭时刻。这一创新消除了单词之间的停顿,使得与机器的互动更加自然。随着计算能力的提升,神经网络提高了识别准确性。像 Dragon NaturallySpeaking 这样的系统可以以 97%的准确率每分钟处理 100 个单词。
谷歌进军语音识别领域,推出了适用于 iPhone 的 Voice Search 应用,利用机器学习和云计算达到了前所未有的准确度。谷歌通过推出 Google Assistant 进一步完善了语音识别技术,现在这个助手已被安装在全球许多智能手机中。到 2001 年,通过像 BellSouth 的语音激活门户这样的系统,消费者的使用不断增加。
然而,最重大影响出现在 2007 年智能设备普及后,准确的语音助手使用基于云的深度学习。2010 年,苹果的 Siri 通过在语音识别中加入某种人性化元素,激发了公众的想象。2014 年,微软的 Cortana 和亚马逊的 Alexa 相继推出,在语音识别领域激起了科技巨头之间的竞争。
与 OpenAI 的 Whisper 的关系
在这一创新的连续性中,OpenAI 的 Whisper 成为一个关键的进展。Whisper 是一个基于深度学习的语音识别系统,建立在前述历史进步和挑战的基础上。它利用庞大的数据集和复杂的模型,能够准确地识别多种语言和方言的语音。Whisper 体现了为创造一个不仅能高度适应个人语音模式,还能具备上下文理解能力的系统而付出的努力,这一关键特性是此前技术所难以实现的。
从爱迪生的听写机到 OpenAI 的 Whisper,语音识别技术的演变代表了人类与机器之间更加直观和无缝的界面追求。回顾这一历程,我们或许该问问自己:下一代语音识别技术将探索哪些新的前沿?进一步发展的潜力巨大,预示着一个未来,在那里人类交流与机器解读之间的障碍几乎无法区分。到目前为止,我们所见证的进步仅仅是一个序章,标志着一个语音识别技术将成为我们日常生活中不可或缺、普遍存在的时代的开始。
在下一节中,你将了解 Whisper 的关键特性和功能,这些特性使其具备了精确的语音识别能力。你将发现 Whisper 强大的功能,使其在各种应用中脱颖而出。从其卓越的语音转文字(STT)转换到其处理多种语言和口音的能力,Whisper 在自动语音识别(ASR)领域展示了最前沿的性能。我们将深入探讨 Whisper 如何利用先进的技术,将语音转化为文字,包括编码器-解码器变换器模型及其在庞大且多样化的数据集上进行的训练。
探索 Whisper 的关键特性和能力
在本节中,我们将深入探讨 OpenAI 的 Whisper,揭示其在自动语音识别(ASR)中脱颖而出的核心要素。这一探索不仅仅是功能的罗列;它是一次深入理解 Whisper 如何超越传统语音转文字(STT)转换界限的洞察之旅,提供了无与伦比的准确性、多功能性和易用性。
Whisper 的功能不仅限于转录。你将了解它在实时翻译中的强大能力,支持多种文件格式,并且能够轻松集成到各种应用中。这些功能共同使 Whisper 不仅仅是一个转录工具,而是一个全球通信和无障碍解决方案。
本部分对于那些寻求理解 Whisper 功能实际意义的人至关重要。无论你是开发者,想将 Whisper 集成到项目中,还是研究人员,探索语音识别技术的前沿,或仅仅是一个热衷于理解最新人工智能进展的爱好者,这里的知识都是无价的。它们为理解 Whisper 这一技术奇迹及其改变我们与口语语言互动和处理方式的潜力提供了坚实的基础。
在学习这一部分内容时,请记住,深入了解 Whisper 的功能不仅仅是一次学术练习。这是一本实践指南,旨在帮助您利用目前最先进的语音识别技术之一,该技术有望推动各个领域和应用的创新。
语音转文本
Whisper 的核心功能是将口语转录为文本。想象一下,一个记者在现场录制采访时,可以迅速将每一句话转换成可编辑、可搜索和可共享的文本格式。这一功能不仅方便;它在快速传播口语信息至关重要的环境中是一个游戏改变者。
最新版本的 Whisper,称为large-v3(Whisper-v3),于 2023 年 11 月 6 日发布。它的架构使用了一个编码器-解码器变换器模型,经过 1 百万小时的弱标注音频和 4 百万小时的伪标注音频训练,这些音频来自互联网上真实世界的语音数据,使其能够应对多种录音条件。以下是 Whisper 如何将语音转化为文本:
-
输入音频被分割成 30 秒的片段,并转换成对数-梅尔频谱图。
-
编码器接收频谱图,创建音频表示。
-
解码器的训练是根据编码器的表示预测相应的文本转录,包括语言识别和时间戳等任务的独特标记。
对数-梅尔频谱图
对数-梅尔频谱图是通过对梅尔频谱图中的数值取对数得到的。这会压缩频谱图的动态范围,并使其更适合输入到机器学习模型中。
梅尔频谱图表示音频信号在频域中的功率谱。它们是通过将梅尔滤波器组应用于信号的功率谱获得的,将频率分组到一组梅尔频率桶中。
梅尔频率桶以模拟低级听觉感知的方式表示声音信息。它们捕捉每个频带的能量,并近似频谱形状。
Whisper-v3 的架构与之前的大型模型相同,只是输入使用了 128 个梅尔频率桶,而不是 80 个。在 Whisper-v3 中,梅尔频率桶数量从 80 个增加到 128 个,这在多个方面都具有重要意义:
-
改善频率分辨率:Whisper-v3 可以使用更多的 Mel 频率单元捕捉音频频谱中的更精细细节。更高的分辨率使得模型能够区分彼此接近的频率,这有助于提高其识别音素或单词之间微妙声学差异的能力。
-
增强语音表示:增加的 Mel 频率单元数提供了更详细的语音信号表示。这种更丰富的表示可以帮助模型学习到更多区分性特征,从而提高语音识别的性能。
-
提高与人类听觉感知的兼容性:Mel 尺度旨在模仿人类对声音频率的非线性感知。通过使用 128 个 Mel 频率单元,Whisper-v3 能够更接近地模拟人类听觉系统对不同频率范围的敏感性。这种与人类感知的对齐可能有助于提高语音识别的准确性。
-
允许学习复杂模式:128 个 Mel 频率单元提供的高维输入为 Whisper-v3 提供了更多的数据。这种增加的输入维度可能使得模型能够学习语音信号中的更复杂和微妙的模式,可能有助于提高其在困难的声学条件或说话风格下的处理能力。
尽管增加 Mel 频率单元数可以带来这些好处,但也伴随着计算成本。处理更高维度的输入需要更多的内存和计算,这可能会影响模型的训练和推理速度。然而,增加的频率分辨率所带来的语音识别性能提升,在许多应用中可能会抵消这些计算考虑。
这种端到端的方式允许 Whisper 直接将语音转化为文本,而不需要任何中间步骤。庞大且多样化的训练数据集使得 Whisper 比以往的语音识别系统更好地应对口音、背景噪音和技术性语言。以下是一些关于语音转文本(STT)转换的关键能力:
-
Whisper 可以将语音转录为近 100 种语言的文本,包括英语、普通话、西班牙语、阿拉伯语、印地语和斯瓦希里语。Whisper-v3 新增了粤语的语言标记。这种多语言转录使其在国际交流中非常有用。
-
该模型对口音、背景噪音和技术术语具有强大的鲁棒性,使其能够有效处理多样化的录音条件。
-
Whisper 在许多语音识别基准测试中实现了最先进的性能,无需任何微调。这种零样本学习能力使得其能够转录在训练过程中未见过的新语言。
-
转录内容包括标点符号和大写字母,提供了格式化良好的文本输出。如果目标是将转录文本与原始音频对齐,可以选择使用时间戳。
-
一个流式 API 可以实现低延迟的实时转录,这对于实时字幕和其他需要快速处理的应用至关重要。
-
开源发布促进了对语音识别改进的研究,并帮助构建定制化解决方案。
总的来说,Whisper 在许多语言和使用场景中提供了高度强大和准确的 STT 转录质量。其转录质量超过了许多商业产品,且无需任何定制化。
翻译功能
除了转录,Whisper 还可以将语音从一种语言翻译成另一种语言。其翻译能力的关键特点如下:
-
Whisper 支持将近 100 种输入语言的 STT 翻译成英文文本。该功能可以在一步操作中实现非英语音频的转录和翻译。
-
该模型会自动检测输入语言,因此用户在翻译过程中无需手动指定语言。
-
翻译输出旨在传达原始音频的整体意义,而不仅仅是逐字替换。这一特性有助于捕捉细微差别和上下文。
-
在对齐的语音和文本数据上进行多任务训练,使得开发了一个用于转录和翻译的单一模型,而非多个独立的系统。
-
翻译质量方法采用了专门针对特定语言对的机器翻译模型。然而,Whisper 使用一个模型支持更多的语言。
总结来说,Whisper 通过在一个多任务模型中实现对多种语言的直接 STT 翻译,突破了语音翻译的边界,且没有妥协准确性。Whisper 使得英语使用者能够访问全球内容,并促进国际间的交流。
支持多种文件格式
Whisper 的多样性扩展到了支持多种音频文件格式,包括 MP3、MP4、MPEG、MPGA、M4A、WAV 和 WebM。这种灵活性在当今的数字环境中至关重要,因为音频内容形式多样。对于处理各种媒体文件的内容创作者来说,这意味着无需额外的文件转换步骤,确保了更流畅的工作流程。
具体而言,Whisper 在后台利用 FFmpeg 加载音频文件。由于 FFmpeg 支持读取多种文件容器和编解码器,Whisper 继承了这一多样性,可以处理各种输入。用户甚至可以提供如.mp4这样的视听格式作为输入,Whisper 会提取其中的音频流进行处理。
最近,官方支持的格式新增了开源 OGG/OGA 和 FLAC 编码格式。它们的加入彰显了 Whisper 在支持社区驱动和自由授权的媒体格式方面的承诺,同时也支持更多专有格式选项。
当前上传文件到 Whisper 的 API 服务的文件大小限制为 25 MB。Whisper 通过将较大的本地文件拆分为每个小于 25 MB 的片段来处理更大的文件。各种格式——从标准压缩格式到 CD 质量的无损格式——再加上宽松的文件大小限制,满足了使用 Whisper 时几乎所有音频内容的需求。
总结来说,Whisper 通过支持多种音频格式,同时保持领先的语音识别能力,脱颖而出。Whisper 使用户能够直接输入内容,而无需繁琐的转换或预处理步骤。无论是制作播客、有声书、讲座,还是其他以语音为核心的媒体,Whisper 都能提供文件支持。
易用性
OpenAI 发布 Whisper 标志着将自动语音识别(ASR)功能集成到应用程序中的重要一步。OpenAI 和其他网站提供的 Python 代码示例展示了开发者如何轻松地将 Whisper 的功能融入应用程序。这种简便性使创新者能够相对简单地利用 ASR 技术创造新的工具和服务。
具体来说,调用 Whisper API 并传递音频输入的简单过程展示了该技术的可接触性。开发者只需几分钟即可集成一套生产级的语音识别系统。多种模型大小可根据基础设施的需求调整语音处理能力。Whisper 可根据使用场景扩展,从轻量级的移动设备应用到云端的重型后端系统。
超越单纯的技术集成,Whisper 简化了利用语音数据的过程。庞大的训练数据集提供了出色的现成准确性,无需用户进行微调,内建的多语言支持也免除了语言专业化的需求。综合这些特点,Whisper 降低了高强度 ASR 技术生产性应用的门槛。
总结来说,通过提供最先进的语音识别技术,并便于轻松融入新系统,Whisper 有望推动语音启用应用程序在各个领域的“寒武纪大爆发”。其解锁创新的潜力与任何人都能轻松使用它的便捷性不相上下。Whisper 所提供的强大功能与易用性相结合,预示着一个新的时代——语音处理成为发明性问题解决者随时可以利用的关键元素。OpenAI 已全面开放创新的大门。
多语言能力
Whisper 最令人印象深刻的特点之一是其在多种语言上的高效能。截至 2023 年 11 月,它支持从南非荷兰语到威尔士语的 100 种语言。这种多语言能力使 Whisper 成为全球通信、教育和媒体领域中不可或缺的工具。
例如,教育工作者可以使用 Whisper 将讲座转录成多种语言,帮助学生进行语言学习和理解。采访记者可以转录并翻译对话,消除语言障碍。客服代表可以使用 Whisper 的语音翻译与客户用母语沟通。
Whisper 通过对来自互联网的 68 万小时、涵盖 100 种语言的音频数据集进行训练,展现了其多语言能力。这些数据使模型能够处理多种口音、音频质量以及专业术语的转录和翻译。
尽管 Whisper 在不同语言的准确性有所差异,但即便是低资源语言如斯瓦希里语,它也展现了竞争力的表现。Whisper 利用其对其他语言的理解,在训练数据较少的语言上进行推断。然而,要在所有语言中实现相等的专业水平仍然面临挑战。对于像普通话这样的声调语言,性能最弱。通过扩大 Whisper 训练数据的多样性,可能进一步增强其多语言能力。
Whisper 支持在单一模型中处理近 100 种语言,这一点非常了不起。随着 Whisper 的多语言性能不断提升,它可能帮助我们更接近无缝的全球沟通。
大文件输入处理
Whisper 能够处理最大 25 MB 的音频文件,直接满足了处理长时间录音(如播客或口述历史学家)的需求。Whisper 可以处理更长文件的分段音频,确保没有上下文或内容质量的丢失。
灵活的文件大小限制
默认的 25 MB 文件大小限制涵盖了许多标准音频长度,同时优化了快速处理。对于超过 25 MB 的文件,Whisper 提供了将音频分割成小于 25 MB 每段的选项。这种分块方式使 Whisper 能够处理任何长度的文件。推荐将较长文件分段,而非压缩,以避免降低音频质量和识别准确度。在分段时,最好在停顿或发言者之间进行拆分,以最大限度地减少上下文丢失。像 pydub 这样的库可以简化音频分段过程。
保持段落质量
Whisper 使用内部算法重建音频段之间的上下文,为大文件提供高质量的转录。OpenAI 团队持续改进 Whisper,在不同段落之间提供连贯转录的能力,最大限度减少差异。
扩展对长篇内容的访问
Whisper 对大文件的强大处理能力解锁了长篇内容的转录功能,例如讲座、访谈和有声书。较长的文件使创作者、研究人员等能够高效地利用音频内容进行各种下游应用,无论规模大小。随着 Whisper 的分段能力提升,用户可以准确转录甚至是极其冗长的录音,如多日的会议记录。
总结来说,Whisper 通过其分段处理能力,为短音频和长音频提供了灵活的转录解决方案。精心的分段处理能保持质量,同时让 Whisper 能够处理任何长度的音频文件。
专业词汇的提示词
Whisper 利用提示词来提高转录准确性的能力使其在医学、法律或技术等专业领域极具价值。通过提供包含相关术语的提示词,模型能更好地识别转录过程中涉及的专业词汇和技术术语。
例如,放射科医生可以为 Whisper 提供一个包含医学术语、解剖结构和影像学技术的提示词。这个提示词将帮助 Whisper 准确转录放射学报告和解释性发现。类似地,律师可以在提示词中加入法律术语和案件引用,以改善证词或法庭程序的转录。
这里有一个放射科医生可以提供给 Whisper 的提示例子,用于准确转录放射学报告和解释性发现:
"Patient is a 45-year-old male with a history of hypertension and hyperlipidemia. The patient presented with chest pain and shortness of breath. A CT scan of the chest was performed with contrast. The scan revealed a 2.5 cm mass in the right upper lobe of the lung. The mass is well-circumscribed and has spiculated margins. There is no evidence of mediastinal lymphadenopathy. The patient will undergo a biopsy of the mass for further evaluation."
该提示词包含了“高血压”、“高脂血症”、“CT 扫描”、“对比剂”、“肿块”、“右上叶”、“分叶缘”、“纵隔淋巴结肿大”和“活检”等医学术语。它还包括“肺”和“纵隔”等解剖结构。最后,它还涉及了“CT 扫描”和“对比剂”等影像学技术。
通过提供这样的提示,放射科医生可以训练 Whisper 准确识别和转录这些术语。这有助于提高转录放射学报告和解释性发现的准确性和速度,最终节省时间并改善放射科医生的工作流程。
提示词不需要是实际的抄本——即使是包含相关词汇的虚构提示词也能引导 Whisper 的输出。以下是一些有效提示的技巧:
-
使用 GPT-3 生成包含目标术语的模拟抄本,以供 Whisper 模仿。这能训练 Whisper 掌握相关词汇。
-
提供一个拼写指南,列出行业特有名称、产品、程序、少见词汇、缩略语等的正确拼写。这有助于 Whisper 学习专业的拼写规范。
-
提供长篇详细的提示词。更多的上下文帮助 Whisper 适应所需的风格和词汇。
-
基于 Whisper 的输出反复编辑提示词,包括补充遗漏的术语或纠正错误,进一步完善模型。
提示词不是万能的,但可以提高专业转录任务的准确性。通过提前提供技术性词汇,Whisper 能够生成高度准确的抄本,甚至对于专业的音频内容也不例外。其在提示词使用上的灵活性是 Whisper 相对于传统自动语音识别(ASR)系统的关键优势。
与 GPT 模型的集成
Whisper 与像 GPT-4 这样的大型语言模型的整合显著增强了其能力,通过精细化转录使其更加精确。GPT-4 可以纠正拼写错误、添加适当的标点符号,并改善 Whisper 初始转录的整体质量。这种先进的语音识别与高级语言处理的结合,创造了一个强大的自动化转录和文档创建系统。
通过利用 GPT-4 的上下文理解和语言生成优势,来精细化 Whisper 的语音转文本输出,该解决方案可以以可扩展的方式从音频生成高度准确的书面文件。使用 GPT-4 的后处理技术尤其比单纯依赖 Whisper 的提示参数(其有令牌限制)更具可扩展性。
这一整合为会议、访谈、播客及其他口语内容的自动化文档制作铺平了道路。生成的文字稿可以输入到不同的系统中,例如搜索引擎,以提高可发现性。这些转录也能通过 自然语言处理 (NLP) 技术进行详细分析。
总体而言,将 Whisper 和 GPT-4 结合起来形成了一个端到端的解决方案,能够挖掘音频数据的丰富性,并使其可应用于从个人生产力到企业知识管理的广泛应用领域。这个结合展示了将多个 AI 系统组合在一起以创造新兴能力的巨大潜力。
微调能力
微调是一种很好的方式来定制 Whisper,以提高准确性、支持新语言,并使模型适应特定的用例。高层次上,微调是对预训练模型(如 Whisper)进行进一步训练,使用额外的数据来完成下游任务。要进行微调,我们需要一个包含三个组件的 ASR 管道:
-
用于预处理原始音频输入的特征提取器
-
执行序列到序列映射的模型
-
用于后处理模型输出并转换为文本格式的分词器
幸运的是,Whisper 模型配有一个名为 WhisperFeatureExtractor 和 WhisperTokenizer 的特征提取器和分词器。我们将在 第四章 中更深入地讨论这一主题,为领域和 语言特定性微调 Whisper。
微调允许模型专门化并适应特定的用例。微调 Whisper 的主要原因如下:
-
提高特定领域或用例的准确性,如会议、呼叫中心数据等
-
支持原始训练数据中未包含的新语言
-
根据应用的特定词汇、音频条件等定制模型
-
利用迁移学习,在数据量较少的情况下表现得比从零开始训练更好
对 Whisper 进行微调非常适合,因为它是在多样化数据上训练的,并且可以从进一步专门化于特定任务或数据集中受益。调整可以在整个 Whisper 模型上或最接近输出的高层次进行。
利用迁移学习而非从头训练,微调使得可以在较少的数据和计算资源下开发高质量的语音识别。活跃的开源社区提供丰富的资源,可用于使用 Hugging Face Transformers 对 Whisper 进行微调。
语音合成
Whisper 在一次性语音合成工作流中扮演重要角色,将小语音样本转录为文本用于模型训练。结合 Ozen 和 Tortoise TTS,它能够以最小的数据实现高质量的语音合成。
一次性语音合成
一次性语音合成是一种创建文本到语音(TTS)系统的技术,它可以仅使用目标说话者声音的单个录音来合成目标语音。该过程涉及在目标说话者的语音语料库上训练 ML 模型,然后使用该模型基于文本输入生成新的语音。一次性语音合成是一个活跃的研究领域,有许多不同的实现方法。
Ozen 工具包利用 Whisper 对音频数据进行预处理,通过提取语音片段、使用 Whisper 转录并将其保存为 LJSpeech 格式。Tortoise TTS 使用预处理后的数据对个性化语音合成模型进行微调。
LJSpeech 格式
此格式源自 LJSpeech 数据集,一个公有领域的语音数据集,包含一位发音者朗读 7 本非虚构书籍中的段落的 13,100 个短音频剪辑。每个剪辑都提供了转录。这些剪辑长 1 到 10 秒不等,总长度约为 24 小时 (keithito.com/LJ-Speech-Dataset)。
Tortoise TTS 是一种神经 TTS 模型,可以利用最少的数据实现高质量的语音合成,甚至是目标语音的单个音频样本。在使用 Ozen 和 Whisper 预处理数据后,Tortoise TTS 可以对新的语音进行微调,并用于合成模仿该语音的语音。
Whisper、Ozen 和 Tortoise TTS 的结合,可以从仅有几秒的音频数据中构建个性化语音合成推理,无需进行大量的数据收集或清理。Whisper 的强大 ASR 处理转录,Ozen 预处理数据,而 Tortoise TTS 调节语音合成。
语音分离
Whisper 提供强大的语音识别能力,而像 pyannote.audio 这样的外部库可以在 Whisper 之上通过利用 Whisper 的单词级时间戳来进行说话者分离。
说话者分段(Diarization)是根据说话者的身份将音频记录划分为同质化的片段。它回答了“谁在什么时候说话?”这个问题。目标是将属于不同说话者的语音片段分开,而不需要知道说话者是谁。
默认情况下,Whisper 不支持说话者分段。它生成的转录没有说话者标签。然而,Whisper 在转录中输出了按单词级别的时间戳。通过这些时间戳,以及 pyannote.audio 等外部说话者分段库,可以将转录与说话者片段匹配,从而实现说话者标注。
总结来说,OpenAI 的 Whisper 是语音识别技术惊人进步的见证。它的功能,从多语言转录到与高级语言模型的集成,展示了一个未来的前景——在这个未来,口语与数字世界无缝融合。随着我们继续探索和拓展它的应用,Whisper 有望彻底改变我们理解和利用人类语言的方式。
在下一部分,我们将转向实际操作,指导您部署 OpenAI 的 Whisper 的第一步。这一部分对于那些渴望利用 Whisper 进行音频转录的人来说至关重要,因为它为入门提供了简便的步骤。在这里,您将学习如何通过用户友好的 Web 界面和更为动手的方式使用 Google Colab 来设置和使用 Whisper。
设置 Whisper
这段旅程从探索如何通过 Hugging Face 的 Web 界面访问 Whisper 开始,该界面设计简洁便捷,非常适合那些希望避免编码和软件安装复杂性的用户。您将学会轻松上传音频文件,并通过网页浏览器直接接收转录结果,使 Whisper 更加容易被更广泛的用户群体使用。
接下来,我们将向您展示如何在 Google Colab 等云环境中安装和运行 Whisper。此方法适用于那些希望更深入了解 Whisper 工作原理的用户。我们将介绍如何安装 Whisper 和 FFmpeg 以支持音频和视频功能,并演示如何转录文件以及如何在 Colab 环境中查看结果。
重要的是,这一部分涉及到 如何做 和 为什么做。设置 Whisper 的简便性突显了它在各个领域广泛应用的潜力,从学术研究到现实世界的商业解决方案。到这一部分结束时,您将掌握开始使用 Whisper 的技术知识,并且能够欣赏到它的可达性和多功能性。在继续前进的过程中,请记住,这些初步步骤对于解锁 Whisper 的全部潜力至关重要,为更高级的探索和语音识别创新铺平道路。
通过 Hugging Face 的 Web 界面使用 Whisper
要使用 Whisper 进行音频转录,你无需创建 OpenAI 账户或获取 API 密钥。Whisper 是一个开源项目,托管在 GitHub 上,因此你可以独立于 OpenAI API 使用它。你可以在本地机器或像 Google Colab 这样的云环境中安装和运行 Whisper,而不需要任何 OpenAI 账户或 API 密钥。正是这种便捷性使得 Whisper 成为一个适用于语音转文字(STT)转录的工具。
为了提供更简便和用户友好的体验,我们将通过 Web 界面访问 Whisper,这样无需处理代码库或 Python 库。
这是一个简化的指南:
-
访问 Whisper:访问 Hugging Face Whisper 空间,网址为
huggingface.co/spaces/openai/whisper。 -
上传音频:直接在网站上上传或录制你的音频文件。可以在
github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter01/Learn_OAI_Whisper_Sample_Audio01.m4a找到一个音频文件。 -
转录:Whisper 会自动将音频转录为文本。
-
查看并下载:如果需要,你可以查看并下载转录内容。
你可以在此查看 Hugging Face Whisper 空间的概述:

图 1.1 – Whisper:OpenAI 提供的 Hugging Face 空间
这种方法提供了一种简便的方式来访问 Whisper 的功能,无需在本地设置软件的技术要求。它非常适合那些希望快速转录音频而不需要安装的用户。
通过 Google Colaboratory 使用 Whisper
以下是一步一步的指南,将帮助你在 Google Colab 中有效使用 Whisper AI 进行语音转文字。这里有一个基于你提供的文本的指南,已使用 markdown 格式化,以便于理解:
-
安装 Google Colab:
-
访问 Google Drive 并设置你的 Google 账户,如果你还没有的话。
-
在左上角,点击
Google Colaboratory。 -
选择第一个选项,Colaboratory,然后点击 安装。
-
安装完成后,点击 完成 并关闭 连接更多 应用 窗口。
-
-
配置 Google Colab:
-
打开 Google Drive。
-
点击
Untitled.ipynb并给它起一个更具描述性的名字。 -
点击 运行时 菜单,选择 更改运行时类型,并将 硬件加速器 选项设置为 T4 GPU。(如果你使用的是 Google Colab 的免费版本,那么 T4 GPU 应该是一个可选项。)
-
-
在 Google Colab 上安装 Whisper AI:
-
打开你的 Colab 笔记本。
-
粘贴以下代码来安装 Whisper 和 FFmpeg(用于音频和视频文件支持):
!pip install git+https://github.com/openai/whisper.git !sudo apt update && sudo apt install ffmpeg- 点击 运行 图标运行代码。
-
-
运行 Whisper AI:
-
在 Colab 中,点击左侧导航菜单中的 文件 图标。
-
拖动并放下您要转录的音频或视频文件。
-
点击 确定 以确认上传的文件将在运行时回收时被删除。
-
现在,您的文件应出现在 Files 部分。您可能需要按下 刷新 图标才能使文件显示出来。
-
将以下代码粘贴到 Whisper 中以转录文件:
your-audio-file-here with the name of your filename, including path, no quotes. -
根据您的内存、处理能力和 GPU 可用性,使用
small.enWhisper 模型进行测试。不过,还有其他模型大小:tiny、base、small、medium 和 large。 -
通过点击
your-audio-file-here.txt(显示转录文本)、your-audio-file-here.vtt(以 WEBVTT 格式显示时间化文本)、your-audio-file-here.tsv(以制表符分隔格式显示文本轨道)、your-audio-file-here.json(以 JSON 格式显示转录文本)和your-audio-file-here.srt(以 SubRip 格式显示转录文本)来运行代码,这些文件位于 Colab 的 Files 部分。如果您没有看到这些文件,您可能需要按下 Colab 中的 刷新 图标。要下载这些文件中的任何一个,将鼠标悬停在文件上,选择省略号菜单,然后点击 下载。
Whisper 的输出格式
除了纯文本(TXT)格式外,Whisper 还支持多种输出格式,包括 JSON、WEBVTT、SRT 和 TSV。每种格式具有不同的用途,并适用于不同的使用场景:
-
JSON(JavaScript 对象表示法):这是一种多用途且广泛使用的数据交换格式。在 Whisper 中,JSON 输出包含有关转录的详细信息,如任务、语言、持续时间、片段和其他元数据。每个片段包含开始和结束时间、转录文本以及其他细节,如平均对数概率、压缩比率和无语音概率。
-
WEBVTT(网页视频文本轨道):这是一种流行的格式,用于显示 HTML5 视频的字幕或说明。它旨在易于阅读和编写,是 Web 开发人员的不错选择。Whisper 以此格式输出的内容可以直接用作视频字幕。
-
SRT(SubRip 字幕文本):这是另一种广泛使用的字幕和说明格式。大多数视频播放器和视频编辑软件都支持它。SRT 文件中的每个条目包括序列号、开始和结束时间以及相应的文本。Whisper 可以生成 SRT 文件,这些文件可以用于为视频添加字幕。
-
TSV(制表符分隔值):这是一种简单的文本格式,用于以表格结构存储数据,类似于 CSV,但使用制表符作为分隔符。在 Whisper 的上下文中,它不像其他格式那样常用,但在需要简单表格格式的特定应用中可能会很有用。
这些格式各有优点,适用于不同的应用场景。JSON 适合需要详细转录元数据的应用,而 WEBVTT 和 SRT 则非常适用于视频字幕或字幕应用。另一方面,TSV 提供了简单的表格化数据表示。
现在你已经掌握了在 Google Colab 中使用 OpenAI 的 Whisper AI 的基础知识,是时候探索其更高级的功能了。以下部分将介绍你可以在 Google Colab 中运行的额外参数和选项。这些增强功能使你能够更精确地自定义转录过程,满足特定语言需求,并处理各种音频条件。让我们深入了解,释放 Whisper 高级功能的全部潜力。
扩展 Whisper 的基本用法
你可以在 Google Colab 中使用
!whisper命令利用更多高级参数,来自定义转录过程。以下是一些你可以使用的附加选项:-
–model small.en与语言代码。例如,对于西班牙语,使用--model small –-``language Spanish。 -
正在检测语言,最多使用前 30 秒…。例如,可以通过运行以下命令来试试:--verbose flag to suppress some of the output, including confidence scores and other metadata:--output_dir 标志:
--task flag. Use -- task translate for translation from foreign audio to English transcription. Whisper will not translate to any other target language than English. Whisper will always transcribe from whatever source spoken language to the same language:–-clip_timestamps 用于处理音频片段的前 5 秒:
--best-of parameter controls how many candidate transcriptions Whisper returns during decoding. The default value is 1, which returns just the top predicted transcription. Increasing to 3–5 provides some alternative options:temperature 参数控制生成任务(如翻译)中的随机性。较低的值会产生更可预测的结果:
--beam-size flag controls the beam search size during decoding. Beam size affects the accuracy and speed of transcription. A larger beam size might improve accuracy but will slow down processing:!whisper "YOUR_FILE_NAME.mp3" –model medium –-temperature 0 --beam-size 2
这些高级参数允许你根据特定需求对 Whisper AI 转录进行微调,提高准确性并根据要求定制输出。可以尝试这些选项,看看哪种组合最适合你的音频文件。
总结
随着我们结束 第一章,我们已经走过了一段全面的旅程,为理解和利用这个先进的语音识别系统奠定了基础。以下是我们共同旅程的里程碑。
我们从深入探讨人类发声的奇迹开始,探索了生物学、情感和认知在语音和语言产生中的复杂相互作用。这一探索旨在理解生理过程,并欣赏像 OpenAI 的 Whisper 这样技术在解读这些独特的人类特征时所面临的巨大挑战。这一理解对于享受 Whisper 的功能以及准确转录人类语音所需的复杂性至关重要。
接下来,我们深入探讨了 Whisper 的关键特性和能力,这些特性使其成为自动语音识别(ASR)领域的一次重要飞跃。Whisper 展示了其强大的稳定性和多功能性,从其卓越的语音转文本能力,涵盖近 100 种语言、处理各种口音和背景噪音,到实时转录的能力和对多种音频文件格式的支持。本节阐明了 Whisper 在各种应用中的变革性力量,从新闻业到国际通信,展示了其最先进的性能以及轻松融入各种项目的能力。
最后,我们探讨了通过 Hugging Face 的 Web 界面和通过 Google Colab 的更动手式方式,如何设置和使用 Whisper,以便获得更简便的体验。本节提供了一个逐步指南,帮助用户有效地使用 Whisper 进行语音转文本,突出其易用性和便捷性。
完成本章后,你应该对 Whisper 的功能有了全面的了解,并掌握了在不同场景中应用这项技术的技能。这里获得的知识和见解对于任何希望利用先进语音识别技术的人来说都具有不可估量的价值。
当我们展望第二章,理解 Whisper 的核心机制时,我们将深入研究 Whisper 的 ASR 系统的基本构造。该章将揭示 Whisper 的关键组件和功能,提升我们优化其性能和实施最佳实践的能力。无论是用于语音助手、转录服务,还是其他创新应用,这些基础知识对于高效利用 Whisper 的能力至关重要。准备好深入了解 Whisper 如何在高级层面上运作,剖析其组件,并发现优化其性能的实用技巧。
-
第二章:理解 Whisper 的核心机制
欢迎来到我们掌握 Whisper 开创性语音识别能力之旅的第二章。在上一章,我们探讨了生产级语音识别的价值主张以及为什么 Whisper 标志着对对话式 AI 的一次重要进展。
现在,是时候揭开技术背后的面纱了。本章提供了 Whisper 技术架构和功能的全面而易懂的概述。把它当作你在 ASR 领域航行的指南,我们将一块一块地解剖 Whisper。
本章的目标有三个:
-
培养现代 ASR 系统关键组件的识别能力,包括 Whisper 独特的方法。我们将调查当前语音识别的技术和数据流。
-
培养直觉,理解将语音转化为文本以及后续自然语言理解所涉及的系统性交互。我们将描绘出 声学模型、语言模型和解码器等关键组件之间的关联和数据流,揭示它们在语音识别流程中的复杂相互依赖关系。通过追踪音频输入在逐步处理阶段的演变,并展示后续阶段如何依赖于前期步骤,你将自然地理解这些相互连接的系统协同工作的累积效果。
-
启用优化,通过揭示 Whisper 的内部机制,帮助优化其性能。理解 Whisper 的优点、局限性和权衡取舍,可以精确调整系统配置,以实现理想的准确性、速度和成本目标。
我们不会深入探讨推动 递归神经网络(RNNs)和 变压器(transformers)等创新的复杂数学原理。相反,我们将专注于易于消化的概念框架,让你能够快速应用 Whisper。随着技术的去神秘化,随之而来的是信息化的战略和影响。
本章将涵盖以下主题:
-
深入探讨 ASR 系统
-
探索 Whisper ASR 系统
-
理解 Whisper 的组件和功能
-
应用最佳实践进行性能优化
到本章结束时,你将了解 Whisper ASR 系统的关键要素,分析其组件和功能,并学习优化性能的实用技巧。
技术要求
为了利用 OpenAI 的 Whisper 实现高级应用,本章采用 Python 和 Google Colab 来提高使用便捷性和可访问性。Python 环境设置包括 Whisper 库,用于转录任务。
关键要求:
-
Google Colab 笔记本:这些笔记本已经设置好,以便用最低要求的内存和容量运行我们的 Python 代码。如果可以选择 T4 GPU 运行类型,请选择它以获得更好的性能。
-
Python 环境:每个笔记本中都包含指令来加载所需的 Python 库,包括 Whisper。
-
GitHub 库访问:所有的 Python 代码,包括示例,已上传至本章的 GitHub 库(
github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter02)。这些 Colab 笔记本已准备好运行,提供了一种实用的动手学习方法。
通过满足这些技术要求,你将准备好在不同情境下探索 Whisper,同时享受 Google Colab 的流畅体验和 GitHub 上丰富的资源。
深入探讨自动语音识别(ASR)系统
当我们与 Siri 或 Alexa 对话时,幕后究竟发生了什么?计算机是如何将自然语言的模糊声音转化为准确的单词和短语的?这就是 ASR 系统的作用所在。
ASR 在我们日常生活中的作用越来越重要。ASR 支持与技术的许多互动,从智能音响到手机上的语音助手。它支持免提控制、语音搜索,并支持其他语音驱动的功能。对话式 AI 的崛起,包括聊天机器人和虚拟助手,极大依赖于准确且高效的语音识别。
ASR 系统能够识别和处理人类的语音,并将其转换为机器可读的文本。换句话说,它们将口语音频转录为书面文字。这项技术使得语音接口和与计算机系统的口头交流成为可能。
ASR 系统的定义和目的
从基本层面来看,ASR 系统弥合了人类语言和机器理解之间的鸿沟。它们的作用是分析声学音频信号,识别语言内容,并输出计算机可以处理的文本翻译。
更具体地说,以下是 ASR 解决方案所要实现的关键目标:
-
将音频转换为文本:核心目的是将口语转录为等效的书面文本,供软件应用程序处理。然后,这些文本可以进一步进行自然语言处理(NLP)。
-
理解自然语言:人类的语言表达有时是不同的。我们可能会吞音、结巴,或者互相打断。ASR 必须处理这些复杂情况,并从模糊的音频中辨析出意义。
-
启用语音接口:ASR 支持语音用户界面(UIs),让我们通过语音与技术互动。这些用户界面包括语音助手、智能音响和对话系统。
-
改善可访问性:对于有视力障碍或运动功能障碍的用户,ASR 提供了超越键盘或触摸屏的替代输入方式。语音控制大大拓展了可访问性。
-
提高效率:自动化语音转录解放了人类,免去繁琐的音频/视频字幕和文档工作。ASR 节省了大量的时间和精力。
ASR 提供的语音分析推动了 语音用户界面 (VUIs)、量化自我应用程序和其他语音驱动的交互。随着对无处不在的语音界面的需求激增,提高 ASR 的准确性和能力仍然至关重要。
当 ASR 与其他互补技术如 自然语言理解 (NLU)、对话管理和 语音合成 (TTS) 协同工作时,它使我们能够像与其他人类一样与机器进行沟通。这种自然交互范式对于每个家庭中智能助手的愿景至关重要。
现实世界中的 ASR
自动语音识别已经通过一种被称为 VUI 的范式,实现了许多常见的免提界面。
语音用户界面
VUI 使人们能够通过对话式语音与设备互动,而不是触摸、打字或点击。它们包括语音识别和 NLU 技术栈,使系统如 Alexa 和 Siri 能够在响应之前接收原始语音查询。有效的 VUI 将 ASR 转录与下游对话系统结合使用,通过语音指令处理自然的命令、问题和指示。这种由语音驱动的免提控制范式使得与技术互动变得更快、更简便、更易于访问。
虽然对于用户来说大多是隐形的,但 ASR 已经通过 VUI 实现了许多常见场景:
-
智能音响如 Amazon Echo 和 Google Home 依靠 ASR 理解并响应语音命令,支持免提播放音乐、通过 物联网 (IoT) 控制家庭设备、查询信息等功能。
-
虚拟助手如 Siri、Alexa、Cortana 和 Google Assistant 使用 ASR 来转录用户查询。在语音识别后,它们执行命令、回答问题或通过下游的自然语言和对话处理进行推荐。
-
字幕和文档工具利用 ASR 快速转录视频、播客、讲座、医疗报告、法律程序等内容。
-
通过 ASR 应用程序接口 (API),免提控制智能手机、平板电脑、笔记本电脑、电视和车载娱乐系统,用户可以通过语音指令导航应用程序、输入文本、拨打电话、调整音量等,而不需要触摸屏。
-
语音分析解决方案通过 ASR 生成的客户通话转录提取见解,以了解情感、趋势、合规性、代理表现和其他指标。
因此,ASR 在人机交互中发挥着深远的作用。其准确性和鲁棒性直接影响到许多流行智能产品和服务的用户体验。在背后,ASR 通过语音转录能力为语音驱动的革命提供动力,使得口头系统控制和分析成为可能。
看到现代 ASR 系统如虚拟助手和智能音响在现实世界中的深远影响后,人们不禁会问,我们是如何走到今天的?在算法、数据和计算架构方面有哪些开创性的突破催生了今天灵活且精准的语音识别解决方案?接下来的章节将回顾核心方法学在关键时代的快速进展,带领我们走到驱动 Whisper 的神经网络的尖端创新。了解这一发展历程,可以帮助我们更好地理解当前的挑战和剩余的发展空间,因为该领域正在不断推动新的边界。借助历史的视角,我们可以更好地预见未来的方向,在这一技术的寒武纪大爆发中找到立足之地。
ASR 技术的简史与演变
自动语音识别的概念可以追溯到 20 世纪 30 年代,当时贝尔实验室开发了能够识别通过电话传递的数字的机器。然而,今天我们所知的技术的广泛商业化应用,直到 90 年代和 2000 年代才得以实现。
经过近一个世纪的创新,语音识别技术在机器学习的变革性方法和大数据的可用性推动下,取得了巨大的进展。自动语音识别(ASR)的准确性和多样性持续以惊人的速度发展。
早期阶段——模式识别方法
ASR 的第一次重大创新浪潮出现在 1950 年代的贝尔实验室。研究人员集中于使用启发式技术,通过分析音频波形并识别可区分的语音成分来匹配声学模式,从而实现孤立词识别。
贝尔实验室开发了专用的机器,用来解读通过电话传输的数字序列。例如,用户可以口头提供银行账户号码,以便路由他们的请求。这些原始的 Audrey 系统代表了没有现代机器学习技术的早期模式匹配实例。
Audrey 系统
贝尔实验室在 1950 年代开发的 Audrey 系统是开创性的语音识别设备,旨在解读通过电话传输的数字。它们使用模拟电路将声学模式与个别数字进行匹配,从而根据口头提供的账户或联系方式对电话进行路由。虽然功能有限,但这些专用机器代表了通过模板匹配进行 ASR 的早期尝试。Audrey 标志着一个早期的里程碑,尽管为了实现能够处理连续语音的更灵活系统,仍然需要大量的创新。
在接下来的几十年中,研究人员发展出了基于规则的方法,使用信号处理和声学指纹识别技术。然而,这些方法难以完全适应自然语言的动态复杂性以及不同说话者之间的语音模式变异性。同时,这些方法还依赖于大量的专家特征工程,难以在不同语言间进行规模化应用。
早期的进展很有前景,但需要更复杂的技术来处理连续语音、多样的口音、环境以及超出几个单词的词汇。为了实现今天灵活的自动语音识别(ASR),需要采用更先进的技术。
统计方法的出现——隐马尔可夫模型与n-gram 模型
在 1970 年代和 1980 年代,随着隐马尔可夫模型(HMMs)和n-gram 语言模型的引入,概率建模技术发生了范式转变。
隐马尔可夫模型
HMM 是统计模型,通过对序列进行分析,建模观察者无法看到的潜在状态。在自动语音识别中,它们将生成语音的声音建模为隐藏状态之间的转移,跟踪在给定前一个声学提示的情况下特定音素或单词出现的概率。HMM 不是确定性规则,而是提供了一种计算框架,用于统计地处理语音中的歧义。
N-gram 语言模型
N-gram 语言模型通过分析前 1–3 个单词的历史序列,计算条件词概率。例如,3-gram 模型估算每个可能的下一个单词在每对独特连续单词后的出现概率。语言模型可以利用这些概率分布来预测并改进临时的 ASR 转录,使其更加符合可能的短语。然而,n-gram 无法建模长距离的上下文。
研究人员不再仅仅依赖模式匹配,而是采用贝叶斯统计的原理来计算似然得分,并在不确定性下进行预测。这种方法使得能够更优雅地处理语音信号固有的歧义和变异。
使用 HMM,研究人员将语音组件(如音素和单词)建模为马尔可夫过程,从而跟踪从一个声音到另一个声音的转移概率。N-gram 语言模型则根据之前的单词序列预测后续单词。结合声学模型,这些关键创新可以处理小词汇量的连续语音识别。
在商业领域,Dragon Systems 于 1990 年推出了基于 HMM 的 Dragon NaturallySpeaking 语音输入软件。这一发布代表了一个重要的里程碑,是首批支持大词汇量连续语音识别的个人 计算机(PCs)系统之一。
然而,成功的应用面临着诸如精度有限、缺乏环境鲁棒性、需要大量训练以及语言上下文不足等挑战。在接下来的几十年里,神经网络和计算能力的提高将带来显著的改进。
深度学习突破
尽管 HMM/n-gram 系统代表了显著进展,但它们在很大程度上依赖手动特征工程,且模型能力有限。相比之下,深度学习方法可以在大规模数据中自动发现复杂的表示和模式。
2000 年代末期,深度神经网络(DNNs)被引入语音识别,显著提高了准确度。深度前馈和递归网络通过多层人工神经元克服了以前的局限性。
然后,在 2016 年,微软达成了一个行业里程碑,通过大量神经网络训练,使用他们的专有计算网络工具包(CNTK)框架(现在被称为微软认知工具包),在对话语音识别方面达到了人类水平。研究人员报告的词错误率(WER)为 5.9%,与被要求转录同一对话的人类相当。微软成功的关键在于使用长短期记忆(LSTM)声学模型,结合新颖的空间平滑方法和无格最大互信息(LF-MMI)声学训练。他们还采用了多个 RNN 语言模型和大量数据,包括必应语音搜索日志,来训练他们的 DNN。这种数据驱动的方法使系统能够从语音中的变化和细微差别中学习,从而提高了准确识别和转录口语的能力。微软的突破展示了与人类听众相当的能力,为商业语音助手和对话代理释放了新的潜力,赋予其更强的多功能性和实用性。
词错误率
WER 是一个标准的度量指标,用于衡量语音识别或机器翻译系统的性能。它通过计算文字记录中的错误与总的发言单词数的比例来得出。错误分为三种类型:替换(当一个单词被另一个单词替代时)、插入(当一个未曾说出的单词被添加时)和删除(当一个单词被省略时)。WER 的公式如下:
词错误率 = (替换 + 插入 + 删除) / 发言的单词数
例如,如果在 100 个单词的文字记录中有 10 个替换、5 个插入和 5 个删除,则 WER 为 20%。较低的 WER 表示语音识别的准确度更高。需要注意的是,虽然 WER 是广泛使用的度量标准,但它并不是衡量语音识别系统效果的唯一标准。
长短期记忆
LSTM 是一种 RNN,设计用于长期记忆信息。与传统的 RNN 不同,后者由于梯度消失问题难以维持长期依赖关系,LSTM 可以学习这些依赖关系,使其非常适合处理涉及长期时间依赖性的序列数据任务。这些任务包括语言翻译、语音识别和时间序列预测应用。LSTM 网络包含记忆块,这些记忆块是递归连接的,包含一个或多个记忆单元以及三个乘法单元,允许网络调节信息流。
无格最大互信息
LF-MMI 是一种用于语音识别声学模型序列级训练的方法。MMI 目标函数旨在最大化观察到的声学特征与训练数据中对应词序列之间的互信息。无格这一特点指的是该方法在训练过程中无需生成格图(传统语音识别系统使用的一种图形),这使得它更高效,且适合基于 GPU 的训练。LF-MMI 已被证明在许多语音识别任务中取得了最先进的成果,并且特别适用于训练用于 ASR 系统的 DNN。
目前的最先进系统采用了不同的神经网络架构:
-
卷积层直接从频谱图中学习平移不变特征。
-
循环层包括 LSTM,建模语音序列和长距离上下文。
-
Transformers 通过自注意力机制捕捉全局依赖,去除了递归约束。
除了卓越的统计学基础,这些神经网络进展催化了虚拟助手的商业成功以及语音界面的广泛应用。
持续创新
语音识别仍然是一个高度活跃的研究领域,我们不断探索新的方法来提高灵活性、减少延迟并增强准确性。令人兴奋的创新不断涌现,例如以下内容:
-
端到端建模:原先独立的声学和语言模型已被单一集成网络所替代,从而简化了训练并优化了整个流程。
-
多模态学习:音频、视觉和文本数据现在可以结合使用,以提高鲁棒性。嘴唇动作和其他视觉线索提供了额外的信号。
-
个性化:模型可以根据个人发音和口音进行适配,提供定制化的表现。独特的声纹档案增强了识别能力。
-
低资源语言:通过跨语言迁移学习,在有限训练数据的语言上取得了语音识别的进展。这意味着高资源语言(例如英语)有助于启动那些训练数据有限的语言。
-
设备端部署:得益于模型压缩和加速硬件,实时语音识别(ASR)现已可以在手机和边缘设备上实现。
得益于机器学习的进展,经过几十年的迭代,ASR 技术如今提供了惊人的实用性。通过增强对不同语音和环境的鲁棒性,广泛的语言支持以及可扩展的部署,ASR 有望在未来几年推动更多基于语音的体验。Whisper 位于技术前沿,持续突破边界。
最相关的是,Whisper 在应用最先进的自监督学习方面取得了巨大的飞跃,使用仅限开放数据集实现了人类级别的能力。这种前所未有的准确性和语言覆盖范围为生产级语音识别系统设定了新的标准。
探索 Whisper ASR 系统
现在我们已经了解了自动语音识别的全貌和能力,是时候揭开 Whisper 技术内在机制的面纱了。本节提供了一个既简明又全面的概述,介绍了 Whisper 如何通过其算法、数据管道和创新实现前所未有的转录能力。
我们将重点介绍声学建模、自监督预训练策略、模型架构和性能优化等方法,这些方法使 Whisper 与众不同。综合起来,这些技术实现了跨语言、环境和硬件的强大现实语音识别能力。
虽然我们不会深入探讨具体的数学公式,但你将直观地理解 Whisper 的竞争优势,例如以下几点:
-
使用连接主义时序分类(CTC)声学模型处理模糊的语音到符号映射
-
通过变压器(transformers)整合全球语言上下文
-
精简跨设备的低延迟部署
理解 Whisper 的机制有助于你针对准确性、速度和成本等目标进行实际调优。架构知识能帮助制定明智的策略。
连接主义时序分类
CTC 声学模型在语音识别系统中处理模糊的语音到符号映射。这些模型旨在处理将输入序列(如音频帧)与输出序列(如音素或单词)对齐时的固有不确定性。这在语音识别中尤为具有挑战性,因为口语单词之间的边界不明确,而且同一个单词的发音可能因上下文而不同。
让我们深入探讨!我们将探索 Whisper 如何与 CTC 和变压器融合,以及如何整合语言学知识,了解它是如何将端到端和混合技术结合起来的。这些讨论不是独立的,而是 Whisper 架构中相互关联的各个方面。
理解权衡——端到端方法与混合模型
在设计 ASR 系统时,架构师面临一个关键决策:端到端方法还是混合建模策略。这一初步选择会影响到准确性、速度和适应性等方方面面。在实施 Whisper 或任何生产级语音平台之前,开发人员应考虑两种方法之间的深层权衡。
Whisper 是一个端到端还是混合型自动语音识别(ASR)系统?
OpenAI 的 Whisper 是一个使用端到端方法的 ASR 系统。Whisper 的架构采用编码器-解码器变压器(transformer)实现,输入的音频经过两步处理。首先,它生成音频的数学表示,然后将该表示解码为一系列文本标记。这一过程是端到端方法的典型特征,即整个任务——从原始音频输入到文本输出——都由单一集成的模型处理。因此,Whisper 可以被归类为一个端到端的 ASR 系统。
一些混合型 ASR 系统的例子包括:
-
基于 Kaldi 的 ASR 系统:Kaldi 是一个用于语音识别研究的开源工具包。它支持 DNN-HMM 混合模型和端到端深度学习模型,通常为其混合模型使用 LF-MMI 训练。
-
Vicomtech 语音转录系统:这些系统曾用于 Albayzín-RTVE 2020 语音到文本转录挑战,并且很可能包含了混合 ASR 组件。
-
Wav2Vec 2.0:这是由 Facebook AI 开发的自监督学习模型,用于语音识别,可应用于端到端和混合 ASR 系统。在混合 ASR 模型中,Wav2Vec 2.0 可以生成高质量的声学表示,作为传统 ASR 系统(如 HMM 或 DNN)的输入。
这些混合系统旨在通过利用神经网络的判别训练能力和深度特征提取,同时利用 HMM 的强大序列建模能力,来有效处理语音信号中的时间变异性。
理论上,端到端建模看起来是理想的。一个统一的模型可以优化声学信号到转录的完整映射,这巧妙地避免了胶水代码和中间表示。然而,正如我们在本节中探讨的,混合架构仍然主导着行业系统,因为存在延迟、定制性和鲁棒性等其他限制。
图 2.1 比较了传统的混合基础和更现代的端到端 ASR 系统。两个系统都以空中交通管制员(ATCO)的语音通信作为输入,并生成转录作为输出。

图 2.1 – 传统的混合基础和更现代的端到端 ASR 系统(《虚拟仿真-飞行员代理用于空中交通管制员培训 - ResearchGate 上的科学图表》。可从以下网址获取:https://www.researchgate.net/figure/Traditional-hybrid-based-and-more-recent-end-to-end-automatic-speech-recognition-systems_fig1_370961598)
在传统的混合基础 ASR 系统中,处理过程从输入语音通信的特征提取开始。接着进行声学建模,将声学特征映射到音位单元。下一步是发音建模,将音位单元映射到单词。最后,使用语言建模来预测单词序列的概率,生成最终的转录结果。
另一方面,端到端 ASR 系统直接将输入的语音通信映射到输出的转录,跳过了声学、发音和语言建模的中间步骤。这简化了系统,并可能提高性能。
该图还显示了可以添加的可选模块(以虚线块表示),以提高系统的整体性能。这些包括监视数据或其他数据类型,如部门或航点。这些附加数据源可以提供上下文,帮助 ASR 系统更好地理解和转录空中交通管制员(ATCO)的语音通信。
总结来说,图 2.1展示了传统混合基础与端到端 ASR 系统之间的差异,并展示了如何通过额外的数据源来提升其在空中交通管制背景下的性能。
在端到端与混合基础的 ASR 系统之间没有绝对优越的选择。所采取的方案会影响适应性、部署需求和可扩展性。让我们分析在确定正确战略方向时的关键考虑因素。
准确性和输出质量
对于许多应用来说,识别精度至关重要。架构决策对输出质量有显著影响:
-
端到端优势:联合训练的组件直接针对最终目标:没有次优的流水线或割裂的错误。
-
混合优势:混合搭配最佳的声学和语言组件。定制错误的平衡。
在实践中,混合模型通过将最佳的声学模型如Wav2Vec 2.0与先进的变换器语言模型结合,实现了最先进的准确性。专门化优于泛化,但端到端模型正在迅速追赶。
输出质量还取决于诸如训练数据量、模型大小和个性化技术等因素。但在规模上,混合系统超越端到端系统,部分原因在于其可定制性。
延迟和吞吐量
实时识别需要优化低延迟,而流式自动语音识别(ASR)要求快速增量输出,而不仅仅是批量离线解码。端到端网络通常更为庞大,且计算密集,没有模块化组件。这为实时系统引入了延迟挑战:
-
端到端困难:联合模型应用全序列上下文,输出滞后于音频输入。
-
混合优势:独立的声学和语言模型使流式低延迟识别成为可能。
尽管如此,卷积神经网络架构和模型蒸馏等创新仍在持续改善端到端的延迟表现。云加速硬件缓解了计算约束。
吞吐量问题较小,因为现代系统可以并行处理大量音频流。总体来说,混合方法目前能实现更快的增量输出。
定制与控制
可定制性允许将 ASR 能力量身定制为特定领域,如医学、法律或客户支持中心。这需要接口化的独立语音和语言组件。端到端系统在替换专用模块或注入领域知识时,灵活性较低:
-
端到端困难:纠缠的组件限制了模块化和自定义输入。
-
混合优势:混合和匹配声学、发音和语言模型。
模块交换的能力使得在混合系统中将模型偏向特定词汇或格式变得更简单。这种更大的控制力和专业化提高了在特定应用场景中的适用性。
部署要求
硬件限制(如内存、计算能力和功耗)决定了语音识别系统的可行部署环境。
-
端到端困难:大型、资源密集型的模型给边缘设备带来了压力。
-
混合优势:将管道分布到不同的系统和专业设备上。
例如,研究人员在低功耗的终端设备上执行声学模型,同时将语言模型卸载到云端,有效地实现了分布式处理。诸如量化等压缩技术可以缩小模型,但混合系统提供了更多的部署灵活性。
从多个方面来看,端到端建模代表了一种哲学上更纯粹的方法。但混合系统则做出了实际的折衷,解锁了模块化、可定制的架构。这使得它们能够在多种语音识别应用中提供更高的准确性、更低的延迟和更灵活的部署。
Whisper 为未来铺设了一条激动人心的发展道路,在保留混合声学/语言分割的同时,解锁了端到端建模的诸多优势。随着对话式 AI 研究的快速发展,未来我们或许会看到端到端网络能够与混合方法相媲美,甚至超过它们,这得益于足够的数据和计算能力。但目前,混合架构在生产环境中的语音识别中占据主导地位,因为它们在质量、速度和控制之间达到了平衡。
正如我们刚刚探讨的,Whisper 通过融合端到端和模块化组件找到了最佳的平衡。让我们深入了解 Whisper 整合的具体神经网络架构,包括 CTC 模型和 Transformer,以创建这样一个高性能的混合语音识别管道。
在 Whisper 中结合了连接时序分类(CTC)和 Transformer 模型。
在幕后,Whisper 融合了两种强大的神经网络架构,解锁了强大的语音识别能力:
-
CTC 擅长标注未分割的序列数据,如音频流。
-
Transformer 通过自注意力机制编码序列中的全局依赖,捕捉长距离的语言上下文。
这种混合 CTC/Transformer 方案基于几十年对递归网络、计算机视觉和自然语言处理(NLP)领域的研究。由此产生的系统能更好地处理对齐和未对齐的语音,具有更强的上下文理解能力。让我们来探讨一下 Whisper 的技术基础。
连接时序分类(CTC)
CTC 算法于 2006 年提出,为转录未分割的序列提供了一种优雅的框架。它可以在不知道对齐边界的情况下,从原始流中识别标签。
语音识别必须处理连续输入,其中单词和声音之间的过渡模糊不清。与文本不同,音频信号并没有预先按语义单元分割。CTC 学会从特征序列中直接检测音素和转录文本。
CTC 将标签任务框定为预测所有可能标签序列的概率分布。初始输出层为每个时间步发出标签候选项。后处理则使用动态规划将这些候选项整合为最终的、最可能的转录文本。
例如,CTC 的初始网络层可能输出类似于“th―e c―a―t s―a―t.” 的杂乱序列。重复的标签和空白会被压缩成最终的预测结果:“the cat sat.”
CTC 的算法方法本质上是将预测“扭曲”到正确的真实标签序列上。像 Wav2Vec 2.0 这样的强大声学模型现在利用 CTC 将语音识别框定为一个通过深度学习解决的序列转导问题。
Transformer 和自注意力机制
Transformer 于 2017 年首次引入用于机器翻译。通过以全新的方式建模序列,它们实现了突破性的成果。与递归和卷积不同,Transformer 使用多头自注意力机制处理输入。
该机制通过将序列位置与每个其他元素关联,计算序列位置的表示。模型学会了哪些上下文关系对专注的任务(如翻译)最为重要。
例如,Transformer 通过大量加权关键自注意力机制,基于输入生成下一个输出词。这使得它能够全面理解长距离依赖关系,而这些在 RNN 和 卷积神经 网络(CNNs)中是无法实现的。
现在,Transformer 支撑着最先进的自然语言处理技术,涵盖了机器翻译、问答、对话系统等领域。像 GPT-4 这样的模型展现了它们出色的语言能力。
CTC、Transformer 和语音的结合
现代的 ASR 系统结合了这些先进的神经网络架构。CTC 处理带有模糊声音对齐的未标记音频流,Transformer 则编码稳健的语言表示并输出文本修正。
具体而言,Whisper 在解码过程中将 Transformer 融合到 CTC 声学模型之后。这个两步管道最大化了听觉和语言学习:

图 2.2 – Whisper ASR 系统中的两步管道
CTC 模型首先从原始音频生成标签候选项。这解决了模糊的声音到符号的转化挑战。下游的 Transformer 则通过更好地结合语言上下文,细化和纠正初始 CTC 输出。由于人类语音通常偏离正式的文本语言,因此需要额外的语言特定条件化来提高转录准确性。
在训练过程中联合优化,该架构将语言结构适配到不完美的声学输出上。Whisper 架起了听觉和语言领域的桥梁,处理现实世界中的语音识别。
总结来说,融合 CTC、变换器和语音技术能够释放协同效应的优势:
-
来自 CTC 专业化的强大声学建模
-
来自变换器自注意力的全球语言上下文
-
所有组件之间的联合优化
-
分模块定制
CTC 和注意力机制共同提供了二者的最佳优势。Whisper 依靠它们互补的超级能力来推动最先进的功能。这一技术组合为 Whisper 在复杂环境中进行语音识别提供了可靠性和准确性。全神经网络的设计也通过端到端的联合优化简化了训练过程。
预计变换器架构将在推动对话 AI 的基础上占主导地位。结合如 Whisper 所示的互补专业技术,它们灵活的建模能力解锁了不断改进的语言感知语音识别系统。
现在我们已经探讨了 Whisper 如何结合 CTC 和变换器模型的优势,以应对转录语音信号的声学挑战,接下来我们准备研究方程的另一半——整合语言学知识,将信号转化为连贯的语言。毕竟,精确的语音识别不仅需要精准的声学信号解码——输出还必须符合自然语言(如英语)的构造和惯例,才能使用。
语言学知识在 Whisper 中的作用
强大的语音识别不仅仅需要解码音频信号。系统必须考虑到人类语言的复杂性,以应对现实世界中的变化和模糊性。这正是整合有意义的语言学知识变得至关重要的地方。
最先进的解决方案,如 Whisper,通过将声学预测与语言特定的调节相结合,提升了准确性。语言模型提供了基于语言构造的潜在单词或音素序列的统计概率。这使得在多个候选结果中,能够选择最符合声学信号的最可能的文本转录。
语言特定的调节随后将模型调整到目标语言的特征和惯例,包括以下内容:
-
词汇表——有效的单词和词汇结构
-
语法——词语如何组合成短语结构
-
发音建模——合理的语音音素和模式
-
非母语发音挑战——适应第二语言使用者的口音
-
方言——处理全球不同方言
通过量身定制这些语言学属性,Whisper 开发了丰富的理解能力,有助于从核心音素到语义等方面强健地识别语言元素。这一定制使得能够优雅地处理现实世界中复杂的语音特征。
语言特定条件化
语言特定条件化通过解决声学不确定性,使转录更加精确,例如减少同音异义词之间的混淆,如“they’re”,“their”和“there”。ASR 系统从潜在单词和语言特定条件化提供的上下文中建模概率分布。例如,音系约束描述了特定语言中音素的可组合性,可以在声学线索丢失或失真的情况下引导 ASR 系统。语义分析还可以使语音识别系统偏向于适合特定任务或领域的句子,而远离没有意义的单词序列。
让我们探讨一下赋能 Whisper 的监督和半监督训练的各种语言特定条件化方面。
词汇编码
语音识别需要将音频映射到语义符号,如单词或子词单元。Whisper 从涵盖网页、书籍、代码等多种文本数据集对词汇进行编码。
在写作时,Whisper 的最新版本 large-v3 于 2022 年 11 月 6 日发布。该模型在 100 万小时的弱标签音频(弱监督预训练)和 400 万小时使用 large-v2 收集的伪标签音频上进行了训练。Whisper 的弱监督预训练过程将可解析的语言结构刻录到模型中。这些结构本质上是语言中的模式和结构,模型学习识别并再现这些模式。这个学习过程不像完全监督学习那样精确,但它为模型提供了足够的信息,使其能够有效学习。当模型在下游语音识别任务中进一步微调时,这些学习到的语言结构会转移到新任务上。这意味着模型可以将预训练期间发现的模式和结构应用到下游任务中,从而识别和转录语音。实质上,弱监督预训练过程使得 Whisper 能够从一个大型多样化的数据集学习语言词汇的广泛理解,并在微调时将这种词汇理解应用于特定任务。
Whisper 的语言特定条件化和词汇编码是围绕词汇和短语的形状在语言模型中刻录细微统计表示的关键。通过编码允许的语言形式和结构,Whisper 能够对连续的语音信号进行分段,并选择性地呈现符合学习到的词汇模式的合理单词候选项。这种语言熟悉性有助于通过将输出限制为与编码词汇一致的合理词汇选择,来解决声学解码中的不确定性。换句话说,通过彻底建模语言词汇规范的形状和轮廓,Whisper 能够将噪声语音信号平滑地映射到与其词汇知识一致的有效文本候选项。
语法和结构
除了单个单词外,处理自然语言还需要编码允许的语法模式。诸如词性顺序(例如,名词→动词→副词)和多词短语(例如,“on the other hand”)等结构构成了允许的句法。
Whisper 的预训练暴露包含了跨多个领域的常见英文文本结构,如新闻文章、文学作品、电子邮件、代码等。这种多样性涵盖了简单和复杂的构造。
结果生成的语言模型会引导输出向有效的表达靠拢。例如,语法知识有助于根据上下文正确扩展缩写和首字母缩略词(例如,知道 NASA 指的是美国国家航空航天局)。这不仅仅是基础词汇的熟悉。
结构化的语言表示减少了那些不符合接受的语法和表述规范的错误转录。
发音建模
人类在不同地区和情境下发音有所不同。建模多种口音、语音障碍、连读以及其他变异性有助于提高识别能力。
Whisper 展现了对独特发音风格的显著适应能力。其自监督预训练利用了包含多种声音的音频叙述数据。
与不同说话者的接触教会了原始声学信号与其相关单词之间的关联,不管是微小的变化。即便如此,关于习惯发音偏差的模式依然会显现。
通过吸收大量语音数据,Whisper 建立了抗合理偏差的声学语言连接。这赋予了解码灵活性,而不至于过于脆弱。
非母语发音挑战
然而,建模流利的非母语发音会带来更多的挑战。第二语言学习者的发音模式可能与母语规范有较大偏差。
例如,普通话中文说话者在讲英语时会始终将/l/发音替代为/r/。其他音节不匹配会让语言学习者在相对有规律的方式下出错。
处理这些非母语的发音模式需要在训练过程中进行更多的多样化,以捕捉各种口音的长尾。幸运的是,Whisper 的自监督预训练利用了来自国际来源的英语叙述数据。
该模型编码了常见的第二语言发音偏差与正确标准转录之间的关联。这种暴露帮助模型学习关联,即便是发音不准确的单词或错序的视觉音素。
结果是一个更具全球相关性的系统,能够宽容地处理非母语、受口音影响的发音。与以前在训练中缺乏足够方言范围的基准相比,Whisper 在识别学习者方面表现出了显著的提升。
方言流利度
除了发音外,同一种语言的群体之间往往有更显著的方言差异,无论是英式英语、还是新加坡英语;支持多种方言需要方言调优的建模。
Whisper 接收了涵盖国际出版物、书籍、网络文章等的英语数据。这使得其语言能力不仅限于美式英语,涵盖了更多包容性方言。其词汇、语法和措辞体现了多样的英语方言。
这种广泛的接触让它能够优雅地适应全球用户。性能依然强劲,而不仅仅是过度拟合到某一种英语口音。该模型能够在各个方言之间进行泛化。这种方言灵活性防止了在不同地区和使用领域的准确度碎片化。Whisper 旨在其语言基础上实现方言无关的流畅性。
Whisper 通过将语音识别与多方面的语言知识结合,轻松应对现实世界中的语音复杂性。其前所未有的词汇容量、方言范围和句法掌握能力使其能够高精度和高召回地解码各个领域中极为多样的音频内容。
很快你就会理解从声学特征提取到语言模型解码和优化的整个过程。这个系统性的视角将不同模块的工作方式联系起来,推动 Whisper 的端到端流程。
掌握了架构知识后,我们将根据你具体的精度、延迟和成本等使用场景要求优化配置。但在此之前,让我们先将 Whisper 拆解成其关键子系统。
理解 Whisper 的组件和功能
现在我们已经解密了 Whisper 的架构和优化设计,接下来是深入探讨其功能组件的时候了。本节内容将详细解析驱动 Whisper 语音识别流程的模块,从音频输入到文本输出。
我们将探讨将口语转化为机器可读转录的过程。我们的目标是通过系统性直觉,理解 Whisper 各部分如何流畅合作,处理大规模的现实世界语音翻译挑战。
尽管数学复杂性在幕后操作,但你将获得以下内容的清晰理解:
-
原始音频信号的预处理
-
声学模式的编码
-
语言建模
-
搜索输出空间
-
转录文本的优化
理解这些功能模块能为调整配置和组件提供直觉,优化配置以适应你的使用场景要求。架构知识可以促进战略性优化,微调调整可能带来显著提升。
让我们像拆解一只复杂的瑞士手表一样,开始探索 Whisper 的组件。
音频输入与预处理
从语音到转录的旅程始于音频输入。Whisper 通过麦克风或其他音频捕捉设备获取原始波形信号。这些模拟音频信号经过前端处理,包括噪声过滤和数字化,提取干净的特征并编码语言内容。
理解 Whisper 的音频处理阶段对于配置合适的数据采集管道至关重要。我们必须为系统提供优质的输入,重点关注语言本质,而非干扰特征。
让我们来探索音频输入硬件的作用、预处理考虑事项以及 Whisper 的特征提取过程,这些构成了关键的基础。
音频输入源
高性能语音识别要求从一开始就获取优质的信号。尽管环境中的噪声条件各异,但 Whisper 理想的音频捕捉设备包括以下内容:
-
麦克风:专用麦克风硬件具有清晰的定向输入,确保能够捕捉到用户的清晰语音。消费类设备通常配备的麦克风组件不足,无法有效隔离人声。优先选择领夹麦克风或麦克风阵列,专注于捕捉说话者的声音而非环境噪声。
-
近场源:尽可能将麦克风放置在目标说话者附近,以减少干扰。这可以防止远场声音的污染。让用户直接对着设备说话。
-
低噪声条件:选择安静的室内环境,避免干扰性背景噪音。回音较大的房间也会扭曲音频——如果可能的话,尽量在经过声学处理的环境中录音,以减少噪声。
预处理和滤波
在分析之前,原始音频需要预处理,以提高信号质量并提取关键特征。Whisper 会进行以下重要调整:
-
噪声减少:环境噪音如电器的嗡嗡声会降低性能。自适应滤波器能够识别并减去可预测的背景噪音频谱。
-
增益归一化:录音音量的变化应归一化到标准强度范围——仅靠响度无法传达语言意义。目标是将音量控制在-20 到-10 dBFS 之间,以确保语音峰值清晰且未压缩。
-
频率均衡:通过平衡低频、中频和高频段的相对能量分布,锐化语音成分如辅音和元音的声学特征,以便算法更好地识别。
音频特征提取
最终的前端步骤通过信号处理技术提取音频数据的有用数值表示,然后再输入到 Whisper 模型中。基本的特征提取方法包括以下内容:
-
频谱图:通过视觉方式映射音频频率随时间变化的信号能量差异,揭示语音成分。
-
对数梅尔滤波器组:通过压缩和平滑关键频段,模拟人类听觉系统的频率感知。
-
梅尔频率倒谱系数(MFCCs):通过 MFCC 变换器,统计性地将频率数据压缩到最具变异性的潜在维度。
结合像像素一样的时间帧序列,这些高级特征以模型可消费的张量形式编码音频,同时进行去噪。由此产生的紧凑预处理捕捉了核心语音本质,以便为声学建模提供信息。确保前端处理正确,确保 Whisper 获得干净的数据。
接下来,我们将看到 Whisper 如何利用这些输出解码语音成分为文本。
声学建模
下一阶段是音频预处理后进行声学建模,将音频转换成有用的特征表示。这通过统计学习将低级语音信号转化为更高级的语言单元——这是将声音转化为语言符号的第一步。
声学建模揭示并编码原始语音音频模式与相应文本产物(如单词、音素或字符)之间的关联。模型捕捉以下内容的系统关系:
-
口语化声音
-
单词拼写
-
语言语义
通过数学表示这些关联,像 Whisper 这样的系统将语音波形解码为可能的转录文本,架起了声学与语言学领域之间的桥梁。
用于声学建模的语音单元
理想情况下,声学模型应直接将波形信号转换为完整的转录文本。然而,可靠地建模如此复杂的条件概率需要涵盖所有变异的大规模数据集。因此,架构师插入中间步骤,将声学信号与更小的构建单元连接起来:
-
音素级建模
HMM(隐马尔可夫模型)历史上将音频解码成构成音素,作为下游处理的过渡输出。然而,这需要预先对语音信号进行分段,这依赖于先前的声学理解。
-
字符级建模
现代的端到端架构,如 Deep Speech,直接将声学信号翻译成字符。但单纯聚焦于字符可能会失去对更高级结构(如单词和短语)的敏感性。
Whisper 采用了一种折中的方式——将定制的子词建模为目标声学调节标签。这些数据驱动的词汇单元在原子信号与复杂短语之间找到了平衡,使得声音细节与语言结构得以充分展现。
Whisper 的声学模型架构
使用 CTC 损失函数,Whisper 的声学模型将因果卷积层与递归变换器融合。这种独特的组合处理局部音频模式,同时学习长期依赖关系:
-
卷积操作检测与字符序列相关的局部声学模式,同时在小的原始音频窗口上进行操作。不同的滤波器学习不同的语音属性。
-
循环层通过使用变换器对顺序卷积表示进行上下文处理,跨越更长时间段。注意力分布将当前音频与前一段联系起来,以处理从单个声音到完整多词语句的连续信号动态。
-
CTC 损失函数提供了训练监督,将低级音频模式与目标单元标签(如子词)进行连接。对齐操作被隐式处理。
Whisper 的声学模型架构提供了一个强大的深度神经网络映射,将声学信号直接转换为语言结构,用于下游解释。这构成了语音识别的基本声音到语义的基础。
语言建模
声学模型处理第一阶段,将语音音频转化为语言符号。但理解这些符号需要理解词汇、语义、语法等语言规则。进入语言模型——Whisper 的上下文专家。
当声学模型解码音频信号时,语言模型解释符号序列,提供关于允许语句的上下文。它们使用训练期间看到的统计模式和固有规则,对来自上游声学模型的临时转录进行评分和优化。
这意味着根据可能的语言结构消除歧义。例如,语言模型知道,“The clouds are in the ____”更可能填入“sky”而不是随机的无意义词语——模型通过评估合理性来缩小不确定性。
Whisper 的变换器语言模型
Whisper 采用了一个独立的基于变换器的语言模型,它处理声学模型的临时输出。该变换器包含了学习到的表示,描述了英语中单词与多词词组之间的统计关系。它通过堆叠的自注意力层建模复杂的语言上下文,将当前符号与周围符号相关联。
具体来说,Whisper 的语言模型利用掩码语言建模(MLM)来预测给定上下文中随机隐藏的词。这种方法使得模型能够根据可见的上下文和学习到的模式进行推理。
掩码语言建模
MLM 是一种在自然语言处理中的训练技术,在训练过程中会故意掩盖或隐藏输入数据的部分内容,模型需要基于未掩盖的词语上下文来预测被隐藏的词语。在 Whisper 和其他语音识别系统的上下文中,MLM 可以用来训练模型更好地理解语言结构和语义,尤其是在噪音环境、方言或技术性语言等复杂条件下。归根结底,MLM 使得模型能够学习语言的基本结构,提高其在困难条件下准确转录语音的能力。
通过将声学信号的可能转录与对语言约定的强大理解进行对比,模型重新评分并优化输出,以确保一致性。流利性和语义精度得到了显著提高。
相较于N-gram 的优势
历史上,语音系统使用简单的历史n-gram 计数来建模语言——即每个词后跟随观察到的序列的概率。例如,3-gram 编码了每个词基于前一个唯一的词对出现的概率。
然而,这些马尔可夫模型无法利用更长范围的上下文和结构复杂性。人类语言比截断的历史统计更为复杂。
相反,变换器语言模型学习整体表示,其中每个符号与周围的符号在上下文中相关联。没有独立假设。变换器能够处理*n-gram 所忽视的复杂性,如层次短语结构。
这使得 Whisper 在将声学转录精炼成有效的、连贯的文本结果时,能更加深入地理解语言行为。强大的现代语言建模处理了超出表面统计的复杂性。
接下来,我们将探讨所有上游组件在解码阶段如何协同工作,生成最终的语音识别输出。
解码
在继续解码之前,让我们回顾一下之前的管道阶段。音频输入与预处理阶段将原始波形转换为信息丰富的数字表示,提取相关的音频特征。接下来,声学建模阶段从音频特征中预测语言标签输出,如字符或子词,生成一组估算标签序列。接下来的阶段是语言建模,通过融入上下文知识评估和重新评分声学模型的初始标签序列预测,确保更大的连贯性,从而得到中间转录。
所以,总结一下:
-
音频预处理提供输入特征。
-
声学建模做出初步的标签序列预测。
-
语言建模重新评分这些中间输出。
现在,让我们了解解码阶段如何搜索最优的文本转录,既符合声学指导,又符合语言指导。
在提取语音特征、估算标签序列并评分中间转录后,最终阶段生成最优的文本输出——这一过程叫做解码。这个推理阶段结合了所有上游组件。
解码器采用声学模型标签预测,并根据语言模型的指导找到最合适的词序列。高效的搜索对于在可能的转录空间中导航至关重要。
让我们探索 Whisper 的解码方法。
束搜索
OpenAI 采用了束搜索——一种快速的启发式算法,它近似最可能的序列,同时修剪掉不太可能的候选序列。这样可以将计算集中在最有前途的解码文本结果上。
束搜索示例
这里有一个简化的示例,展示了束搜索在 Whisper 中的工作原理。
假设我们有一个音频输入,内容是“Hello, world”,并且我们使用宽度为二的束搜索(意味着在每一步我们保留两个最可能的序列)。
在第一步中,模型可能会根据音频输入的声学特征预测最可能的首个单词是“Hello”和“Yellow”。
在下一步中,模型会考虑两个序列的扩展。它可能预测“Hello, world”和“Hello, word”是“Hello”的最可能延续,而“Yellow world”和“Yellow word”是“Yellow”的最可能延续。然后,模型会比较这些序列,并保留两个最可能的整体。假设它保留了“Hello, world”和“Yellow world”。
这一过程会持续,直到满足停止条件。最终,模型可能会输出“Hello, world”作为音频输入的最可能转录结果。
需要注意的是,这是一个简化的例子,实际过程涉及基于模型学习的参数进行复杂的概率计算。此外,束宽度可以调整,以在计算效率和转录精度之间进行权衡。
束搜索逐步构建部分转录,每次添加一个标记,并根据条件模型分数保留每一步的最顶端候选项。单词会按概率顺序添加到活动假设中。
通过丢弃不太可能最大化最终目标的低评分链条,搜索仍然可控,而无需穷尽地分析所有选项。束宽度决定了处理的广度。更宽的束改善了准确性,但代价是效率下降。
Whisper 利用动态束搜索修剪来实现最佳的权衡。束宽度根据中间置信度分数扩展和收缩。在不确定的片段中,会保留更多候选项,随着清晰度的提高再进行缩小。
重新评分和重排序
在生成候选转录后,Whisper 通过更重的处理重新评分输出,以进一步提升效果。二次评估更好地融入了最初被忽略的更丰富上下文。为了进一步优化准确性,Whisper 采用了以下额外技术:
-
N-最佳列表重排序,它会在通过更强大的语言模型评估后重新排列最顶端的假设,而不是在束搜索中使用的快速近似器。这提高了精度。 -
LSTM 重新评分,它超越了重排序;这种技术涉及将声学输出输入到辅助 LSTM 网络,这些网络充当替代解码器。这捕捉了基线模型未能捕捉到的不同语音细微差别。
结合不同的搜索、评分和解码策略,使 Whisper 的整体流程能够自我纠正——这是深度学习系统设计的一个标志。没有单一的方法能够垄断性能。
接下来,我们将看到最终阶段,重点是对这些解码结果进行后处理,以准备清洁的机器可读文本供下游使用。
后处理
在将音频解码为最终文本转录后,Whisper 应用各种后处理方法进一步润色和结构化输出——这是在呈现识别的语音之前的最后一步。
后处理器处理格式、准确度优化、实体链接等。这个关键但常常被忽视的处理阶段完成了语音到语言的转换,将粗略的解码文本转变为可消费的、可操作的信息。让我们一起探索 Whisper 的一些关键后处理能力。
文本规范化
首先,原始解码文本被规范化为符合书面语言惯例的格式。文本规范化在将原始解码文本转换为符合适当书面语言惯例的格式时至关重要。以下是文本规范化应用的一些示例:
-
数字被扩展为单词:例如,文本中的数字“2023”将被扩展为“两千二十-three”,以便在转换为语音时更易于阅读和理解。
-
去除流畅性障碍,如填充词:在语音转录中可能会出现“嗯”或“啊”之类的填充词,这些在文本规范化过程中会被去除,从而创建出更清晰、更流畅的书面表达。
-
标点和大小写得到标准化:文本规范化确保标点符号正确放置,单词按照书面语言规则恰当地大写。例如,句首的单词会大写,句末会加上句号或逗号,以反映自然的停顿和句子结束。
通过将反映实际口音的字面转录转换为具有自然阅读流畅度的格式,文本规范化在保持意义的同时,增强了可读性和整体用户体验。
准确度优化
接下来,为了进一步增强准确性,检测到的错误会通过辅助模型自动修正,这些模型经过训练以识别和修正常见错误:
-
同音词如“they’re”(他们)/“there”(那里)/“their”(他们的)会得到纠正。
-
类似“the the”这样的冗余问题会被修复。
-
常见的替换通过混淆矩阵处理(例如,纠正频繁出现的“pat”(拍)/“bat”(蝙蝠)混淆)。
与最终的语法检查一起,精准度精炼网络通过学习人类编辑过的转录中的修正模式来不断提高修正精度。
实体链接
Whisper 的语音理解能力不仅限于文字输出。它涉及到一个至关重要的步骤——实体链接,将解码后的单词与现实世界中的对应实体连接起来。将单词与数据关联是解锁上下文理解的关键。
当 Whisper 在语音中遇到品牌名称时,它不仅仅转录这些单词;它还将这些单词映射到知识库中的标准 ID。这种链接让 Whisper 理解品牌的背景、产品和市场。同样,当提到某个人时,Whisper 会利用人脸识别技术识别该个体,并将名字与丰富的个人信息档案关联起来。
地理参考是实体链接展现优势的另一个领域。通过将地点名称与地理数据库连接,Whisper 能够理解语音的空间上下文,并将提到的地点与其坐标、人口以及其他相关数据点关联起来。
通过将词语与数据结合,Whisper 能够将语音理解为一连串的单词和一个互联的概念网络。它可以利用这些关联信息更准确地解读语音的意义和上下文。因此,实体链接是 Whisper 弥合原始语音和真正理解之间差距的关键组件。
结构化输出
最后,Whisper 使用针对目标用例量身定制的语义架构来构建已识别的内容:
-
标注问题以生成对话回复:假设用户向语音助手询问:“今天的天气怎么样?”Whisper 可以将这个输入标注为问题,从而允许语音助手生成类似于“今天的天气晴,最高气温 75 华氏度”的对话式回答。
-
标记命令以触发动作:如果用户说“设置早上 7 点的闹钟”,Whisper 可以将其标记为命令。这个标记告诉语音助手设置闹钟,而不是将语音转录。
-
标记关键词以进行内容分析:在一次商务会议中,某个参与者可能会说:“我们的 Q1 收入超出预期,但我们需要在 Q2 改善市场营销策略。”Whisper 可以将“Q1 收入”、“超出预期”和“改善 Q2 市场营销策略”标记为关键词。这些关键词随后可用于内容分析,帮助企业追踪会议中的重要话题和趋势。
这种输出框架简化了下游的消费、索引和学习。
正确完成最后一公里的后处理,为 Whisper 的语音识别做好实际应用准备。解码器将音频信号转录,后处理器将这些信号转码为可用的、易访问的语言。
通过最后的后处理阶段,我们已经涵盖了 Whisper 语音识别管道的全貌——从音频输入处理器到声学分类器、语言模型、解码器和输出优化器。
当这些组件结合在一起时,它们将口语自然语言吸收并系统地将信号转换为下游应用程序可处理的精确文本记录。
我们已经围绕模块之间的数据流构建了强大的直觉,使 Whisper 在大规模应用中具有前所未有的准确性和速度。理解这些机制为优化路径的开辟提供了可能。
现在,具备了架构知识,我们准备将重点转向针对基础设施限制和用例目标的 Whisper 实施的定制配置、故障排除和进展。
下一部分将介绍有关权衡和加速 Whisper 以适应成功场景的专门指南,同时保持准确性、可用性和效率标准。
应用最佳实践进行性能优化
现在,凭借对 Whisper 架构和数据流的扎实理解,我们准备将重点转向实际部署。本节内容提炼了基础性指南、权衡和操作智慧,加速生产成功。
我们将涵盖超越基本设置的专题——从战略性配置基础设施到监控指标、集成下游 NLP、调整配置和排除常见故障。将其视为有效扩展 Whisper 基础解决方案的手册。
虽然基础设施提供了坚实的基础,但环境的复杂性决定了最终结果。通过根据您的上下文量身定制和简化系统范围的堆栈配置,我们能够解锁更高层次的可靠性、效率和投资回报(ROI)。具体而言,这包括以下步骤:
-
优化分配云端、边缘或设备端的计算资源
-
在不发生拥塞的情况下平衡数据管道
-
调整精度和延迟以满足用例需求
-
与相邻工作流程平滑互操作
-
快速处理异常情况
让我们为现实条件的需求准备实施方案!
理解计算需求
在部署高性能 Whisper 驱动的应用程序时,计算资源的配置至关重要。分配的 CPU、GPU、内存和存储资源直接影响吞吐量、延迟和并发性。
不幸的是,Whisper 的规模使得许多人低估了其生产基础设施的需求。拥有超过 5 亿个参数,该模型需要大量硬件加速,才能在用户间提供实时语音识别。
本节内容提供了优化 Whisper 部署的计算指南。我们将揭示其架构的考虑因素,从设备端点到云加速请求,目标是找到最佳的基础设施匹配。
Whisper 的核心工作负载包括神经网络推理中的矩阵乘法。这些操作对不同的硬件组件产生压力,具体包括:
-
GPU 加速深度学习矩阵计算并行处理,能够同时处理数百个操作——其成千上万的核心非常适合机器学习的数值处理。对于 Whisper 来说,GPU 驱动着更快的声学模型推理。
-
CPU 也提供并行化能力,但它们更适合于通用分支逻辑的处理,而非专用数学运算。Whisper 依赖 CPU 进行音频解码、束搜索和语言模型计算。
-
内存为模型参数和音频输入提供支持。Whisper 需要 GB 级的存储空间和在处理单元之间进行数据传输。高带宽有助于减少传输瓶颈。
-
存储用于保存预训练的权重和缓冲预测输出。高吞吐量的NVMe SSD 处理着重的读写 Whisper 工作负载。
补充笔记本 LOAIW_ch02_exploring_audio_data_workflows.ipynb (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter02/LOAIW_ch02_exploring_audio_data_workflows.ipynb)提供了有关 Whisper 的计算考虑事项的更多细节,包括本地设备、边缘和云部署的架构权衡。
平衡这些资源可以防止系统瓶颈,从而提高性能。要仔细考虑整个技术栈。
考虑到这些资源需求和硬件能力,我们现在探讨针对不同终端目标的专业化优化指南。
优化部署目标
在不同环境中优化 OpenAI 的 Whisper 模型部署需要一种战略性的方法,考虑到每个目标平台的独特需求。以下是关于在不同环境中部署 Whisper 的中级最佳实践说明。
设备本地部署(手机和物联网设备)
在移动电话和物联网设备上的部署,重点应放在效率上,因为这些设备的计算资源有限。Whisper 模型的选择应基于大小与精度之间的平衡。使用 whisper.tflite 在 Android 移动设备上进行的 40 MB 量化模型推理(github.com/openai/whisper/discussions/506)是一个适合此类设备的轻量级模型示例。利用平台特定的神经加速器,如 Apple 的神经引擎或 Google 的边缘张量处理单元(TPU),对提升性能至关重要。内存管理同样至关重要,因为这些设备的 RAM 限制,因此开发人员必须确保 Whisper 模型不会耗尽可用内存。
边缘服务器部署
边缘服务器是私有节点,能够在提供类似云基础设施的可扩展性的同时提供模型容器化。对于边缘部署,建议使用多核 CPU 和深度内存缓冲区来处理计算负载。负载均衡的 GPU 可以加速推理任务,低延迟的存储解决方案如 NVMe SSD 集群可以提升系统的整体响应速度。Whispering(Whispering: Joint Service Offloading and Computation Reuse in Cloud-Edge Networks - www.ncbi.nlm.nih.gov/pmc/articles/PMC8528222/)涉及在边缘进行计算重用,通过避免冗余计算显著减少任务完成时间。
云基础设施部署
在云环境中,虚拟机提供了按需扩展资源的灵活性。对于 Whisper,选择为机器学习优化的机器镜像(例如 AWS 的 inf1 实例,配备 Inferentia 芯片)是有益的,因为它们能提供具有成本效益的高性能推理。自动扩展组对于管理需求波动至关重要,确保在需求高峰时扩展资源,在需求下降时缩减资源,从而控制成本。
一般考虑事项
无论部署环境如何,分析流量、性能基准和预算对于有效规划至关重要。过度配置会导致不必要的开支,而配置不足则可能影响服务质量。成本和性能之间的平衡至关重要。应配备监控工具和性能指标,以确保部署满足所需的服务水平,并便于做出扩展决策。
总结来说,在不同环境中部署 Whisper 的最佳实践包括选择合适的模型大小、利用专用硬件加速器、有效管理内存,并合理使用云资源。同时,还需要考虑延迟、成本和性能指标之间的权衡,以确保优化部署,满足各环境的特定需求。
在建立好基础设施后,我们将探讨有效地路由通过 Whisper 推理管道流动的数据流量的专业实践。
管理数据流
在 AI 系统中,尤其是在 OpenAI 的 Whisper 中,管理数据流涉及一些最佳实践,这些实践确保了系统的高效运行。它们对于处理复杂的队列、缓存、缓冲区、微批次、并行流和竞争资源调度至关重要,这些构成了 AI 数据流动的神经系统。
让我们探索优化这些 AI 数据流的各种技术,包括战略协调、路由和扩展。
理解基本数据类型和数据流动
Whisper 的核心数据转换涉及几种关键数据类型:
-
音频流:这些音频流从录音设备中分段,并附带元数据用于在异步阶段之间追踪。
-
特征:这些特征将音频频率和时间特性编码为数字矩阵。
-
标签:在声学模型推理过程中,这些标签会附加临时的语音和词汇表示。
-
转录文本:这些构成最终的文本输出,包含解码后的语音内容。
理解这些数据类型可以帮助我们进行战略优化,例如为每种类型的数据进行优先路由和定制存储。
协调共享数据存储
共享数据访问的并行处理需要精心协调。Whisper 使用了多个工具来实现这一点:
-
消息队列:这些队列缓冲并异步处理跨系统的音频片段和转录文本。
-
NoSQL 存储:这些提供对大型特征集和音频批处理元数据的低延迟查找。
-
内存数据网格:这些缓存高开销的模型输出,如标签序列,以便快速重用。
战略性地路由数据
最小化数据传输和复制对于高效运行至关重要。Whisper 通过几种策略优化数据流:
-
局部处理:这涉及在模块内处理操作,如语言模型重新评分,目的是限制过度的移动或计算。
-
压缩:这通过编码减少了传输的字节数。
-
优先级:这允许在批量特征集之外优先处理音频片段。
-
缓存:这有助于在可能的情况下重用存储的工件,例如滤波器组。
接下来,参考补充笔记本。你将在那里找到使用 Python 库(如librosa)加载、可视化和处理音频数据的代码示例。该笔记本涵盖了与 Whisper 管道中数据摄取相关的音频数据工作流程(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter02/LOAIW_ch02_exploring_audio_data_workflows.ipynb)。
横向扩展
在需求激增时,战略性的数据流平衡至关重要,比如智能家居利用 Whisper 实现跨房间的多用户语音控制。这可能涉及缓存由声学模型提取的音频特征以避免冗余计算、压缩数据以减少网络带宽压力、优先处理来自活跃发言者的音频片段,并动态提供额外的下游容器来分担负载,防止瓶颈。
总结来说,管理像 Whisper 这样的 AI 系统中的数据流,涉及理解基本的数据类型和流向,协调共享的数据存储,战略性地路由数据,并在必要时进行横向扩展。这些实践有助于解决可扩展性、稳定性和效率问题,确保 AI 系统能够在用户行为波动的情况下,提供高质量、实时的交互速度,从而为消费者提供可接受的体验。
接下来,我们将探索监控关键通道和基础设施,以确保平稳操作。
监控指标与优化
监控指标与优化对于管理和改进 OpenAI Whisper 的性能至关重要。该过程涉及跟踪各个领域的关键性能指标(KPI),包括模型性能、硬件利用率和数据流健康。
模型性能指标
模型性能指标确保 Whisper 系统准确转录语音。以下是这些指标:
-
WER:这是自动语音识别(ASR)系统的主要基准。它通过将系统输出与标准转录进行比较,量化单词错误的数量。较低的 WER 表示更好的性能。
-
字符错误率(CER):这一指标比 WER 更为细致,尤其在需要高精度的环境下(如临床或技术场景)非常有用。
-
延迟:这是指语音输入到最终输出之间的时间延迟。在各个处理阶段,如声学建模和整个管道中,监控延迟是至关重要的。
-
吞吐量:该指标衡量每单位时间处理的转录数量。它提供了关于请求量和并发会话的扩展需求的见解。
监控基础设施健康
监控底层硬件的健康状况对保持 Whisper 系统的性能至关重要。该领域的关键指标包括:
-
GPU/CPU 利用率:监控 GPU 和 CPU 的利用率可以帮助识别过载的加速器,并平衡负载,避免资源闲置。
-
RAM 利用率:监控 RAM 利用率有助于防止超出限制,避免内存交换到磁盘导致处理速度变慢。
-
带宽/吞吐量:监控网络容量可以帮助识别数据传输是否变慢,提示是否需要进行网络升级。
-
存储延迟:存储延迟的峰值可能表明硬盘出现问题,无法快速将数据传输给模型。
数据管道分析
优化组件之间的数据流动是 Whisper 优化的另一个关键方面。该领域的关键指标包括:
-
队列深度:队列积压增加可能表明下游组件跟不上进度,提示需要解决瓶颈问题。
-
缓存命中率:低于预期的缓存命中率可能表明缓存效果不佳,从而导致数据重用变慢。
-
数据新鲜度:该指标量化了音频片段在多阶段管道中传输的延迟。
-
错误:跟踪管道故障和日常恢复事件可以提供系统脆弱性的见解。
我们可以通过仔细监控这些指标来实现模型的工业化,并释放潜在的先进能力。例如,依赖 Whisper 进行客户咨询转录的客户支持聊天机器人,可以通过主动监控如高 GPU 利用率、WER 增加、数据新鲜度变慢以及低缓存命中率等信号,在流量高峰期间保持客户满意度。
总结,监控和优化是确保 Whisper 系统性能和可靠性的关键。通过跟踪模型性能、硬件利用率和数据流健康的关键指标,可以识别瓶颈,进行必要的调整,并提高系统的性能和效率。如果没有对基础设施和模型指标进行监控并提供可操作的洞察,依靠数据资产如 Whisper 来维持客户服务质量将变得不可能。衡量是进步的关键。
摘要
在这一章中,我们揭开了 Whisper 卓越语音识别能力的面纱。现在,你已经了解了从音频输入到语言解码的内部过程,你可以战略性地为特定用例需求微调实现方案。
我们在探索 Whisper 的混合设计之前,先调查了技术领域,融合了端到端优化与模块化定制化。你已经掌握了 CTC 声学模型处理模糊声音对齐以及变换器集成,这为语言表示提供了强大的支持。
这些构件通过指标监控、参数调优、瓶颈解除等方式,解锁了性能提升、可用性和成本效益。在未来,精度提升可以通过再训练过程实现,将洞察融入模型权重,从而将学习和精炼制度化。
具备架构理解后,你可以自信地雕刻部署方案,满足延迟约束、精度门限、基础设施现实和预算限制。理解数据流和权衡带来一个信息丰富的战略,从而优化商业成果。
在实现了功能性素养后,我们现在准备提升技术精通度。
在下一章中,我们将深入探讨 Whisper 的神经架构、多任务策略和弱监督训练方法,这些都推动了它在不同语言和环境中的卓越表现。
我们将剖析变换器在处理顺序数据中的机制,同时解释学习语言关系的编码器-解码器注意力模式。我们还将掌握处理语言变异的技巧——无论是词汇、发音、方言还是任务。最后,我们将揭示如何通过巧妙的预训练目标,让有限的标注数据驱动大型模型。
这些先进的洞察扩展了 Whisper 在创新下游应用中的互操作可能性——从多语言客户支持机器人到融合的视频/语音分析。理解促使创造性整合。
现在,让我们通过更深入地研究内部建模技术来提升我们的技术水平!
第二部分:底层架构
在这一部分,你将探索 OpenAI Whisper 的技术支柱,研究它的架构以及推动其前沿语音识别能力的变换器模型。你将全面理解 Whisper 的内部运作,包括它的编码器-解码器机制、多任务和多语言能力,以及使用弱监督对大规模数据进行训练的技巧。此外,你将学习如何为特定领域和语言需求微调 Whisper,使其能够有效地定制并集成到各种应用中。
本部分包括以下章节:
-
第三章,深入探索 Whisper 架构
-
第四章**,针对领域和语言特定性的微调 Whisper
第三章:深入探讨 Whisper 架构
当我们踏上深入 OpenAI Whisper 世界的第三章时,我们将进一步探讨支撑这一先进语音识别系统的架构细节。本章名为 深入探讨 Whisper 架构,旨在全面了解构成 Whisper 背后的 Transformer 模型。
Transformer 模型,一个彻底改变了机器学习领域的概念,是 Whisper 架构中的关键组件。它是驱动系统将口语语言准确转换为书面文本的引擎。理解 Transformer 模型就像理解 Whisper 的核心,本章旨在通过清晰和精准的解释帮助你深入理解其复杂性。
我们将首先介绍 Transformer 模型,并解释其在 Whisper 中的作用和意义。我们将提供对该模型的广泛理解,为更详细地探索其机制打下基础。接着,我们将深入分析编码器-解码器机制,这是 Transformer 模型的一个重要方面。本节将阐明该模型如何处理和转换输入数据,帮助你深入了解 Whisper 的语音识别能力。
在我们导航 Whisper 架构的过程中,我们还将讨论 Transformer 模型如何推动有效的语音识别。我们将突出该模型在提高 Whisper 准确性和效率方面的作用,帮助你更深入理解系统如何实现其卓越的性能。
在本章中,我们将涵盖以下主题:
-
理解 Whisper 中的 Transformer 模型
-
探索 Whisper 的多任务和多语言能力
-
在大规模数据上使用弱监督训练 Whisper
-
深入了解数据、注释和模型训练
-
将 Whisper 与其他 OpenAI 技术集成
到本章结束时,你将全面理解 Transformer 模型及其在 Whisper 中的作用。你将深入探索 Whisper 的架构,理解其编码器-解码器机制,以及它如何推动有效的语音识别。这些知识将帮助你更好地理解随后的章节,在这些章节中,我们将探讨 Whisper 的多任务和多语言能力、在大规模数据上使用弱监督训练 Whisper 的方法,以及如何将 Whisper 与其他 OpenAI 技术集成。
在我们继续探索 Whisper 的世界时,请记住,理解像 Whisper 这样的 ASR 系统的架构,不仅仅是理解其技术层面。它还包括欣赏这种技术的变革潜力。它是关于想象一个声音技术深深融入我们日常生活的未来,推动效率、可访问性和创新。因此,当我们深入探讨 Whisper 的架构时,我们也会思考这种技术的变革潜力,以及如何利用它塑造更美好的未来。
引用伟大的建筑师 Louis Kahn 的话:“伟大的建筑必须从不可衡量的开始,在设计时必须通过可衡量的手段,而最终必须是不可衡量的。”同样,正如我们在本章中深入研究 Whisper 架构的可衡量方面时,让我们保持对这项技术不可衡量潜力的关注。让我们一起深入探索!
技术要求
对于本章,我们将利用 Google Colaboratory 的可访问性和经济性。Whisper 的小型模型需要至少 12 GB 的 GPU 内存。因此,我们必须尽力确保为我们的 Colab 获得一个不错的 GPU!不幸的是,使用 Google Colab 的免费版(免费版提供的是特斯拉 T4 16 GB)越来越难以获取一个好的 GPU。然而,使用 Google Colab Pro,我们应该不会遇到问题,可以分配到 V100 或 P100 GPU。
要获取 GPU,在 Google Colab 的主菜单中,点击运行时 | 更改运行时类型,然后将硬件加速器从无更改为GPU。
我们可以通过运行以下代码来验证是否已分配 GPU,并查看其规格:
gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
print('Not connected to a GPU')
else:
print(gpu_info)
这是输出结果:

图 3.1 – Google Colab 中 gpu_info 输出的示例
当然,可以在你喜欢的环境中运行。Jupyter 笔记本和 Google Colab 的链接可以在github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter03找到。
本章的笔记本是一个重要的伴侣。它不仅仅作为补充,而是作为你学习 Whisper 世界过程中不可或缺的一部分。这个笔记本提供了如何处理音频数据并利用 Hugging Face 生态系统的实践探索,任何希望有效实现 Whisper 的人都需要掌握这些内容。该笔记本涵盖了以下关键学习目标:
-
介绍如何使用 Hugging Face 处理音频数据,展示本章的理论概念如何转化为实际的编码练习。
-
演示基本的音频处理技巧,如加载、播放和可视化音频文件——这些技巧对任何使用 Whisper 或任何自动语音识别(ASR)技术的人来说都至关重要。
-
向更高级应用的初步步骤,包括微调 Whisper 模型所需的预处理——这一话题将在第四章中进一步展开。
通过本笔记本,您将获得与本章理论知识互补的实践经验,为更高级的 Whisper 模型微调技术打下基础。
理解 Whisper 中的 transformer 模型
在本节中,我们将探索 transformer 模型如何在自然语言处理(NLP)领域带来突破,并理解其机制,使得 Whisper 能够准确地将口语转换为书面语言。我们将详细介绍其编码器-解码器结构以及优化方法,使其在语音处理任务中无可匹敌。通过学习,我们将深入了解这一先进模型架构的内部工作原理,理解它如何驱动 Whisper 的强大功能,并解锁跨语言的应用。
引入 transformer 模型
作为 OpenAI Whisper 的专家,我经常被问到:“是什么让这个ASR系统如此先进?”答案就在于它的核心:开创性的 transformer 模型架构。一切始于 2017 年 Vaswani 等人发表的论文《Attention Is All You Need》。引入 transformer 模型标志着 NLP 领域的一个重要范式转变。在此之前,序列转换模型(即将一个领域的序列转换为另一个领域的序列)主要基于 RNN,包括 LSTM 网络和 CNN。
RNN 和 LSTM 按顺序处理数据,它们通过将信息从一个序列步骤传递到下一个步骤来保持某种形式的记忆。然而,它们也有局限性,例如操作难以并行化(因为每一步都依赖于前一步)以及由于梯度消失等问题,难以学习序列中的长程依赖关系。
transformer 模型引入了一种全新的架构,它完全依赖于注意力机制,摒弃了循环和卷积操作。这是与之前的范式的显著区别,后者通常使用复杂的 RNN 或 CNN 与注意力机制相结合来连接模型的编码器和解码器组件。
注意力机制使得 transformer 模型在预测输出序列的每一部分时能够聚焦于输入序列的不同部分,从而有效地捕捉输入的上下文,无论它的位置如何。这对于像翻译这样的任务尤其重要,因为一个单词的相关性可能会严重依赖于句子中其他地方的单词。
Transformer 的自注意力机制使得它在生成输出时,能够衡量输入序列每个部分的相关性,这对于正确解读口语语言至关重要。这使得模型能够并行处理输入序列的所有部分,显著提高训练效率,并更有效地学习长程依赖关系。为了说明这一点,我们可以考虑一个实际的句子翻译任务。假设我们有句子:“I arrived at the bank after crossing the river.” 在这个上下文中,单词“bank”指的是河岸。然而,“bank”也可以指金融机构。“bank”的正确解释取决于它在句子中的上下文,特别是单词“river”的存在。
Transformer 模型使用自注意力机制来衡量句子中每个单词的相关性,以便在翻译时使用。当模型处理单词“bank”时,它会为相关的单词(“arrived”,“crossing”,“river”)分配更高的注意力分数,以帮助确定“bank”的正确含义。通过这种方式,模型能够正确地将句子翻译成另一种语言,并保持“bank”一词的原意。
这种机制还允许模型并行处理输入序列的所有部分,从而显著提高训练效率。传统的序列到序列模型,如 RNN,会一步一步地处理输入序列,这对于长序列来说可能非常耗时。相反,Transformer 可以同时处理输入序列中的所有单词,从而缩短训练时间。
此外,自注意力机制帮助模型更有效地学习数据中的长程依赖关系。在我们的例子中,尽管单词“bank”和“river”被其他几个单词分隔开,但模型仍然能够理解它们之间的关系。这种能力对于文本摘要或问答等任务至关重要,在这些任务中,理解整个上下文是非常重要的。
自注意力机制
自注意力机制使得 Transformer 模型能够理解输入数据中的上下文。它通过计算注意力分数,确定在预测特定输出元素时每个输入部分应该给予多少关注。这个机制对于准确转录语音至关重要,因为它使得模型能够考虑句子或对话的整个上下文,而不是单独处理每个单词。
引入 Transformer 已经在各种任务中带来了最先进的性能,包括机器翻译、文本摘要和问答。它还为后续模型(如 BERT、GPT 等)的发展铺平了道路,进一步推动了自然语言处理的可能性。
向变换器模型的转变是如此显著,以至于它重新定义了 NLP 领域的最佳实践,改变了从顺序处理到更具并行性和上下文感知的方法。这不仅提升了基准任务的表现,还为 NLP 应用开辟了新天地,成为该领域一个真正具有变革性的时刻。
审视变换器模型框架
变换器模型包含编码器和解码器。编码器处理输入的音频帧,而解码器生成转录后的文本输出。编码器和解码器都有重复的块,其中包含以下内容:
-
多头自注意力层:这些层使得模型能够理解上下文,并在转录时衡量每个单词的相关性。这对正确解释口语语言至关重要。
-
位置相关的前馈层:这些层处理来自注意力层的特征,并将信息在整个模型中传播。
与以往的序列模型不同,自注意力层使得模型在转录每个单词时能够考虑到整个上下文。这为我们带来了显著的性能提升。
以下图示说明了变换器中编码器-解码器模型的自回归生成步骤:

图 3.2 – 变换器编码器-解码器模型(基于变换器的编码器-解码器模型。Patrick von Platen. 2020 年 10 月 10 日。https://huggingface.co/blog/encoder-decoder)
在前述图中,编码器用绿色表示,解码器用橙色表示,演示了将英语短语“My cat is hungry”翻译成西班牙语“Mi gato tiene hambre”。翻译涉及一系列步骤,具体如下:
步骤 1:最初,编码器分析整个输入序列a1:5 = “my cat is hungry”(通过浅绿色向量可视化,并将其转换为一系列上下文感知的编码向量A1:5)。例如,向量a2捕捉到的编码不仅仅反映了“cat”这个单词,还包含了周围单词“My”,“cat”,“is”和“hungry”的上下文相关性,以及句子结束标记“EOS”。
步骤 2:接着,这个编码序列A1:5,以及句子起始(BOS)向量b0,被输入到解码器中。解码器随后解读这些输入,生成第一个 logit 值B1(以更深的橙色表示),从而建立初始目标向量b1的条件概率。
步骤 3:接下来,第一个目标向量 b1,对应于“Mi”,由概率分布(由灰色箭头表示)得出并重新引入解码器。此时,解码器会评估 b0 = “BOS” 和 b1 = “Mi”,以确定下一个目标向量 b2 的条件概率。
步骤 3…n:这个过程会持续迭代进行,直到获得下一个目标向量 b2 = “gato”。该过程保持自回归方式,直到在第六步识别出 句末(EOS)向量,并以此顺序继续进行。
需要明确的是,编码器的作用仅限于初步处理,它将a1:n 转换为 A1:n。在随后的步骤中,解码器直接使用已经预先计算好的 A1:n 编码。
优化自动语音识别
在 Whisper 中应用于 ASR 时,transformer 利用大量数据集处理多种语言和任务。对于训练,连接主义时间分类(CTC)巧妙地将音频输入与文本输出对齐,而无需显式的对齐注释。
这使得该模型能够适应语音变化,如语速或停顿。与以往的深度学习模型不同,transformer 可以处理对话中的说话人重叠。通过这些优化,Whisper 能够准确地转录现实世界的语音。
Whisper 使用的是一个序列到序列模型,采用 transformer 编码器-解码器架构。这将音频映射到文本的过程中分阶段进行。首先,原始音频被转换成显示语音频率的对数梅尔频谱图。然后,编码器处理该频谱图以提取基本特征。最后,解码器使用这些特征逐个预测文本转录。Whisper 可以通过优化音频与文本之间的映射,自动将语音转换为文本。这个逐步的处理流程使得模型能够学习输入音频和输出文本之间的对齐。图 3.3 总结了 Whisper 模型:

图 3.3 – Whisper 模型。该模型采用标准的 transformer 编码器-解码器架构。音频的对数梅尔频谱图输入到编码器。编码器将学习到的特征传递给解码器。解码器然后基于音频特征和前一个单词逐个预测地转录语音(https://cdn.openai.com/papers/whisper.pdf)
用于语音识别的序列到序列模型采用了编码器-解码器架构。编码器从音频语音输入中提取显著特征,并将其编码为隐藏状态表示。解码器充当内部语言模型,处理这些表示以生成口语文本的转录。将语言模型融入模型中被称为深度融合(deep fusion)。这与浅层融合方法(例如,将外部语言模型与单独的编码器结合,连接 CTC 编码器与 n-gram 语言模型;请参见研究论文:arxiv.org/pdf/2011.01991.pdf)形成对比。深度融合对整个模型进行端到端训练,使用相同的数据和损失函数。这种方法提供了更灵活的训练,并比浅层融合技术表现更好,正如基准测试所示(请参见研究论文:arxiv.org/abs/2210.13352)。
通过利用深度学习的突破和丰富可用的训练数据,Whisper 采用变换器架构推动了自动语音识别(ASR)的边界。随着模型的不断改进,系统的多功能性也将提升。理解这些机制有助于深入了解 Whisper 在与其他语音技术相比时的出色能力。
研究变换器模型在 Whisper 中的作用
变换器模型是 OpenAI 的 Whisper 的重要组成部分,它基于一种深度学习架构,利用自注意力机制以一种捕捉语言上下文和细微差别的方式处理序列数据,如语音。
Whisper 的变换器模型对语音识别中的输入数据(即与口语单词相对应的数据)进行编码。输入音频被分割成通常为 30 秒的块,并转换为对数梅尔频谱图。然后,这个频谱图被传递给编码器,编码器使用自注意力机制在生成输出时对输入序列的每个部分的相对重要性进行加权。
解码器经过训练,以预测与处理过的音频输入相对应的文本字幕。它通过逐个生成单词的方式进行预测,并考虑编码器处理的整个序列,以保持上下文的连贯性。解码器还使用自注意力机制,在预测输出序列的每个部分时,集中关注输入序列的不同部分。
变换器模型在 Whisper 中的作用至关重要,因为它有效地驱动了系统将口语语言转换为书面文本的能力。其架构,尤其是自注意力机制,使得 Whisper 能够捕捉到口语单词的上下文和含义,这对准确的转录至关重要。该模型的可扩展性和从大规模数据集学习的能力为 Whisper 的强大和适应性提供了支持,使其成为一种强大的语音识别工具,适用于各种语言和应用场景。
在探讨了变换器模型在 Whisper 先进语音识别中的关键作用后,让我们更深入地了解这项技术的核心——编码器-解码器机制,并揭示这些组件是如何协同工作,将口语转化为准确的书面文本的。
解读编码器-解码器机制
与其他变换器模型一样,Whisper 的架构是基于编码器-解码器机制。如图 3.3所示,编码器-解码器机制是一个两步过程。编码器接受输入数据(在此为语音),并将其转换为向量,以模型可以理解的方式表示数据。这些向量捕捉了输入数据的上下文信息。然后,解码器利用这些向量,逐步生成输出数据(在此为文本)。
Whisper 中的编码
在 Whisper 的框架中,编码器将口语作为输入,并将其转换为一系列向量。这个序列捕捉了语音的上下文信息,如单词顺序和语音细节。接着,解码器利用这一序列,逐字生成相应的文本,同时保持单词的顺序和上下文。
编码器按阶段处理输入数据,每一阶段都增加了一层抽象。它首先将原始音频转换为一系列特征向量,然后通过多个变换器模型的层进行处理。每一层都包含自注意力机制和前馈神经网络,帮助捕捉输入数据中的复杂模式和依赖关系。
编码器的输出是一个上下文敏感的输入数据表示序列。这些表示捕捉了相应输入特征向量中的信息以及来自整个输入序列的信息。这使得解码器能够生成准确的转录结果,即使输入数据中存在噪声或其他失真。
编码器同时处理多种语言和任务的能力是 Whisper 的另一关键特性,使其成为多种应用的多功能工具,从转录服务到语音助手。
Whisper 中的解码
在 Whisper 的变换器模型中,解码器与编码器协同工作,执行语音识别任务。编码器处理输入音频并创建上下文表示,解码器则利用该表示预测相应的文本输出。以下是解码器执行的基本处理阶段:
-
预测文本:解码器通过对音频输入的编码表示进行训练,预测文本字幕。它通过逐字生成的方式来实现,并且考虑由编码器处理的整个序列,以保持口语的上下文。
-
处理特殊标记:Whisper 的解码器还利用独特的标记来执行多个任务,如提供短语级时间戳和指示转录过程中的不同功能。这些标记是模型词汇的一部分,并在解码阶段引导模型的行为。
-
耦合输入输出表示:解码器采用耦合的输入输出标记表示和学习的位置嵌入。这使得模型能够理解单词在整个句子或对话中的顺序和位置。
-
执行自回归生成:该架构遵循经典的编码器-解码器结构,这意味着解码器依赖于自回归生成过程。该过程涉及根据之前生成的单词预测每个后续单词,确保输出文本具有连贯性并与上下文相关。
-
处理错误:解码器的设计和训练使其能够处理语音中的变异,如口音、背景噪音和专业术语。这种鲁棒性部分归功于 Whisper 所训练的大型多样化数据集,该数据集包括广泛的语言和音频条件。
总结来说,Whisper 架构中的解码器根据编码的音频输入生成书面文本。它是一个复杂的组件,使用学习到的模式、独特的标记和自回归生成过程,生成准确的转录文本,反映出口语语言的上下文和细微差别。解码器的有效性证明了 Transformer 模型能够处理复杂任务,如语音识别和翻译,使 Whisper 成为语音识别领域的强大工具。
下一节将探讨语音识别系统如何在翻译、摘要和关键词识别等领域之间进行适配的技术创新。我们将深入了解 Whisper 优化的模型架构、广泛的多语言数据集,以及其引人注目的零-shot 迁移学习能力,这些都为其语言灵活性提供了支持。
探索 Whisper 的多任务和多语言能力
正如我们在上一节中看到的,Transformer 模型架构是赋能 Whisper 高级语音识别能力的核心。然而,故事并不止于此。Whisper 拥有令人瞩目的多功能性,不仅仅是将英语音频转录为文本。其灵活的设计支持在 90 种语言之间无缝切换,执行翻译、摘要和关键词识别等多种任务。这种能够在语言多样化环境中适应性地进行多任务处理的能力,显著扩展了 Whisper 在全球商业和消费者需求中的实际应用。
在接下来的部分中,我们将探讨驱动 Whisper 多功能性的技术创新,包括其优化的多任务模型架构、广泛的多语言训练数据,以及引人注目的零-shot 转移学习能力。理解这些能力为将 Whisper 有效集成到跨文化和多功能语音识别项目中提供了宝贵的见解,从语音助手解决方案到报告系统。
评估 Whisper 处理多任务的能力
当我第一次了解到 Whisper 的多任务能力时,我不得不承认——我感到震惊。作为有经验的技术专业人员,我们知道大多数 AI 系统都专注于单一任务。语言模型生成文本。计算机视觉模型分析图像。语音识别工具转录音频。
但是 Whisper 打破了这一模式。它的架构支持从同一个模型执行多种类型的语音处理任务,这一非凡的能力为语音 AI 系统的多功能性树立了新的标准。
那么,Whisper 是如何实现这一魔法的呢?这一发现让我开始了一个引人入胜的探索,揭开其灵活设计背后的秘密。而我所发现的仅仅加深了我对其优雅创新的欣赏。
揭示潜在连接
关键的洞察是,从本质上讲,所有语音任务都依赖于理解语言。因此,通过在多任务的多样语音数据上训练 Whisper 的模型,它能在抽象的潜在层面上学习任务之间的连接。
OpenAI 的 Whisper ASR 系统中的潜在连接对于提高语音识别准确性至关重要。这些连接是支撑 Whisper 的 Transformer 模型架构的一部分。Transformer 模型以其编码器-解码器结构著称,利用自注意力机制来衡量输入数据中不同部分的重要性。
在语音识别中,潜在连接帮助模型捕捉语音输入中不同部分之间的依赖关系,即使这些部分在序列中相隔较远。这在语音识别中尤为重要,因为一个词的意思可能依赖于对话中早些时候或稍后出现的词提供的上下文。通过有效地捕捉这些依赖关系,潜在连接有助于提高 Whisper ASR 系统生成的转录准确性。
此外,Whisper 中的 Transformer 模型是在大规模数据上通过弱监督训练的。这种方法涉及在大量带有限制标注的数据上训练模型,让它从更广泛的上下文中学习,并在复杂或模糊的情况下提高其性能。这种训练方法与潜在连接在捕捉长距离依赖关系上的强大能力相结合,促成了 Whisper 在语音识别任务中的高准确性。
例如,转录西班牙语音频需要理解西班牙语的词汇和语法。将西班牙语语音翻译成英语依赖于两种语言之间的映射。总结西班牙语对话要求挑选出关键的语义概念。
尽管表面上有所不同,所有这些任务都涉及到对口语单词背后意义的探究——这就是语言学家所说的语义学。通过自监督学习,Whisper 在接触各种语言任务时,隐性地建立起这些关键的连接。
语言学语义学
语言学语义学是研究意义的学科,用以理解人类通过语言表达的意思。它涉及对单词、短语,最终是整个文本的意义进行解释。语义学关注单词之间的关系,以及它们如何共同创造意义,通常重点讨论指称(直接的或词典意义)和隐含意义(单词所引发的想法或感情)。在人工智能和机器学习中,理解语义对自然语言处理(NLP)任务至关重要,如语言翻译、情感分析和信息提取。
适应性支持的架构
但是,仅仅吸收大量的训练数据是不够的。Whisper 的架构在至关重要的方面支持知识的可适应性和多样化应用:
-
自注意力机制使模型在转录时能够考虑每个单词周围的上下文。这使得像right这样的词能够根据整个句子的意思进行正确解读,从而提高准确性。
-
多语种训练使 Whisper 能够接触到跨语言的词汇、语法和发音多样性。识别这些跨语言的模式使得模型在面对训练时未明确出现的新语言时能更好地进行泛化。
-
编码器-解码器结构非常适合跨领域(如语言或任务)转换输入音频。灵活性是关键。这一能力被称为软对齐。
软对齐
在训练过程中使用软对齐来将输入音频与对应的转录文本对齐。这个对齐是软的,因为它是基于概率的,意味着它依据某些音频部分与转录文本某些部分对应的可能性来进行。训练中的软对齐意味着模型不会对严格的输入-输出配对做出僵硬假设。这使得模型能够处理更自由、变化多端的现实世界语音。
在 Whisper 中,模型在许多来自网络的多语种和多任务监督数据上进行训练。模型使用一种变体的 CTC 损失函数,这使得它能够以软的或概率的方式处理输入音频与其对应转录之间的对齐。这种软对齐使得模型能够处理语音速率和音频数据中的其他时间变化。
这种方法的优势在于它不需要显式的音频数据分段或对齐,而这在自动语音识别(ASR)中是一个具有挑战性的任务。在传统的 ASR 系统中,将音频数据与其对应的转录文本对齐通常需要精确的分段,将音频划分成较小、可管理的片段,对应于语音单元,例如单词或音素。这个过程既复杂又容易出错,特别是在处理语音变化时,如不同的口音、语速和背景噪声。
取而代之的是,Whisper 采用了一种概率性的方法,通过使用 CTC 损失函数进行软对齐。这种方法基于音频的某些部分与转录文本的特定部分相对应的可能性,而不是僵硬地将固定的音频段与文本对齐。这种方法使得模型能够处理广泛的现实世界语音变异性,如语速变化以及音频数据中的其他时间变化。因此,模型在训练过程中学习到隐式地对齐音频和文本数据,从而实现更强大、更准确的语音识别,而无需复杂且劳动密集的显式分段。
更深入地探索 Whisper 的多语言能力
当我们深入探索时,Whisper 在赋予其出色的多语言能力方面展现了高超的 AI 工程技术。激发 Whisper 灵活语言能力的火花源自于其数据。Whisper large-v3 是在 100 万小时的弱标注音频和 400 万小时的伪标注音频上训练的,这些音频是使用 large-v2 收集的。
伪标签
伪标签是一种半监督学习技术,用于提高机器学习模型的性能。在训练最新的 Whisper 模型版本 3 时,伪标签技术涉及利用模型对无标签数据的预测来生成伪标签。伪标签在无标签数据量庞大而标注数据相对较少的场景中尤为有用。
假设我们拥有大量各种语言的音频录音,但其中许多并没有相应的文本标签来指示所说内容。为了训练 Whisper,我们最初使用了之前的模型版本(large-v2)来处理这些无标签的录音。large-v2 模型监听音频并尽最大努力转录语音,有效地为这些录音生成 伪 标签。
尽管不完全准确,这些伪标签为训练下一版本模型(large-v3)提供了起点。然后,large-v3 模型从这个扩展的数据集中学习,包括原始的标注数据和新的伪标注数据。该方法使模型能够在缺乏完全标注数据的情况下,改善其对多种语言语音的理解和识别。当使用模型对未标注数据的预测来创建新的训练材料时,这种技术被称为伪标签化,应用于训练 Whisper 的最新模型。
重要的是,这些数据涵盖了 90 种语言——使得模型接触到了前所未有的语言多样性。通过利用互联网规模的数据和先进技术,Whisper 吸收了词汇、语法、口音以及跨地理区域和语言家族的其他语言细微差别。
这种庞大的数据规模和多样性打通了跨语言解决语音任务之间的固有联系——转化了模型隐式理解的抽象语言本身。
优化模型架构
但单纯的大量数据是不够的——还需要与优化的模型设计相平衡。Whisper 利用我们之前探讨的多功能变换器架构,进行输入音频和输出文本之间的可调编码与解码。
语音识别中的独特之处在于,Whisper 在训练过程中采用了一个时间限制的自注意力窗口。这在转录单词时考虑了局部上下文,帮助提高了在长序列中进行准确性和计算效率。
此外,加入随机深度和丢弃法在训练过程中引入随机性,帮助 Whisper 更好地泛化,减少对任何特定神经元的依赖。结合跨目标的多任务学习,例如转录、翻译和识别,模型发展出了灵活的语言处理能力。
随机深度和丢弃法
随机深度和丢弃法是两种技术,用于在训练机器学习模型时引入随机性,包括 Whisper ASR,以防止过拟合并改善泛化能力。
随机深度是一种正则化技术,它在训练过程中随机省略(或丢弃)深度神经网络中的特定层。其核心思想是在训练时通过跳过某些层来减少网络的复杂性,同时在测试时仍然使用整个网络。这种方法有助于防止过拟合,特别是在深度网络中,通过向训练过程中添加噪声并鼓励网络学习更强大的特征。它还有降低训练计算成本的附加好处。
另一方面,Dropout 是一种在训练过程中随机丢弃(即设置为零)某些神经元输出的技术。与随机深度类似,Dropout 是一种正则化方法,旨在防止过拟合。通过随机丢弃神经元,Dropout 强迫网络学习冗余的表示,从而使其对特定神经元丢失更具鲁棒性,并提高其从训练数据到未见数据的泛化能力。
在 Whisper ASR 的背景下,这些技术可以提高训练模型的鲁棒性和泛化能力。将随机性引入训练过程可以帮助模型更好地处理现实世界语音数据的多变性和不可预测性。
跨语言的零样本迁移
数据与技术的协同作用解锁了 Whisper 最具科幻色彩的能力——识别在训练过程中从未明确接触过的语言!这在语音识别中被称为 零样本迁移学习。通过接触足够多样化的训练数据,Whisper 学会了概括语言结构,并解码它从未见过的新语言。
这种跨语言的迁移能力使得该模型可以用于实际的语音识别任务,而无需为每种新语言准备定制的训练数据。这是一种高效的方法,模仿了人类在学习多种语言后,推断不熟悉语言的含义和模式的能力。这项技术推动了语音 AI 系统(如 Whisper)在全球不同语言观众中的适应性和广泛应用的边界。因此,Whisper 模型可以显著适应那些在其训练过程中未明确覆盖的语言。这种适应性源于模型对多语言训练的接触,在此过程中它学习了语言之间的联系。因此,即使没有对特定语言的直接训练,模型也能有效处理未见过的语言。这种多语言训练方法具有显著的优势:它允许在不需要昂贵的数据收集和重新训练的情况下高效地部署到新的目标语言。
从技术层面来看,Whisper 并不记忆词汇,而是发现贯穿所有人类语言的更深层次的普遍结构。语言学家假设,常见的认知能力塑造了口语语言——这些模式是 Whisper 通过接触足够多样化的语言数据提取出来的。这使得 Whisper 对陌生语言具有几乎像魔法一样的适应能力——这是推动多语言语音 AI 边界的一个显著成就!
通过在没有明确示例的情况下高效地对未见过的语言进行泛化,零样本迁移学习使得部署 Whisper 更加方便,适用于各种全球使用场景。这项技术推动了语音 AI 系统的多功能性和广泛适用性的边界,以服务全球讲述数千种语言的用户。
认识到多任务处理和多语言能力在 ASR 系统中的重要性
在结束我们对 Whisper 出色的多任务处理和多语言技能的探讨时,值得思考这些能力为何对于语音识别系统在应对现实场景中至关重要。
满足不同最终用户的需求。
简单来说,人类语言的不可预测变异性要求具备灵活多样的自动语音识别(ASR)模型。无论是多种语言、技术词汇、声学条件,还是多种语言任务,最终用户都有多样化的需求。
Whisper 提供 90 种语言的多语言支持,涵盖了浪漫语言、日耳曼语言、斯拉夫语言等多个语言家族。这种广泛性能够处理在不同语言之间进行交流的国际用户群体。该模型架构还支持零-shot 转移——无需明确的训练数据,就能够识别新语言。
此外,通过适当的参数设置,Whisper 可以处理诸如医学术语或法律术语等用户经常需要准确解读的专业词汇。该模型通过训练多样化的网络数据集,获得了超出常用短语的广泛词汇覆盖。
擅长多任务处理。
从技术角度来看,Whisper 之所以能够具备多样的多任务能力,归功于其特定的架构优化。
-
训练过程中的软对齐可以防止严格的输入输出对齐导致过拟合,从而提高模型的泛化能力。
-
多任务学习使得模型能够接触到相关任务之间的联系,从而实现灵活的知识转移。
-
随机深度和 dropout 提供了随机性,减少了对特定神经元的依赖,从而提高了模型的鲁棒性。
这些方法使得单一模型能够熟练地在转录、翻译、情感分析、关键词识别及其他语音处理目标之间灵活转换,同时不失准确性。
使投资具有未来保障,以应对趋势的变化。
语音识别模型是长期投资,旨在随着时间的推移在各个地区扩展。鉴于当前技术变化的速度,灵活性对于保护价值至关重要。Whisper 的多语言零-shot 能力和多任务设计能够主动为系统的未来需求提供保障。
无论是在新兴市场中语言的意外增长,还是新型语音使用场景,Whisper 都能提供避免被固定假设束缚的保险。这种适应性确保了企业不会因为趋势变化而使系统成为过时的“白象”。
为更强大的对话代理铺平道路。
最后,通过展示 Whisper 在语言和声学多样性处理方面的高超能力,OpenAI 提升了语音识别研究的标准。这些令人印象深刻的能力激励他人突破常规,重新审视是否需要独立、专门的系统。
单一语言或任务孤立学习的时代即将结束。用户应得的且日益期待的是全面的语音解决方案。未来,像 Whisper 这样的集成功能模型将为更强大的对话代理铺平道路,使其能够理解自然语言中的各种精彩与挑战!
接下来,我们将探讨 Whisper 使用弱监督策略的训练方法,如何有效利用大规模数据集——即使在人工标注有限的情况下。
使用弱监督在大规模数据上训练 Whisper
在介绍了 Whisper 的多任务变压器架构后,我们将进一步探讨其复杂的训练策略,这些策略赋予了 Whisper 先进的语音识别能力。Whisper 不仅仅依赖小规模、精心注释的数据集,它还利用了数 TB 的网络语音数据,并结合半监督技术。
接下来的部分将深入探讨 Whisper 的网页规模数据积累、通过机器教师进行伪标注以及架构支持,这些都促进了从噪声标签中学习的过程。我们将逐步介绍数据编程范式、自我训练、随机深度和预训练方面的创新,这些都是 Whisper 成功的关键。最终,你将理解弱监督如何使得语音理解能力无与伦比——为方言和词汇的定制化开辟了道路,而大规模的强标注在现实中依然难以实现。
引入弱监督
传统的监督学习范式长期以来一直是机器学习的金标准。它通过大量标注数据训练模型,其中既有输入也有期望输出。然而,这种方法也有其局限性。标注数据既费时又昂贵,并且为每个任务获取大量标注数据并不总是可行的。这就是弱监督发挥作用的地方。
什么是弱监督?
弱监督是一种机器学习范式,它利用不太准确或噪声标签来训练模型。这些标签可以通过多种方式生成,如启发式方法、众包或数据增强。弱监督的关键思想是将这些噪声标签作为真实标签的代理,前提是理解它们可能并不 100%准确。
弱监督的优势在于,它使我们能够在比完全监督学习更大规模的基础上训练模型。通过利用弱标注数据,我们可以在数百万甚至数十亿的样本上训练模型,从而显著提升性能。
弱监督的概念,虽然对于训练像 OpenAI 的 Whisper 这样的模型有很大优势,但也有一些缺点是值得考虑的:
-
准确性:弱监督模型的准确性可能低于完全监督学习。模型可能会学习到不正确的模式或关联,导致性能不理想。
-
模型复杂性:弱监督通常需要更复杂的模型和训练过程。这些模型需要处理标签中的噪声,这可能增加模型的复杂性以及训练所需的计算资源。
-
评估困难:由于缺乏真实标签,评估使用弱监督训练的模型性能可能非常具有挑战性。这使得准确评估和比较模型的表现变得困难。
-
训练数据中的偏差:如果弱标签存在任何偏差,这种偏差可能会传递到模型中,导致偏差预测。这一问题在机器学习中较为常见,在弱监督中尤其成问题,因为标签的可靠性较差。
-
依赖标签函数:弱监督在很大程度上依赖于标签函数,而这些标签函数的可靠性和准确性可能存在差异。
这些考虑因素突出了在训练复杂模型(如 Whisper)时,特别需要注意弱监督潜在的局限性和挑战。
弱监督中的框架和技术
在弱监督中,采用了多个技术框架和方法论来增强训练过程并提高模型性能。
在弱监督中,使用的关键框架之一是数据编程范式。这种方法涉及创建一组标签函数,它们是启发式规则或远程监督技术,用于标记一个大型未标记的数据集。这些标签函数可能包含噪声并且可能相互冲突,但它们通过生成模型结合起来,为训练数据生成概率标签。
另一个重要的技术是多任务学习,即在多个相关任务上同时训练模型,通过利用任务之间的共性和差异来提高泛化能力。这在弱监督场景中特别有用,因为某些函数的数据可能有限或存在噪声。
迁移学习也是弱监督中的一个关键技术。它涉及在一个大型带标签数据集(源任务)上训练模型,然后在一个较小的、相关的数据集(目标任务)上进行微调。这种方法允许模型利用源任务中获得的知识,提升在目标任务上的表现,尤其在目标任务的带标签数据稀缺时,特别有用。
除此之外,弱监督中还使用了其他几种技术,如自训练(模型用于标注其训练数据)、协同训练(两个模型在数据的不同视角上进行训练,并相互标注对方的数据)、以及主动学习(模型主动选择最具信息量的示例进行标注)。
这些框架和方法论并非互斥,通常会结合使用,以在弱监督场景中取得最佳效果。它们代表了机器学习领域中一些最先进的技术,并处于弱监督研究的前沿。然而,需要注意的是,尽管这些技术在弱监督场景中被广泛使用,但 OpenAI 的文档中并未明确详细说明 Whisper 中是否应用了所有这些框架。正如之前讨论的,Whisper 的训练方法论利用了弱监督的原则,但是否使用了其中的每一种技术并未明确说明。
当然,使用弱监督训练机器学习模型也有若干挑战:
-
标签质量:弱监督的主要挑战是标签的质量。由于标签不像完全监督学习中使用的标签那样精确和准确,模型可能学习到错误的模式或关联,导致次优的表现。
-
模型复杂性:弱监督通常需要更复杂的模型和训练过程。例如,模型可能需要考虑标签中的噪声,这会增加它们的复杂性并且需要更多的计算资源来进行训练。
-
评估困难:评估使用弱监督训练的模型的性能可能会面临挑战。由于没有真实标签,准确评估并与其他模型进行比较可能变得困难。
-
训练数据中的偏差:如果弱标签存在某种偏差,这种偏差可能会传递到模型中,导致偏差预测。这是机器学习中的一个常见问题,在弱监督中尤为突出,因为标签的可靠性较差。
-
标签函数的依赖性:在弱监督中,标签函数生成弱标签。这些函数可能引入自身的偏差和错误,弱标签的质量高度依赖于这些函数的质量。
尽管面临这些挑战,弱监督仍然是训练机器学习模型的一种有前景的方法,尤其在大量标注数据不可用时。使用弱监督时,仔细考虑这些挑战并制定缓解策略至关重要。
理解弱监督在训练 Whisper 中的作用
弱监督在训练 Whisper 的最先进语音识别能力中发挥了重要作用。通过采用这种半监督方法,模型的设计者能够利用更多来自互联网的语音训练数据,而无需准确标注。这对于将对现实世界语言细微差别的深刻理解嵌入系统至关重要。在接下来的部分,我们将深入探讨弱监督如何在 Whisper 中发挥作用,以及它如何对灌输现实世界语言理解至关重要。我们还将探索在训练过程中有效管理标签噪声的各种策略。之后,我们将在认识使用大规模数据进行 训练的好处部分进一步扩展我们对数据编程流程的理解。
收集多样化的语音数据
弱监督训练的起点是收集来自公共网络源的大规模异构语音数据集:播客、有声书、YouTube 视频、讨论论坛、教育讲座以及电影对话语料库等等。
这样,Whisper 能够接触到比较小的朗读语音数据集更多的语音模式,来自更多说话者的语音。自然的语速、重叠的对话、技术性词汇——这些现实世界的元素为 Whisper 的实际应用做好了准备。
弱监督依赖于快速聚合公网上的 TB 级数据,而不是昂贵的人工标注。然而,在语言、说话者人口统计和话题等维度上最大化多样性仍然是一个工程挑战。定制的网页爬虫和启发式采样方法解决了这一问题,收集异构的训练数据。
程序化生成噪声标签
收集到大量未标注的语音数据后,下一阶段是通过编程方式生成足够好的标签,以便于训练。正如我们之前提到的,这个过程叫做伪标签化。伪标签化过程包括几个步骤:
-
模型最初是在少量标注数据上进行训练的。
-
然后,训练好的模型会为未标注的数据预测标签,从而生成伪标签。
-
通过将原始标注数据和新生成的伪标签数据结合起来,重新训练模型。
这些技术作为启发式标签函数,通过关联文本、元数据提示或分类模型来谨慎地推导噪声标签。不同来源之间的无确定性程度差异显著——翻译工具提供的是近似的短语对齐,而关键词提取器则提供准确但稀疏的信号。
Whisper 通过使用概率图模型协调不同的标签生成器,捕获启发式标签方法之间的依赖关系。这指导了将不完美的来源聚合为具有校准信心评分的一致性训练标签。
支持半监督学习
至关重要的是,Whisper 使用了以下架构创新,支持对弱监督方法至关重要的半监督目标:
-
自我训练:这种方法通过重新训练模型来逐步增长标签数据,训练过程仅限于高置信度区域,以最小化噪声积累,且使用主动学习查询来识别需要人工验证的易错候选。这种方法在半监督学习中非常有效,允许模型从其高置信度的预测中学习,逐步提高其准确性。
-
随机深度:引入独特的随机深度层,意味着在训练过程中随机丢弃模型的某些模块。这一策略可以防止模型过度依赖特定参数,提升其对噪声标签的鲁棒性。在半监督学习环境中,处理固有的不确定性和变异性时,这是一种有益的技术。
-
中间预训练:这涉及在重建任务(如掩蔽)上的中间自监督预训练。中间预训练步骤提供了功能性正则化,并帮助在模型进行标签感知调优之前学习稳健的数据表示。它有助于减少在弱监督数据中常见的过拟合错误,这是半监督学习场景中的一大挑战。
综合来看,这些创新提高了 Whisper 在应对半监督学习挑战方面的能力,尤其是在标签数据稀缺或噪声较大的情况下。每项技术都提升了模型的整体鲁棒性和准确性,使其非常适合于在完全监督学习不可行的实际应用中使用。
让我们理解这些架构创新如何转化为可衡量的性能提升。
性能提升的基准测试
弱监督训练策略在 ASR 系统中已被证明非常有效,通过对标准 LibriSpeech 测试集上的指标进行比较得到了验证。下表突出显示了两种不同的训练方法及其相应的词错误率(WERs):
| 训练方法 | WER |
|---|---|
| 完全监督(仅清洁数据) | 5.8% |
| 弱监督(噪声网络数据) | 3.2% |
表 3.1 – 两种不同训练方法的词错误率(WER)
完全监督方法依赖于清洁且标注准确的数据,获得了 5.8% 的 WER。相比之下,利用噪声网络数据的弱监督方法,显著优于完全监督方法,达到了 3.2% 的 WER。这一显著改进凸显了弱监督在 ASR 中的有效性。
LibriSpeech 测试集
LibriSpeech 测试集收集了来自公共领域有声书的英语语音数据。它是更大规模的 LibriSpeech 语料库的一部分,该语料库是一个广泛使用的 ASR 研究数据集。该测试集专门用于评估 ASR 模型的性能,为不同系统之间的比较提供标准基准。
LibriSpeech 测试集被分为两个子集:test-clean 和 test-other。test-clean 子集包含较清晰的录音,背景噪声较少,一般对 ASR 模型的转录较为容易。另一方面,test-other 子集包含更具挑战性的录音,具有各种类型的噪声和失真。这些子集让研究人员能够评估他们的 ASR 模型在不同条件下的表现。
LibriSpeech 测试集衡量的是自动语音识别(ASR)模型在语音识别研究中的字错误率(WER)。WER 是 ASR 中的一个标准度量,用于计算模型转录错误的单词百分比。通过比较 LibriSpeech 测试集上的 WER,研究人员可以评估不同 ASR 模型或同一模型不同版本的相对性能。
弱监督利用包含不准确或标注不精确的大规模数据集。尽管数据中可能存在噪声,但数据集的量和多样性使得模型能够学习到稳健的语音表示。这种方法在获取大量完全标注数据既不实际又过于昂贵时尤其具有优势。弱监督在减少 WER 上的成功可以归因于几个因素:
-
数据的多样性:嘈杂的网络数据通常包括各种口音、方言和说话风格,这有助于模型更好地在实际场景中进行泛化。
-
数量重于质量:可用于弱监督的大量数据弥补了单个数据点质量较低的缺点。通过接触大量示例,模型能够辨别模式并纠正错误。
-
正则化效应:在嘈杂数据上训练可以起到正则化作用,防止模型对较小、较干净数据集的特异性过拟合。
-
成本效益:弱监督利用现成的网络数据,减少了昂贵且耗时的数据标注过程。
-
创新的训练技术:数据编程、多任务学习和迁移学习常常在弱监督中使用,以应对数据中的噪声并提高学习效率。
来自 LibriSpeech 测试集的结果表明,弱监督是完全监督学习的可行替代方案,并且在 ASR 任务中可能带来更优的表现。这个发现对于开发像 Whisper 这样的 ASR 系统特别相关,其中在各种条件下准确转录语音的能力至关重要。在训练这类模型时采用弱监督是一条有前景的方向,可以使 ASR 系统更加准确、稳健和多功能。
总结来说,网络规模的弱监督是解锁 Whisper 高级语音识别能力的关键。战略性地聚合不完美的标签函数,便于高效地获取庞大而杂乱的数据集。然后,定制的模型架构能够在不确定的情况下提取实际的知识,最终实现了最先进的性能。
当我们意识到半监督学习在提升 Whisper 能力方面的细微差别时,我们必须关注技术进步的另一个关键方面:利用广泛的数据集。这引出了下一个关键话题:认识到使用大规模数据进行训练的好处。
认识到使用大规模数据进行训练的好处
使用大规模数据训练像 OpenAI 的 Whisper 这样的自动语音识别(ASR)模型带来了前所未有的好处。与依赖较小、精确标注数据集的传统方法相反,这种方法基于一个原则:接触庞大、丰富的数据集可以显著提升模型理解和解读人类语音的能力,涵盖其所有复杂性。
使用大规模数据的一个最重要的好处是能够捕捉到丰富的语言多样性。人类的语言多样性不仅体现在不同的语言上,还包括口音、方言和俚语等方面。通过为 Whisper 提供包含这些变化的大规模数据集,模型能够熟练地理解并转录来自不同语言背景的语音。这就像是在多元文化的环境中成长,自然而然地学习理解不同语言的变化和口音,即使是在嘈杂的环境中。
在嘈杂环境中导航
现实中的语音很少是干净无噪声的。大规模数据集通常包含背景噪音、重叠的对话以及不同的音质。对这些数据进行训练使得 Whisper 在现实场景中能够强大地表现出来,因为理想的录音条件通常是例外,而不是常态。这种强大的适应性对于繁忙的城市街道或办公环境中的实际应用至关重要。
人类对话是复杂的。它们涉及到打断、非线性的话语结构以及各种情感和语调。大规模的数据集通常包含这样的对话复杂性,使得 Whisper 能够学习并适应人类沟通的自然流动。这种学习不仅仅是理解单词,还包括把握上下文、情感暗示以及言语中未言明的细微差别。
拥抱全球语言变体
在大规模数据集上训练 Whisper 还使其能够接触到各种全球语言变体。这种接触在今天互联互通的世界中至关重要,因为 ASR 系统越来越需要理解并转录多语言内容。从欧洲语言的播客到亚洲方言的 YouTube 视频,每一份数据都丰富了 Whisper 的语言库。
大规模数据的一个有趣之处是,并非所有数据都需要完美标注。Whisper 可以从不完美的、嘈杂数据中学习,使训练过程更像人类学习语言——通过接触和上下文理解,而不是死记硬背。这种方法还避免了为大量数据集进行精细标注所需的庞大资源。
不同行业通常使用特定的行话和术语。大规模数据集,尤其是那些来自法律或医疗等专业领域的数据,为 Whisper 提供了必要的行业特定语言的暴露。这使得它成为需要准确转录服务的专业人士的宝贵工具,它能够理解行业语言的细微差别。
使用大规模数据训练 Whisper 就像是在为它准备一场穿越人类语言多样化景观的旅程。就像一个旅行丰富的人对不同的文化和语言有着深刻理解一样,Whisper 通过接触庞大且多样的数据集,熟练地应对人类交流的复杂性。这场由大规模数据驱动的旅程,不仅仅是构建一个高效的 ASR 系统,更是在创造一项尽可能自然、准确地理解和与人类声音互动的技术。
现在你已经了解了这些半监督训练策略,接下来的步骤是深入挖掘数据——包括标注、利用和模型优化过程。在接下来的部分中,我们将阐述为语音识别系统策划最佳数据集的原则。你将获得组建特定领域语料库、有效标注相关示例以及微调模型(如 Whisper)以最大化目标应用场景中准确性的实际技能。
获取数据、标注和模型训练的洞察
现在我们已经讲解了 Whisper 的半监督训练方法,接下来的步骤是深入挖掘如何策划最佳数据,以推动针对性性能提升。虽然 Web 规模的语料库提供了一个强有力的起点,但针对特定应用的微调需要定制数据集的开发。
记住我们之前学过的关于变压器如何处理序列的概念。传统的序列到序列模型(例如 RNN)是逐步处理输入序列的,这对于长序列来说可能比较耗时。而变压器则可以同时处理输入序列中的所有词语,从而加快训练时间。Whisper 的变压器序列到序列模型已经在多种语音处理任务上进行了训练,包括多语言语音识别、翻译、口语语言识别和语音活动检测。如图 3.4所示,这些任务通过一组标记共同表示,由解码器进行预测,从而使单一模型能够取代传统语音处理管道中的多个阶段。多任务训练格式使用一组独特的标记作为任务指示符或分类目标:

图 3.4 – 使用变压器的 Whisper 序列到序列训练方法(Whisper 的 GitHub 仓库:https://github.com/openai/whisper/tree/main)
接下来的几节将解锁收集领域数据的最佳实践、高效注释最小可行样本的技巧,以及跟踪指标以确保数据完整性。我们将涵盖音频条件、说话人特征和标签分布的精确监控,以最大化模型的学习效果。到最后,您将掌握组建领域适应数据集的可操作技能——为行业术语或特定声学环境需要精确调优的语音识别提供支持。
理解数据选择和注释的重要性
在我们深入优化 Whisper 性能的原则时,理解针对语音识别目标量身定制的训练数据策划最佳实践是一个至关重要的起点。虽然弱监督有助于利用现有的网络语音数据,但针对细分应用的微调则需要更多定制化的数据策划。
本节将探讨组建领域特定数据集时的考虑因素、如何高效地优先进行标注工作,以及注释方法——揭示这些要素为何对释放 Whisper 的全部潜力至关重要。
收集领域内的训练样本
尽管在大规模网络语料上进行预训练为 Whisper 提供了强大的通用语音理解能力,但在专业应用场景下,最佳性能仍然需要领域内的训练数据。
例如,一个医疗语音助手需要接触到术语密集的医患对话,并且还要考虑到医院的环境噪音,才能可靠地转录医学检查内容。而新闻转录模型则需要国际英语方言中的政治记者发布会录音。
领域内数据与目标部署环境的匹配,使 Whisper 接触到必要的词汇、语音特征和语言模式——相比网络预训练,这将带来 30%-50%的准确度提升。
然而,收集小众数据集可能会面临挑战。记录真实的患者对话需要遵循严格的医疗隐私政策,而新闻机构则严格保护内部媒体资产。
在这里,弱监督下的数据编程策略有助于挖掘小众数据。通过混合和破坏网络数据,组装合成的领域内训练集提供了一种务实的替代方案。
优先标注相关数据
在训练 OpenAI 的 Whisper 时,选择正确的标注数据至关重要。标注就像是给数据贴标签:我们告诉系统每一条数据的含义。这一步对于帮助 Whisper 正确理解和解读语音至关重要。
想象我们有一个庞大的拼图,拼图中包含了不同的声音和单词。首先挑选最具辨识度的拼图块将有助于更快地完成图像,选择特定数据进行标注将使 Whisper 的训练更加高效。这意味着我们不需要标注每一个声音,而是专注于那些能帮助 Whisper 学习最多的声音。
一个令人兴奋的方面是发现数据中的类别。可以把这些看作是具有共同特征的群体或类别。例如,Whisper 可能会遇到各种不同的英语口音。每种口音都可以看作是一个不同的类别。通过聚焦标注这些口音的代表性样本,我们帮助 Whisper 更准确地学习并理解这些口音。
聚焦于标注是关于如何明智地利用我们的资源。我们不是标注所有内容,而是有策略地挑选代表不同类别或群体的数据。通过这种方式,Whisper 可以在不被淹没的情况下学习广泛的语音模式。
总结来说,优先考虑标注数据意味着选择最具信息性和多样性的样本,这些样本能够帮助 Whisper 更有效地学习人类语音的复杂性。这就像通过展示各种例子来教孩子——通过这种方式,他们学会了识别并理解周围世界的多样性。
采用高效准确的标注方法
在 Whisper 训练的精细过程里,标注起着至关重要的作用。本节将深入探讨高效且准确的标注方法如何对将原始音频转化为丰富标注数据集至关重要。最佳实践语音标注包括以下内容:
-
音频分段:将一个复杂的音频文件视为一个连续的数据流。我们的第一个音频分段任务是将该流分割成更小、更易管理的单元。这类似于将冗长的代码库划分为功能模块,以便更好地阅读和维护。每个音频段都有准确的时间戳,确保了精确的开始和结束。这个精细的过程得到了语言变更检测工具的支持,类似于编程中的语法高亮,帮助标注员识别音频中的语言转换。
-
二次转录:Whisper 的标注过程采用了二次转录方法。在第一次转录时,标注员将音频段转录下来,类似于编写代码时的初步草稿,关注于结构的准确性。第二次转录则是对这些转录内容进行精细修订,类似于代码审查和调试,确保在考虑语境的同时,语义的一致性和准确性得到保证。
-
解决方案追踪:在软件开发中,追踪变化和决策对于理解项目的演变至关重要。同样,在 Whisper 的标注过程中,每一个在转录过程中作出的决策,尤其是在解决歧义时,都会被仔细记录。这提供了全面的审计追踪,提供了对语言处理细节的深入理解,帮助完善模型的准确性。
这些技术确保了标注质量的准确性和一致性——这是语音识别的必要条件,因为任何偏差都会严重影响准确性。
最终,直观的界面使标注员能够提高处理繁琐文档的效率。以显示音频波形的网格概念为基础,想象一个复杂的数据显示工具面板。这些网格提供音频波形的详细视觉表现,类似于统计分析中表示数据点的图表。标注员使用这些波形,波形展现了语调、节奏等方面,帮助他们做出更明智的音频分段和标注决策。配合编辑工具和可搜索的分段列表,这种设置提供了高度的控制力和精确度,使标注员能够高效地导航音频数据,类似于数据分析师利用先进的查询和可视化工具筛选大数据集。
战略性数据收集、选择性标注和界面工具的最终结合,能够高效地交付专为扩展 Whisper 语言技能而构建的训练集。对专业词汇、音响学和对话的全面覆盖,为跨越复杂语音领域的卓越转录能力铺平了道路。
现在我们已经探讨了高效准确的标注方法如何提升 Whisper 的学习过程,接下来我们来深入了解这些精确标注的数据如何在训练 Whisper 理解和解读我们多样化的声音与语言世界中发挥关键作用。
学习数据如何在训练 Whisper 时被利用
现在我们已经讨论了优化数据集策划的考虑因素,接下来要解决的核心问题是,Whisper 在训练过程中如何消费语音数据?理解数据利用的复杂性揭示了将标注数据集转化为增强转录能力的方法。
在本节中,我们将解构数据摄取、转换和模型集成的关键阶段,揭示录音如何最终表现为语言理解。追溯这一过程还将揭示监控数据利用信号的技术,以确保数据的完整性。
从异构格式中摄取数据
第一步是从各个来源聚合语音数据,并提供多种音频编码格式,如 MP3、WAV 和 M4A,同时提供如 Word、文本文件或电子表格等格式的文本转录。
这些原始的摄取负载会经过归一化管道,转化为优化的机器可读张量用于学习。音频被解码为一致的格式,然后被切分成固定时长的窗口(例如 30 秒),这使得模型更容易处理。文本去除杂项并被分解为单词/字符令牌。
对于可选的辅助建模,还会记录伴随的元数据,如说话者的年龄、性别、种族等。输出的同质化、机器可读的数据集促进了训练过程中高效的数据加载和批处理。
应用增强以提升多样性
域特定数据在摄取后仍然有可能使模型过拟合到狭窄的数据分布,导致无法泛化。应用数据增强可以提升多样性。
混合背景噪音通过模拟公共环境提供声学鲁棒性训练。调节音高和节奏减少了对狭窄语音风格假设的依赖。合成原始网页语音片段的组合更好地再现了自然对话的动态。
战略性地扭曲训练数据迫使模型更多地关注语言模式而非记忆,从而提高了模型的泛化能力。本章节的配套 Colab 笔记本提供了一个示例,展示如何使用 Hugging Face 的transformers类来便捷地进行大规模的音频数据集增强:
from transformers import WhisperFeatureExtractor
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small")
def prepare_dataset(example):
audio = example["audio"]
features = feature_extractor(
audio["array"], sampling_rate=audio["sampling_rate"], padding=True
)
return features
minds = minds.map(prepare_dataset)
在这个代码片段中,我们首先从transformers库加载WhisperFeatureExtractor。然后,我们定义一个prepare_dataset函数,该函数从我们的数据集中提取一个示例音频,并应用特征提取器。最后,我们使用map函数将此预处理步骤应用于整个数据集,将每个音频文件转化为适合 Whisper 模型的格式。
监控数据利用以确保完整性
如果不加以关注,数据采集或增强中的缺陷可能会致命地破坏完整性。缺失的转录、错误的音频匹配、不同步的片段或过度增强的噪音都可能破坏学习和表现。因此,理解监控使用在确保训练过程完整性中的关键作用是至关重要的。这涉及到精心监督数据的转换过程,类似于一位技艺精湛的工匠保证他们工艺的质量。
想象我们正在打造一幅马赛克,每一块瓷砖代表着我们庞大数据集中独特的声音或短语。为了创造一个真正代表人类言语多样性的马赛克,我们必须确保没有任何单一的颜色或图案主导了整幅画面。这正是覆盖率指标在 Whisper 训练中发挥作用的地方。
覆盖率指标就像是一位细致的策展人,审视我们的马赛克是否均衡多样。它们帮助我们识别某些口音或方言是否被低估,确保 Whisper 理解的言语像我们设想的马赛克一样丰富多彩。例如,如果我们的覆盖率指标揭示出乡村方言的代表性不足,我们可以相应地丰富数据集。这确保了 Whisper 的理解不仅限于城市的流利表达,还能适应乡村言语中的朴素细微差别。
然后是增强的微妙艺术——它是关于在不扭曲言语本质的前提下丰富数据集。增强封顶就像是一场精确与克制的舞蹈。我们引入背景噪音、音高和节奏的变化,但始终在精心校准的范围内。这确保了 Whisper 能够在不失去其想要理解的言语旋律的情况下,学会在自然世界的噪音中找到方向。
想象我们的马赛克在一位专家工匠的细致审查下,每一块瓷砖都被仔细检查其质量和贴合度。人工抽查在数据验证中有着相似的作用,服务于 Whisper 的训练。它们涉及眼光敏锐的专家,他们细心地审查数据,捕捉那些自动化系统可能忽略的微妙差异和错误。这个过程就像是工艺的最后润色,确保每一个训练数据的细节都与预期结果完美契合。这是将人类直觉与技术精确结合的艺术,精细化 Whisper 对人类言语中千变万化细微之处的解读能力。这样可以防止过度的扭曲导致意义的丧失。
这些检查措施共同验证了高质量输入语音和监督的协调交付,这是在语音信号与语言之间建立正确联系的关键。
使用采样和顺序随机化
当模型处理跨越数百万样本的数 TB 语音数据时,按顺序馈送数据可能会导致学习的偏斜。样本顺序偏差或课程假设的出现可能会扭曲模型的理解。在机器学习中,课程假设是指根据特定数据序列或复杂度的假设,结构化地逐步暴露模型于训练数据,这种做法认为特定的序列或数据复杂度有助于更有效的学习。这些假设会影响在训练阶段向模型提供数据的顺序和复杂度。但在 Whisper 训练的背景下,仍需谨慎应用,以避免对模型学习潜力施加不必要的限制。
随机数据洗牌是一种在训练过程中随机打乱数据样本顺序的技术。此方法有助于防止模型学习到数据中的任何潜在顺序模式,避免导致偏向预测。通过随机化数据的顺序,模型在每个训练轮次中能够接触到更多样化的样本,这有助于它学习数据的更具泛化性的表示。
负采样则是训练批次中使用的一种技术,帮助模型更好地区分正例和负例。在这种情况下,正例是与期望输出对齐的样本,而负例则是那些不符合期望的样本。通过在训练批次中包括这些对比性的负样本,模型被挑战去学习更具鲁棒性的表示,从而更好地应对边界情况。
在机器学习模型中使用随机数据洗牌和负采样是一种增强其鲁棒性和泛化能力的有效策略,特别是在处理大型和多样化数据集时。这些技术对于避免偏差并确保模型能够有效处理各种数据场景至关重要。
跟踪诸如困惑度等指标
在训练像 OpenAI 的 Whisper 这样的 AI 模型时,跟踪诸如困惑度等指标至关重要。这些指标是模型学习进度的代理指标,能够有效反映模型如何消化和从所提供的数据中学习。
困惑度
在语言建模目标的背景下,困惑度(Perplexity)衡量的是模型在遇到与语音片段对齐的文本标签时有多么惊讶或不确定。困惑度随时间的降低表明模型在提高对学习到的音频模式与文本表示之间连贯性的理解。这意味着模型对所遇到的数据变得不那么惊讶,暗示它在有效学习训练数据。
除了困惑度,准确率是另一个重要指标,特别适用于如语音转文本等分类任务。准确率衡量模型如何利用训练数据中提供的注释。较高的准确率意味着模型有效地学习了正确的音频和文本数据关联。
WER 是语音识别中的基本指标。它衡量模型转录文本与参考转录文本之间的错误百分比。对于评估 Whisper 在理解和转录口语语言的准确性至关重要。
在类别不平衡的场景中,F1 分数是精确度和召回率的调和平均值。它提供了对 Whisper 性能的更深入理解,特别是当假阳性或假阴性带来重大后果时。较少为人知的指标有受试者工作特征(ROC)曲线和曲线下面积(AUC)。它们用于评估分类模型在不同阈值设置下的性能。ROC AUC 对于处理概率输出非常有用,它提供了对真实与假阳性率之间权衡的洞察。
在受欢迎程度的另一端,混淆矩阵工具通常用于可视化分类算法的性能。它展示了实际分类与预测分类的对比,帮助我们理解模型在区分不同类别方面的表现。同样的说法适用于均方误差(MSE)和均方根误差(RMSE);它们提供了模型区分类别的表现度量。在 Whisper 中,回归任务、MSE 和 RMSE 对量化估计值与实际值之间的平均平方差至关重要。它们是模型预测准确性的关键指标。
数据利用直方图是另一种用于诊断样本中忽视区域的工具。这些直方图有助于识别模型未能有效学习的数据部分,从而为训练过程中的针对性改进提供支持。与直方图一起监控梯度的范数和学习率可以帮助诊断训练问题。例如,可以识别消失或爆炸的梯度,从而调整学习过程。
这些指标和工具一起帮助确保模型充分利用数据集,并能够引导注意力集中在需要改进的领域。可视化音频信号可以提供关于其特征的宝贵洞察。以下是如何使用 Python 中的 librosa 库绘制音频样本波形的示例:
import librosa
import matplotlib.pyplot as plt
import librosa.display
array = example["audio"]["array"]
sampling_rate = example["audio"]["sampling_rate"]
plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)
这段代码从数据集中提取一个音频示例,获取音频数组和采样率,然后使用librosa库的display.waveshow()函数绘制波形图。生成的可视化效果(图 3.5)帮助我们观察音频信号在时间上的振幅变化,这对理解音频数据的结构和识别模式非常有用:

图 3.5 – 音频波形图
这一数据摄取、转化和集成过程使 Whisper 能够被赋予标注的语言知识。精心管理这个过程有助于更有效地进行大规模学习,将艰辛的人类信号转化为非凡的语音理解能力。
在深入了解 Whisper 训练中的数据利用细节后,我们将转向揭示模型如何精心训练的复杂过程,这一过程进一步提升了其卓越的语音识别能力。
探索 Whisper 模型训练的过程
我们现在已经到达一个有趣的转折点。手头有了翻译后的数据集,下一步就是将积累的语音语言理解能力积极传递给 Whisper。这一知识转移通过在训练步骤中不断调整模型参数来实现——塑造语言连接。
理解这个运行时的优化过程对监控健康的进展和诊断问题非常有价值。我们将从配置训练方案到跟踪评估信号,逐步走过关键阶段,最终实现全面的语音掌握。
配置训练参数和基础设施
启动机器学习模型的训练会涉及到一个微妙的平衡,即配置控制学习动态的超参数与可用计算资源之间的平衡。这个平衡至关重要,以确保高效的学习和最佳的模型性能。最重要的超参数包括批量大小、学习率、训练步骤和启用硬件加速。我们来详细看看每一个:
-
批量大小:批量大小是一个关键的超参数,决定了在模型更新其内部参数之前处理的样本数量。它代表了计算效率与学习稳定性之间的权衡。较大的批量大小可以让模型每次更新时处理更多的样本,从而加速训练。然而,这也需要更多的内存,并可能由于需要对更多样本的梯度进行平均,导致学习不稳定。相反,较小的批量大小可能导致更稳定的学习和更好的泛化能力,但会以训练速度较慢为代价。
-
学习率:学习率是另一个关键超参数,决定了模型更新参数时的步长。它控制了模型更新的激进程度。较高的学习率可能使模型快速收敛,但也可能导致超过最优解。另一方面,较低的学习率可以导致更精确的收敛,但也可能使模型陷入次优解或收敛速度过慢。
-
训练步数:训练步数是一个超参数,决定了训练过程的持续时间。它代表了计算资源与模型性能之间的权衡。更多的训练步数使模型能够学习更复杂的模式,但也需要更多的计算资源,并可能导致过拟合。相反,较少的训练步数可以节省计算资源,但可能导致欠拟合。
-
硬件加速:硬件加速器,如图形处理单元(GPU)和张量处理单元(TPU),可以显著加快训练过程。这些设备旨在高效地执行并行计算,这是机器学习任务中的常见要求。因此,使用硬件加速器可以更高效地利用计算资源。
错误配置这些参数可能导致学习过程偏离或进展缓慢,浪费本可以用来调整参数的宝贵时间。为避免这种情况,通常有益于先对小规模的运行进行性能分析,或者从参考模型中继承超参数设置。这种方法有助于简化设置阶段,确保学习过程高效收敛。
从检查点启动
在生成式人工智能中,利用现有知识的能力是一个改变游戏规则的因素。OpenAI 的 Whisper 就是在这一点上表现出色,它提供了初始化检查点——这些预训练模型概括了原始训练中所获得的宝贵通用语音知识。这些检查点不仅仅是静态快照;它们是动态的知识库,体现了 Whisper 学习过程的精髓。
Whisper 利用这些检查点,而不是从头开始,以启动其学习过程。这种方法转移了对语音和语言的内在理解,有效避开了获得基本语言能力所需的繁重工作。实质上,这些检查点充当了跳板,加速了针对性专业化的过程。
通过检查点进行的知识转移类似于机器学习中持续学习技术的原理。它提供了一个宝贵的起点,节省了本来需要花费数小时到数天来重新发现基本语音概念的时间。这不仅仅是节省时间的措施;它是一种战略性举措,使 Whisper 能够集中精力改进其能力并扩展其知识库。
检查点的力量在于其封装和传递知识的能力。它们体现了 Whisper 的学习历程, encapsulating 了所学的教训、克服的挑战以及获得的知识。通过利用这些检查点,Whisper 可以迅速投入到优化和扩展其能力的工作中,而不是从头开始。
跟踪训练动态
机器学习模型中的训练动态涉及许多相互关联的过程,这些过程对模型的性能至关重要。这些过程从批量数据通过编码器和解码器层的前向传播开始,生成预测结果。接下来是量化损失,即模型预测与目标标签之间的差距。然后,损失会被反向传播,以更新模型参数,从而最小化损失。这个过程会在整个数据集上重复进行一个训练周期。
积极监控诸如损失值和预测准确率等指标在训练周期中的变化至关重要。它为模型的学习进度提供了诊断性的脉搏,并能提醒我们潜在的问题,如过拟合或标签噪声,这些问题可能会影响模型的性能。
除了这些核心过程之外,还可以引入补充技术来规范训练过程并优化模型的效果。这些技术包括通过随机深度和丢弃法向模型中引入噪声,以防止模型依赖于脆弱的模式。集成方法,即从模型检查点中选择强健的解决方案,也可以提升模型性能。
此外,采用循环学习率可以快速探索解决方案空间,并更专注地优化模型参数。以下是采用循环学习率在训练如 Whisper 这样的模型中的优势:
-
克服局部最小值:训练深度学习模型时的一个重大挑战是避免陷入局部最小值——训练过程中的一些不是最优解的点。循环学习率通过允许模型跳出这些局部最小值来帮助解决这个问题。当学习率增加时,它为模型提供了一股能量,帮助它摆脱这些次优点。
-
加速收敛:传统的学习率调度通常从较高的学习率开始,随着时间推移逐渐减小。虽然这种方式通常有效,但速度较慢。循环学习率通过周期性地提高学习率来促使解决方案空间的更快速探索,从而加速了收敛过程。
-
减少对微调学习率调度的需求:找到合适的学习率调度方案可能是繁琐的,并且需要大量实验。由于其本身的特点,循环学习率减少了这种微调的需求。循环方法会自动调整学习率,帮助在探索和利用解决方案空间之间找到良好的平衡。
-
改进的泛化能力:通过调节学习率,模型能够接触到更广泛的训练场景。这可以使模型更强大,能够更好地泛化未见过的数据,因为它不会过度优化训练数据的特定特征。
-
对训练过程各阶段的适应性:周期性学习率在不同的训练阶段都有可能带来益处。例如,较高的学习率可以用于初期的快速收敛。较低的学习率可以帮助在后期阶段微调模型的参数。
所有这些技术都是创造性的缓冲区,帮助我们克服优化的瓶颈,从而更全面地理解数据。
集成
集成指的是将多个预测模型组合成一个模型,这个模型通常比单个模型更准确。这种方法基于这样一个观点:通过聚合多个模型的预测结果,一个模型的错误可能会被其他模型弥补,从而提高整体性能。机器学习中的集成方法可以分为两大类:序列集成技术和并行集成技术。
序列集成技术,如自适应提升(AdaBoost),按顺序生成基学习器,其中前一个学习器的性能会影响每个后续学习器。学习器根据准确性加权,最终的预测是基于加权投票。
并行集成技术,如随机森林,通过相互独立地生成基学习器,鼓励学习器之间的多样性。最终的预测通常是通过平均所有学习器的预测结果(回归任务)或通过多数投票(分类任务)来进行的。
监控评估集
在机器学习中,特别是在训练像 Whisper 这样的模型时,评估数据集作为评估训练环境外能力的关键基准。通过这些数据集,可以估算模型的泛化性能,作为模型能否将其学习到的知识应用于新的、未见过的数据的试金石。
密切关注这些评估集所衍生的指标对于确定训练过程何时结束至关重要。评估数据集在 Whisper 的训练中起着至关重要的作用,作为模型是否准备好用于实际应用的重要指示器。这些数据集与训练集不同,对于评估 Whisper 处理未见数据的能力至关重要,确保其性能不仅限于它所训练的场景。
这些数据集的主要用途是监控过拟合现象,过拟合指的是模型在训练数据上表现出色,但在新的、未见过的数据上表现较差。通过定期对评估数据集进行测试,帮助发现任何过拟合的迹象,确保模型保持稳健和具有良好的泛化能力。
评估数据集上的表现也告诉我们何时结束训练。如果 Whisper 在这些数据集上的表现达到平台或下降,进一步的训练可能不会带来显著改进,表明已准备好部署。
此外,评估数据集帮助微调 Whisper 的参数以实现最佳性能。它们有助于确保模型在部署到实际应用程序之前达到必要的准确性和可靠性标准。
这些数据集在微调 Whisper 以达到最佳性能方面起到关键作用,保证其在多种实际场景中的效果和可靠性。
导出部署就绪的检查点
训练旅程的最后一步包括导出在训练周期中保存的表现最佳的快照。这些检查点包含模型的参数,代表模型学习的顶峰,并准备好在客户应用程序中部署。
这些导出的检查点不仅仅是静态的工件,而是 Whisper 语言掌握的编码精髓。一旦部署,它们将直接向最终用户提供 Whisper 卓越的语音识别能力,为客户边缘带来实际价值。
此外,随着新数据的出现,改进之旅并不会在部署后结束。该模型可以进行重新训练和优化,持续提升其转录能力。这种迭代过程确保 Whisper 作为 ASR 提供者保持竞争优势,随着语音和语言领域不断变化而不断调整和进化。
细致配置、紧密反馈循环和战略正则化技术的结合确保了像 Whisper 这样的模型从其训练的数据中提取最大价值。这种全面的方法将大量的语音数据转化为高性能的语音识别引擎,以在各个规模上满足并超越用户需求。
现在我们已经全面了解了 Whisper 的训练复杂性,让我们探索当其与 OpenAI 的其他开创性技术集成时所展现的协同潜力,打开了增强能力和应用的领域之门。
将 Whisper 与其他 OpenAI 技术集成
当我们揭示 Whisper 的能力时,一个引人入胜的新领域出现了——将其语音能力与 OpenAI 的其他尖端 AI 技术进行协同。集成 Whisper 不仅仅是孤立操作,还解锁了在视觉、语言和声学理解等多种模式交汇处的新可能性。
以下部分将探讨使这些融合系统驱动更先进应用的技术纽带。我们将介绍连接表示、级联自然语言任务,甚至通过语音上下文引导生成图像的策略。到最后,你将能拓展想象力,将 Whisper 与 DALL-E、CLIP 等工具结合,从而提高性能并解锁多感官情境化增强的体验。
理解 AI 模型之间的协同作用
随着我们逐步解开 Whisper 的内在工作原理,新的前沿领域正等待着它与其他前沿 OpenAI 技术的协同。多种工具包,从代码编写的 GitHub Copilot 到创意图像生成的 DALL-E,当与 Whisper 互联时,承载着令人兴奋的可能性。
那么,哪些领域会从这种跨学科融合中显著受益呢?首先,我们通过理解结合视觉、语言和语音识别等多模态时可能的协同效应来扎实我们的探索。这个跨学科的视角揭示了 Whisper 集成能够推动的相关问题。
丰富情境背景以增强视觉理解
人类能够无缝整合视觉和听觉信号,从而全面推理环境。然而,历史上,计算机视觉和语音理解往往各自发展,无法弥合这个鸿沟。然而,将 Whisper 的语音表示与视觉分析工具如对比语言-图像预训练(CLIP)结合,能够突破单纯依赖像素的局限。这预示着更多的上下文视觉智能应用:
-
定位噪音源:利用语音线索定位故障机器
-
理解社会动态:利用对话细节来完善关系图谱
通过这种方式,Whisper 帮助将上下文的视觉理解向人类水平逼近。
CLIP
OpenAI 的 CLIP 是一个独特地连接视觉和语言的模型。它在各种互联网文本与图像的配对数据上进行训练,但与大多数 AI 模型不同,它不需要在训练过程中直接将图像与其描述配对。相反,它通过广泛地关联图像和文本来学习,使其能够理解并生成未曾见过的图像描述。
CLIP 和 Whisper 之间的协同作用体现在它们互补的能力上。Whisper 可以将口语转换为书面文本,而 CLIP 可以根据这些文本理解并生成图像描述。这种结合在语音识别和图像理解应用中尤其强大。
让我们探索一个情境,来说明这个应用。假设有一个视力障碍者在公共博物馆中导航。他们佩戴着集成了 Whisper 语音识别和 CLIP 语言-图像理解的可穿戴设备。
当个体走过不同的展览区时,他们可以询问关于周围环境的问题,如“我面前是什么?”或提出具体的请求,例如“描述我面前的画作”。Whisper 准确地将这些口头查询转录为文本。可穿戴设备上有一台相机,能够捕捉到个体周围环境的图像。CLIP 处理这些图像,并根据其训练过的文本描述理解图像内容。例如,它可以识别并理解一幅画、一件雕塑或任何其他展品。
该组合系统将口头查询与视觉上下文关联起来。例如,对于“描述我面前的画作”这一陈述,Whisper 转录的文本引导 CLIP 专注于视觉框架中的特定物体(画作)。然后,CLIP 提供画作的详细描述,转化为语音并通过耳机传递给用户。
这些好处显而易见:视障人士可以实时获得与环境相关的描述,增强了他们与周围环境的互动体验。本质上,Whisper 与 CLIP 的结合提供了一种更自然、互动的方式来获取信息,用户可以通过说话询问自己周围的情况。这项技术可以扩展到各种环境,如户外地标、教育场所或日常街道导航,为视障用户提供更丰富的情境意识。
推动自然对话系统的发展
语音识别为对话代理提供了关键的基础设施,用于接收问题或命令。这通常是下游自然语言处理(如文本生成或语义分析)的起点。
Whisper 的功能不仅仅局限于将口语转换为文本。它捕捉并解读了语音中常被忽视的微妙元素,而这些元素在沟通中扮演着重要角色。这些元素包括停顿长度、打断和轻微的确认,它们为对话提供了宝贵的上下文。
将 Whisper 与像 GPT 这样的模型整合,预示着更自然的对话流。这将带来更具吸引力和人性化的互动,改变我们与 AI 系统的互动方式。
解锁多模态人格和叙事
处理和解释多模态数据的能力是 Whisper 最强大的特点之一。这一能力使得对话的上下文和内容能得到更全面的理解,从而提升生成回答的质量和相关性。
Whisper 保留重要听觉元素的能力是其与其他语音识别系统的关键区别。虽然其他系统可能忽视人类语言的细微差别,Whisper 旨在捕捉和解读这些微妙之处。这一能力使 Whisper 能够提供更准确、细腻的口语语言解读,从而提升生成文本的质量。
通过多模态 Osprey AI 和 Whisper 提升农业洞察力
在快速发展的农业技术领域,整合 OpenAI 的 Whisper 和 Osprey AI 提出了一个全新的植物和作物分析方法。这一组合为农民和农艺师提供了一种变革性的解决方案,使他们能够更深入地了解农业实践。
Osprey AI 是一个前沿的多模态大语言模型(MLLM),擅长解读和综合多种数据形式,包括文本、图像和音频。这项技术在从结合的视觉和文本信息中生成全面的叙述和洞察方面尤为有效。它是需要详细分析和情境理解的应用的理想工具。让我们通过农业场景来探索 Osprey AI 和 Whisper 如何显著提升田间分析:
-
Whisper 在田间的应用:农民或农艺师使用集成 Whisper 的设备口头描述他们在检查作物时的观察。他们可能会报告诸如“这些番茄植物的叶子出现黄色斑点”或询问类似“这一排玉米枯萎的叶子可能是什么原因?”等问题。Whisper 高效地将这些口头输入转换为准确的文本。
-
将视觉数据与 Osprey AI 相结合:同时,设备会捕捉相关植物的图像。这些图像和来自 Whisper 的转录文本将输入到 Osprey AI。借助 MLLM 能力,Osprey AI 分析综合数据,全面了解植物的状况。
-
全面的作物分析:Osprey AI 处理视觉和文本数据,以识别潜在问题,如营养缺乏、害虫侵扰或疾病。例如,农民提到的番茄叶子上的黄色斑点将与图像一起分析。Osprey AI 可能得出特定的营养缺乏症或疾病诊断,并提供治疗建议。
-
实时反馈与指导:这一整合为农民提供了作物健康的实时反馈和可操作的洞察。它可以建议具体的干预措施,如调整灌溉、施用特定肥料或使用针对观察到的情况量身定制的害虫控制方法。
通过将 Whisper 与 Osprey AI 结合应用于农业,农民可以获得一个强大的工具,简化作物健康监测和维护的过程,并提供精确、数据驱动的最佳作物管理建议。这一创新方法标志着精准农业的重大进步,使农民能够做出更明智的决策,从而提高作物健康和产量。
在探索了 Whisper 先进的训练过程和在多种应用中的潜力后,让我们进一步探讨它与其他前沿技术的集成如何进一步增强和拓展 Whisper 的能力,为我们与这一变革性工具的旅程开启新的视野。
学习集成如何增强 Whisper 的能力
正如我们所见,Whisper 在跨多种语言和任务的语音识别中展现了显著的能力。然而,集成互补的 AI 技术能够释放更大的潜力——增强 Whisper 的能力并推动创新应用的实现。
本节将探讨各种集成方式,这些方式可以增强Whisper 的优势。通过理解其中的技术协同效应,您将获得构建超越 Whisper 单一转录能力的系统的技能。让我们开始吧!
通过多编码器融合提升性能
一个有影响力的集成策略将多个编码器结合在一起,这些编码器专注于不同的模态,之后进行联合处理。例如,融合语音编码器如 Whisper 和视觉编码器如 CLIP,使我们能够利用语音和图像来理解复杂的环境。
这种架构在合并解码阶段之前提供了多角度的输入场景分析。识别机械噪声源或分析社会群体动态等挑战,得益于视觉和听觉的联合理解。
关键在于找到合适的融合方法,以最有效地协同不同的编码方式:
-
多阶段级联将一个编码器的输出作为输入传递给另一个编码器。这种方式链式地构建了上下文理解。
-
编码器拼接直接结合向量表示以保留模态特性。联合解码器随后学习最佳的混合策略。
-
共享权重的双编码器网络迫使跨模态的学习模式保持一致。这有助于在编码器之间传递知识。
因此,通过创造性地将 Whisper 与视觉 AI(如 CLIP)融合,应用能够同时利用两种感知世界的最佳特点!
通过语音链条扩展 NLP 能力
Whisper 还与大型语言模型如 GPT-4 强有力地互联。以对话代理为例——虽然对话系统可以接收文本查询,但加入 Whisper 作为语音前端可以让互动更加自然。
但其好处不仅仅是免提操作。Whisper 捕捉到了诸如停顿长度、打断和确认等在文本中丢失的细微差别。将这些语音动态传播到语言模型中,提升了上下文理解和更自然的代理响应!
这个语音到文本再到行动的流程是 NLP 能力的倍增器:
-
多步推理链连接不同模态
-
语音在语言之外增加了额外的交互信号
-
更加丰富的上下文理解使下游处理更加完善
通过 Whisper 解锁语音访问服务,极大地扩展了它们的可访问性和用户体验。
通过定位推动创意应用的发展
最后,不同模态之间的接口也能激发创造力!在 NLP 和 ASR 的上下文中,通过将语言与现实世界的知识或多模态数据相连接来增强这些系统的过程被称为定位。
定位是指建立成功交流与理解所需的共同信息,无论是人与人之间,还是人机之间。在 ASR 中,定位可以指整合视觉或其他多模态信息来帮助识别和解释口语。例如,针对多模态语音识别的细粒度定位,涉及使用图像中不同部分的视觉信息来提高与这些视觉元素相关的语音识别。这可以帮助 ASR 系统恢复更广泛的单词类型,包括实体、形容词和动词,通过定位与口语内容相关的图像中的相关区域。例如,提出了一种语音场景图定位网络(SGGNet²),通过利用场景图的结构稳健地对口语进行定位,这在语音引导的导航任务中尤为有效(arxiv.org/abs/2307.07468)。
当我们考虑有根据的语言学习的前景时,像 OpenAI 的 Whisper 这样的模型的能力变得愈发重要。Whisper 在各个领域的语音识别中展现了惊人的准确性,为更多具有上下文感知的应用奠定了基础。现在,让我们来看看一些例子,展示集成 Whisper 如何显著提升各行业的交互系统。
检查一些从 Whisper 集成中受益的应用示例
我们探索了增强 Whisper 强大功能的强力集成——从视觉定位到创造性叙述。但这些技术机会如何在具体应用中转化为影响用户的能力呢?这一部分将概述一些有前景的应用,以激发将 AI 协同作用转化为实际解决方案的想法。
为虚拟助手注入情感智能
随着我们深入探索 AI,Whisper 集成最有前景的应用之一就是增强虚拟助手的情感智能。像 Alexa、Siri 和 Google Assistant 这样的虚拟助手已经成为我们日常生活的一部分,帮助我们完成从设置提醒到控制智能家居设备等任务。然而,这些助手在传达同理心和解读细微的社交线索时常常出现困难,使得互动显得机械且缺乏个性。
通过集成 Whisper,我们可以为这些虚拟助手解锁一个全新的互动维度。Whisper 强大的语音识别能力使其能够捕捉到语音中的细微差别,如停顿、叹息、笑声和激动的插话。这使得虚拟助手能够根据对话的语境做出恰当的反应,从而增强其亲和力和可爱度。
想象一下,一个虚拟助手能够与用户互动,展现出沮丧的情绪,庆祝兴奋的好消息,或是在适当的时候礼貌地打断对话。这种情感技能的智能可以改变用户体验,让互动更加自然和富有吸引力。就像是与一个了解你情绪并相应回应的朋友对话,而不是一个单纯执行命令的机器。
用动态图像讲故事
Whisper 集成的另一个令人兴奋的应用是儿童学习应用领域。传统上,这些应用会展示静态插图,并配合朗读的文字。但如果我们能让这些插图生动起来,并通过 Whisper 的语音编码动态引导呢?
当年轻读者听到充满幻想的故事和有趣的教育概念时,相关的图像可以实时生成,与 unfolding 的叙事情境相匹配。这会创造一个身临其境的环境,展示故事中提到的人物、地点和事物,并与音频同步。想象一个孩子在听关于勇敢骑士与龙战斗的故事,随着故事的发展,屏幕上的图像会变化以反映叙事内容。骑士冲锋,龙喷吐火焰,公主欢呼——这一切与音频完美同步。
这种动态图像使得学习体验更加引人入胜,帮助理解和记忆。这是一种让故事栩栩如生、激发年轻人热爱学习的强大方式。
通过语音搜索多媒体档案
Whisper 的集成还彻底改变了我们搜索多媒体档案的方式。传统的内容管理系统在处理语音数据时存在困难,主要集中在文本搜索上。然而,通过利用 Whisper,我们可以实现基于语音的信息检索,甚至是视频和音频文件内部的检索。
无论是搜索公司会议记录、视频讲座还是广播档案,Whisper 驱动的语音查询都能快速定位匹配搜索标准的多媒体时刻。这种语音驱动的能力扩展了对丰富、未开发的视听知识库的访问和发现。
想象一下,只需说“找到我们讨论营销策略的那一部分”,就能在长时间的视频会议中找到特定的时刻,或者学生能够通过命令“展示教授讲解量子力学的那一课”定位到一系列录制讲座中的某个特定主题。这种便利性和高效性能够节省无数小时,并使信息检索变得轻松。
总结
在这一章中,当我们解开 Whisper 的内部机制时,让我们在继续探索定制路径之前,巩固在本次探索过程中揭示的关键见解。
我们从突出 Whisper 变换器模型骨干中的开创性架构进展开始,这些进展将语音识别提升到新的高度。突破性的编码器-解码器机制有效地从输入语音中提取信号,准确生成反映一致意义的转录。
层次化变换器和时间限制的自注意力机制使我们能够选择性地聚焦于相关的发音区域,在细节和速度之间找到平衡,这对于对话响应性至关重要。通过在 90 种语言中进行广泛的预训练,Whisper 发展出了超越以往 ASR 系统中模板匹配的多元化理解能力。
这些策略将手动工作转化为最大的语音识别提升,解锁了行业术语或噪音环境的定制化。我们了解到,通过调整解码器序列长度、束搜索宽度和上下文窗口,我们可以定制 Whisper 的准确性。
下一章将扩展讨论这些策略如何帮助将语音识别从机械化转录转变为灵活的语言理解。
第四章:针对领域和语言特定性微调 Whisper
OpenAI 的 Whisper 是语音识别(ASR)领域的一项突破性创新,能够以前所未有的准确性将语音转录为文本。然而,像任何机器学习模型一样,Whisper 在特定小众语境下的初始表现仍然存在局限。例如,在 COVID-19 大流行初期,Whisper 数月未能识别这一术语。类似地,该模型还未能准确转录与俄乌冲突相关的关键人物和地点的名称,这需要事先的训练数据。
因此,为了充分挖掘该模型的潜力,我们必须针对特定情况进行定制化。本章将揭示将 Whisper 的能力适应特定业务问题的技巧。我们的冒险将跨越多个里程碑,从系统设置到评估改进。
首先,我们将建立并配置 Python 资源,为即将进行的工作提供支持,整合数据集/建模/实验库,形成一个坚实的基础。接下来,我们将聪明地选择多语言语音数据源,例如Common Voice,进一步丰富 Whisper 在特定领域的知识。更加专注的数据可以提升训练质量。
现在,通过工具和增强数据的准备工作,我们可以调整 Whisper 的预测,使其更适合目标应用。例如,我们将探索如何调整置信度、输出类别和时间限制,以便在特定用例中实现预期的结果。我们还将解锁一些工具,使用标准设备对 Whisper 进行深度微调。
跟踪进展依赖于简单明了的测试。我们将设定固定的基准,以客观评估我们微调的进展。设立高标准的评估完整性有助于建立对结果的信任。最终,我们将在改进 Whisper 和通过构建并测试轻量级演示来双重检查声音适配如何转化为现实世界应用之间循环。
我们将致力于通过微调低资源语言来让每个人都能参与进来,而不是无意中忽视那些资源较少的群体。
本章将涵盖以下主题:
-
准备环境和数据进行微调
-
准备特征提取器、分词器和数据
-
训练和评估指标
-
跨数据集评估性能
通过本章中介绍的先进微调方法以及配套的 GitHub 仓库,我们将学习微调 Whisper 在行业特定词汇、地区口音以及实时学习新兴术语方面的基础过程。让我们开始这段实践冒险吧!
技术要求
在本章中,我们将利用 Google Colaboratory。我们将尽量确保能获得最好的 GPU,至少需要 12 GB 的 GPU 内存。
要获取 GPU,在 Google Colab 的主菜单中,点击 Runtime | Change runtime type,然后将 Hardware accelerator 从 None 更改为 GPU。
请记住,微调 Whisper 需要数小时。因此,您必须定期监控 Colab 中运行的笔记本。
本章将教您如何微调 Whisper 模型,使其能够使用如 Hugging Face 数据集、Transformers 和 Hugging Face Hub 等工具识别多种语言的语音。请查看本书 GitHub 仓库中的 Google Colab Python 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter04),并尝试自己进行微调。
一般推荐按照 Colab 笔记本的步骤进行操作,并在训练过程中将模型检查点直接上传至 Hugging Face Hub。Hub 提供以下功能:
-
集成版本控制:您可以确保在训练过程中不会丢失任何模型检查点。
-
TensorBoard 日志:跟踪训练过程中的重要指标。
-
模型卡片:记录模型的功能和预期的使用案例。
-
社区:与社区共享和协作的简便方式!
将笔记本链接到 Hub 非常简单——在提示时输入您的 Hub 认证令牌即可。Colab 笔记本提供了具体的操作说明。
引入 Whisper 微调过程。
实现 Whisper 的最大潜力需要超越开箱即用的功能,通过有目的的微调,配置和增强模型以捕捉精确的细分需求。这一专门优化过程跨越了九个关键里程碑:
-
准备强大的 Python 环境,包含必要的库,如 Transformers 和数据集,以支持严谨的实验。
-
纳入多样化的多语种数据集,包括 Common Voice,以扩大语言广度。
-
设置 Whisper 管道组件,如分词器,以便更轻松地进行预处理和后处理。
-
将原始语音数据转换为模型可处理的对数 Mel 频谱图特征。
-
定义与目标模型大小相匹配的训练参数和硬件配置。
-
建立标准化的测试集和指标,以便进行可靠的性能基准测试。
-
执行训练循环,将配置的超参数、数据和硬件结合起来。
-
根据测试语料和基准排行榜评估微调后的模型。
-
构建展示定制化语音识别效果的应用程序。
我们在穿越这些里程碑的过程中,最终目标始终如一:通过专门的优化,将模型能力与独特的生产需求相匹配。
在概述了微调过程之后,接下来的部分将介绍如何利用 Whisper 检查点。需要明确的是,Whisper 检查点是预训练模型,专门针对不同的计算和语言要求进行调整。在我们的演示中,我们选择了小型检查点,因为它在大小和性能之间提供了平衡——即使在计算能力有限的情况下,它也能为我们提供一个高效的微调选项,确保我们能在不广泛使用的语言的语音识别中取得显著成果。
利用 Whisper 检查点
Whisper 检查点有五种不同配置,分别对应不同的模型大小(微型、基础、小型、中型和大型)。前四种最小配置的检查点是用仅包含英语或多语言数据训练的。最大配置的检查点仅用于多语言。所有 11 个预训练的检查点都可以在 Hugging Face Hub 上找到(huggingface.co/models?search=openai/whisper)。以下表格总结了这些检查点,并提供了 Hub 上模型的链接:
| 大小 | 层数 | 宽度 | 头数 | 参数 | 仅英语 | 多语言 |
|---|---|---|---|---|---|---|
| 微型 | 4 | 384 | 6 | 39M | ✓ | ✓ |
| 基础 | 6 | 512 | 8 | 74M | ✓ | ✓ |
| 小型 | 12 | 768 | 12 | 244M | ✓ | ✓ |
| 中型 | 24 | 1,024 | 16 | 769M | ✓ | ✓ |
| 大型-v1 | 32 | 1,280 | 20 | 1550M | x | ✓ |
| 大型-v2 | 32 | 1,280 | 20 | 1550M | x | ✓ |
| 大型-v3 | 32 | 1,280 | 20 | 1550M | x | ✓ |
表 4.1 – Whisper 检查点
我们将微调具有 244M 参数(约 1 GB)的多语言版本小型检查点,用于演示目的。我们将使用一种不广泛使用的语言,这种语言来自 Common Voice 数据集,用于训练和测试我们的系统。我们将演示即使只有约 8 小时的专业训练数据,我们仍能在这种语言中取得良好结果。
现在我们已经介绍了如何战略性地使用 Whisper 的检查点,接下来我们将准备微调的环境和数据。这个至关重要的步骤要求我们仔细设置工作环境并整理数据,确保为即将到来的微调过程打下坚实基础。这个过渡过程遵循从理解到行动的原则,为在 Whisper 中进行实际应用和创新做好准备。
里程碑 1 – 准备微调的环境和数据
训练一个前沿的语音识别模型,比如 Whisper,要求极高的计算能力——专门的硬件配置对可行的微调至关重要。本节内容需要具备一定的编程基础——我们将深入使用底层 API。即使调整参数并非你的强项,也不必担心!我们将以结构化的方式进行解释,逐步解开概念的谜团,而不是直接进入技术细节。你不必立即动手编写代码——而是通过这里揭示的见解,帮助你将这些过程应用到自己独特的 Whisper 微调需求中。
如果你真的渴望动手操作,本书的 GitHub 仓库 github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter04 中包含了一个补充的笔记本,其中的代码块与章节内容相对应。打开笔记本,随着章节的进行,直接进行参数调整概念的实验。
利用 GPU 加速
尽管 Whisper 可以在 CPU 上训练,但即便是小的检查点,收敛时间也大约需要 100 小时,因此 GPU 加速 对于可行的迭代周期至关重要。
GPU 提供大规模并行计算,通过成千上万的处理核心在专用张量上提供 100 倍速度的训练。像 Whisper 这样拥有十亿级参数的模型,特别受益于额外的吞吐量。
在我们继续进行 Whisper 微调的过程中,我将使用本书 GitHub 仓库中的 Python 笔记本摘录。这些代码是为了说明和解释而提供的。如果你想查看完整的代码序列,请参考本章的 Python 笔记本。以下代码摘录展示了如何跟踪并确认 GPU 的可用性:
import torch
print(torch.cuda.is_available())
大多数云计算实例类型都配备了 GPU——选择适当大小的资源至关重要。
安装适当的 Python 库
我们将使用几个知名的 Python 包来调整 Whisper 模型:
!pip install --upgrade pip
!pip install --upgrade datasets transformers accelerate soundfile librosa evaluate jiwer tensorboard gradio
让我们仔细看看:
-
datasets和transformers提供对语音数据和最先进模型的结构化访问 -
accelerate和tensorboard利用可用的 GPU/TPU 硬件优化模型训练并跟踪实验结果 -
librosa和soundfile用于预处理音频文件,这是将数据输入 Whisper 前的关键步骤 -
jiwer和evaluate支持量化语音识别的有效性 -
gradio将帮助我们创建一个引人注目的演示,展示我们精炼后的模型
我们还将这个环境链接到 Hugging Face Hub,以便我们可以轻松地与社区共享微调后的模型:
from huggingface_hub import notebook_login
notebook_login()
Hugging Face 提供版本控制、模型文档和公共访问,从而确保完全可复现,同时允许我们在彼此的工作基础上进行构建。
Hugging Face 和 Whisper
Hugging Face 是一家数据科学公司,提供一个分享和协作机器学习模型的平台,特别是在自然语言处理(NLP)领域。它因其 Transformers 库而广受认可,该库提供了一系列预训练模型和工具,适用于各种 NLP 任务,包括文本分类、翻译、总结,以及与我们的讨论相关的自动语音识别(ASR)。
Hugging Face 提供了一个简化的 Whisper 微调流程。它允许你加载和准备训练数据,执行数据准备和微调步骤,并评估模型的表现。它还提供了集成的版本控制、TensorBoard 日志、模型卡以及一个用于分享和协作的社区。
尽管 Whisper 已经掌握了很多语言的知识,但仍然有成长的空间——尤其是在处理特定情况时,例如行业术语。我们将介绍一些方法,将补充的语音数据引入,以填补这些空白。
Mozilla 主导的 Common Voice 项目在这里非常适用,它提供了 100 多种语言的数据,直接来自全球志愿者。我们将探讨如何轻松利用这些众包数据集,平衡 Whisper 的准确性和在特定国际应用中的包容性。
除了 Common Voice,我们还可以从全球多个数据集中创建自定义混合数据,以测试 Whisper 的边界。巧妙的混合强调灵活性,这对商业成功至关重要。但我们不能只追求庞大的数据集——多样性带来韧性。我们将为自己配备建设性代表的最佳实践和适应各种语言部署需求的多样化组合。
让我们开始将一些 Common Voice 数据导入 Whisper。
里程碑 2 – 融入 Common Voice 11 数据集
由 Mozilla 主导的 Common Voice 数据集代表了一项通过开放和多样化的语音语料库使语音技术大众化的开创性努力。数据集是一个结构化的数据集合,其中的行通常代表单个观测或实例,而列代表这些实例的特征或变量。对于 Common Voice 来说,每一行代表一个音频记录,每一列代表适用于该音频记录的特征或属性。作为一个跨越 100 多种语言、不断扩展的社区驱动项目,Common Voice 理想地增强了像 Whisper 这样的多语种语音识别系统。
使用 Hugging Face 的Datasets库集成 Common Voice 数据非常简单。我们以流式模式加载所需的语言分割,避免了大量存储需求,并加速了微调工作流程:
from datasets import load_dataset, DatasetDict
common_voice = DatasetDict()
common_voice["train"] = load_dataset("mozilla-foundation/common_voice_11_0", "hi", split="train+validation", use_auth_token=True)
common_voice["test"] = load_dataset("mozilla-foundation/common_voice_11_0", "hi", split="test", use_auth_token=True)
print(common_voice)
当我们最初加载 Common Voice 数据集时,它包含了许多额外的信息,比如说话者的口音、性别、年龄等。它还包括了磁盘音频文件的路径、ID 和数据质量保证的投票信息。
但我们并不关心 Whisper 在语音识别中使用的那些额外元数据细节。Whisper 需要预测的唯一数据就是音频本身和匹配的文本转录。其他所有的内容对于我们的目的来说都是不必要的。
所以,这行代码通过去除那些与我们的语音识别任务无关的额外列或特征,创建了一个精简版的 Common Voice 数据集。我们将其精简为只有 Whisper 所需的核心音频和句子文本。这简化了数据管道:
common_voice = common_voice.remove_columns(["accent", "age", "client_id", "down_votes", "gender", "locale", "path", "segment", "up_votes"])
通过剥离无关的元数据,我们确保只有有意义的特征被输入到 Whisper 中。这帮助模型专注于学习语音到文本的映射,而不是来自说话人细节的无关模式。最终结果是一个更加精简的数据集,更加紧密地与我们的最终目标对齐。
Common Voice 包含了显著的领域多样性、录音条件和说话人群体统计数据。这些数据集展示了相当大的音频质量和口音变化性,因为它们是来自全球贡献者的众包集合。现实世界录音中的不完美使得 Common Voice 成为评估模型鲁棒性的一个具有挑战性的基准。
尽管广泛的多样性带来了挑战,但也使得语音识别系统更具韧性。仅仅在像 LibriSpeech 这样的纯净语料库上训练的系统,在应用于嘈杂环境时往往会出现问题。因此,集成噪音的异质数据对于生产级性能至关重要。
通过涵盖数据多样性,Common Voice 补充了 Whisper 的基础。该模型的广泛多语言预训练提供了全面的语言覆盖;将这一知识适应到 Common Voice 的变异性和低资源语言,是为定制企业应用量身定制的最佳方向。
例如,处理客户咨询的呼叫中心需要能够应对口音、录音伪影和领域词汇的 ASR。当前,联系中心分析在处理专业术语时存在困难。联系中心的客服人员讨论的是一些专业的概念,从 CDMA/GSM 这样的通信缩写到 iPhone 14 Pro Max 这样的专有名词。提升 Whisper 的语境掌握能力需要领域特定的数据。联系中心有其特定的词汇——模型必须理解这些特定的词汇。通过拥有领域内的数据,模型将学习该行业的细节。因此,在 Common Voice 呼叫中心录音上进行微调将提高其在联系中心的效能。
除了领域优化,多语言支持仍然是全球业务的必要条件。尽管 Whisper 展示了令人印象深刻的零样本跨语言能力,但将声学和语言知识适应到不足代表的语言对于公平的人工智能至关重要。
扩展语言覆盖范围
尽管 Whisper 的多语言设计提供了全面的语言覆盖,但在低资源语言中提升表现仍然是包容性语音技术的伦理命题。战略性地微调目标语言数据对于全球公平部署至关重要。
Common Voice 项目分享了多语言表征的这些动机。该计划提供了 100 多种语言的数据集,包括许多资源匮乏的语言。这为增强 Whisper 在需要更多训练数据的语言中的知识提供了独特的机会。
例如,立陶宛语子集包含大约 50 小时的标注语音。从零开始构建一个自动化的立陶宛语转录器对于灵活的波罗的海初创公司来说是不可行的。然而,通过利用 Whisper 的迁移学习能力,可以通过微调快速构建一个高效的立陶宛语优化系统。
对于那些通常被 AI 服务不足的低收入地区的企业而言,这些影响是深远的。与其构建昂贵的定制化模型,不如通过适应 Whisper 来消除进入语音技术的经济障碍。
将这些数据集建设性地整合起来,提供了一种通过语言技术传播社会福祉的途径。战略性地整合必须平衡准确性、速度和包容性。虽然通过增加所有 100 多种 Common Voice 语言可以最大化覆盖范围,但对大多数应用来说,趋同将是不可行的。我们必须有所选择。对于全球企业,仔细选择大约 10 种不同语言进行增强,确保可持续的商业可行性,同时不排除服务不足的群体。
这种战略平衡贯穿于所有形式的算法偏见缓解中。应避免出现带有偏见的解决方案,比如故意削弱特定语言的表现。相反,我们可以通过有针对性的数据增强,主动改善排除群体的技术。Common Voice 提供了可持续实现这一目标的数据资源。
提升翻译能力
语音翻译涉及重大的复杂性——系统不仅需要将音频信号映射为文本,还需要将文本映射为另一种语言的文本。这个任务需要多方面的模型能力,从源语言理解到目标语言流利度。
Whisper 的架构提供了强大的基础,整合了编码器-解码器结构,并在音频语义与语言生成之间实现了深度注意力融合。然而,没有任何一个组织能够独立跟上多样化的声学环境和低资源语言的持续演变。
Mozilla 的 Common Voice 项目成员正在建设可访问的多语言语料库。该项目即将发布的第 12 版将包含 50 种语言的语音翻译数据对,进一步推动普及化工作。整合这些数据集可以优化 Whisper 在生产翻译应用中的表现。
例如,呼叫中心再次呈现了一个既有吸引力又具挑战性的应用领域。客服人员必须处理来自不同语言的全球客户咨询——仅在单一高资源语言上训练模型存在风险,会排除那些资源较少的语言和口音。
因此,语言的构建性平衡对于伦理性的部署至关重要。实现平等需要战略性地融入多样的语言数据。像 Common Voice 这样的来源,通过全球众包录音,提供了现实世界语言多样性的缩影。基于这些数据集训练的模型学会解析多样的口音和语调节奏。
自动语音翻译的进展最近通过自监督技术加速。像 XLSR-Wav2vec2 这样的模型,在跨 50 种语言的 56k 小时 Common Voice 数据上进行了预训练,并在直接语音到语音的翻译中取得了突破。
通过我们增强 Whisper 翻译能力的新策略,我们将开始设置 Whisper 流水线组件。这个聚焦的转变为深入审视 Whisper ASR 工作流中至关重要的工具和过程奠定了基础。通过深入探讨 Whisper 流水线组件的设置,我们正在为微调方法做准备,确保项目成功,并以扎实、实际的基础进行。
里程碑 3 – 设置 Whisper 流水线组件
ASR 过程可以分为三个主要部分:
-
特征提取器:这是处理原始音频输入的初步步骤。可以把它看作是为音频文件做准备,以便模型可以轻松理解和使用它们。特征提取器将音频转换为一种格式,突出显示音频的关键特征,例如音调或音量,这对于模型识别不同的单词和声音至关重要。
-
模型:这是自动语音识别(ASR)过程的核心部分。它执行我们所说的序列到序列的映射。简单来说,它接收来自特征提取器的处理过的音频,并将其转换为一系列文本。就像是将声音的语言翻译成文本的语言。这一部分涉及复杂的计算和模式,以准确确定音频内容。
-
分词器:在模型完成将声音映射为文本的工作后,分词器介入。它对模型的输出进行后处理,将其格式化为可读的文本。就像是对翻译做最后的修饰,确保其在文本形式中有意义,并遵循语言规则,如正确的空格和标点。
在 Hugging Face Transformers 中,这是一个处理 NLP 任务(如文本分类、语言翻译和语音识别)流行的工具包,Whisper 模型有一个特征提取器和一个分词器,分别命名为 WhisperFeatureExtractor 和 WhisperTokenizer。
我们将分别深入探讨特征提取器和分词器的具体细节。理解这些组件至关重要,因为它们每个都在将语音转换为书面文本的过程中扮演着关键角色。我们将探讨特征提取器如何将原始音频进行微调,以便为模型提供数据,以及分词器如何确保输出文本的准确性和连贯性。这一详细的探讨将让你对 Whisper 模型如何处理语音、将复杂的语音识别任务转化为流畅、高效的过程有更清晰的认识。
我们将回到WhisperFeatureExtractor。现在,先让我们了解一下WhisperTokenizer组件。
加载 WhisperTokenizer
Whisper 分词器帮助将文本标记序列(数字)转换为实际可读的文本。例如,它可以将像[1169, 3797, 3332]这样的序列转换为句子“the cat sat”。
在传统的语音识别模型中,我们使用一种叫做连接主义时间分类(CTC)的方式来解码语音,并且每个数据集都需要一个特定的 CTC 分词器。然而,Whisper 模型采用了不同的架构(编码器-解码器),允许我们直接使用其预训练的分词器。
这个 Whisper 分词器已经在多种语言中进行了训练,使其适用于几乎所有的多语言语音识别任务。例如,如果你在处理印地语,你可以直接加载 Whisper 分词器而无需任何修改。你需要指定你正在使用的语言(例如,印地语)和任务(例如,转录)。这会告诉分词器在处理的序列开头添加特定的语言和任务标记。
这是一个如何加载印地语 Whisper 分词器的示例:
from transformers import WhisperTokenizer
tokenizer = WhisperTokenizer.from_pretrained("openai/whisper-small", language="Hindi", task="transcribe")
你还可以通过将任务更改为translate并将语言设置为目标语言,来将其适应于语音翻译。这将确保分词器为翻译语音添加适当的标记。
为了检查分词器是否正确处理印地语,可以在 Common Voice 数据集中的样本上进行测试。当然,这并不一定意味着分词器能够识别文本的含义。相反,它将文本标记序列(数字)转换为实际可读的文本,指示语言和其他特征。在对语音进行编码时,分词器会在序列的开始和结束添加特殊标记,例如转录的开始/结束标记、语言和任务标记。在解码时,你可以忽略这些独特的标记,以恢复干净、原始的文本字符串。这确保了分词器能够准确处理印地语在语音识别任务中的应用。以下 Python 代码片段展示了一个处理语音数据的基本工作流,适用于使用分词器的语音识别任务——在这种情况下,是在 Common Voice 11 数据集的上下文中:
input_str = common_voice["train"][0]["sentence"]
labels = tokenizer(input_str).input_ids
decoded_with_special = tokenizer.decode(labels, skip_special_tokens=False)
decoded_str = tokenizer.decode(labels, skip_special_tokens=True)
print(f"Input: {input_str}")
print(f"Decoded w/ special: {decoded_with_special}")
print(f"Decoded w/out special: {decoded_str}")
print(f"Are equal: {input_str == decoded_str}")
这是每个步骤的高级解释:
-
提取输入句子:
input_str = common_voice["train"][0]["sentence"]这一行代码从 Common Voice 11 数据集的训练集(
common_voice["train"][0]["sentence"])中提取第一句话。这是一个字典访问模式,其中"train"表示数据集的子集(此例中为训练数据),[0]选择第一条记录,["sentence"]提取句子文本。我们希望处理这个句子进行语音识别。 -
对 输入句子进行分词:
labels = tokenizer(input_str).input_ids分词器将输入字符串转换为一系列的标记。这些标记是句子中单词或子词的数值表示。
input_ids是分词器分配给每个标记的索引,实质上将句子转换为模型可以理解的格式。这个步骤对于准备神经网络处理的文本数据至关重要,因为神经网络需要数值输入。 -
解码标记(包括和不包括 特殊标记):
decoded_with_special = tokenizer.decode(labels, skip_special_tokens=False) decoded_str = tokenizer.decode(labels, skip_special_tokens=True)在这里,解码后的字符串不包含特殊标记。这个版本更接近原始的人类可读句子,因为它去除了与原始文本内容无关的标记。
-
print语句显示原始输入句子、解码后的句子(包括和不包括特殊标记)以及一个布尔值,指示原始句子和解码后的句子(不包括特殊标记)是否相同。这个比较帮助我们检查分词和解词过程的准确性。这是验证分词器在将句子转换为标记后,能够准确地重现原始句子的简单方法,除去处理时使用的任何特殊标记。
这个代码片段展示了在语音识别和处理过程中,如何准备和处理文本数据,使用的是 Common Voice 11 数据集。这个过程是更大工作流的一部分,可能包括将音频转换为文本,处理文本以用于机器学习模型的训练或推理,并评估模型在自动语音识别(ASR)等任务中的表现。理解分词器的作用至关重要,因为它们在原始文本数据和有效模型训练和操作所需的数值格式之间架起了桥梁。
这是你在运行上述代码片段后看到的打印输出:
Input: खीर की मिठास पर गरमाई बिहार की सियासत, कुशवाहा ने दी सफाई
Decoded w/ special:
<|startoftranscript|><|hi|><|transcribe|><|notimestamps|>खीर की मिठास पर गरमाई बिहार की सियासत, कुशवाहा ने दी सफाई<|endoftext|>
Decoded w/out special: खीर की मिठास पर गरमाई बिहार की सियासत, कुशवाहा ने दी सफाई
Are equal: True
通过更好地理解WhisperTokenizer的目的和功能,让我们在下一个里程碑中探索WhisperFeatureExtractor。
里程碑 4 - 将原始语音数据转化为 Mel 频谱特征
语音可以被看作是一个随时间变化的单维数组,数组中的每个点表示声音的响度或振幅。为了理解语音,我们需要捕捉它的频率和声学特征,可以通过分析振幅来实现。
然而,语音是一个连续的声音流,而计算机无法处理无限的数据。因此,我们必须通过在规律的时间间隔对语音进行采样,将这个连续的流转换为一系列离散值。这种采样是以每秒样本数或赫兹(Hz)来衡量的。采样率越高,语音捕捉得越精确,但这也意味着每秒要存储更多的数据。
确保音频的采样率与语音识别模型的要求相匹配是非常重要的。如果采样率不匹配,可能会导致错误。例如,以 8 kHz 播放一个 16 kHz 采样的声音,会使其听起来变慢。以 Whisper 模型为例,它期望的采样率是 16 kHz,因此我们需要确保我们的音频符合这个采样率。否则,我们可能会在失真的音频上训练模型,例如慢动作的语音。
Whisper 特征提取器是一个用于语音识别的工具,它对音频样本做了两件事。首先,它确保所有音频样本的时长恰好为 30 秒。如果样本较短,它会在末尾添加静音以达到 30 秒。如果样本过长,它会将其裁剪为 30 秒。这意味着我们不需要为 Whisper 模型提供注意力掩码,这一点非常独特。通常在音频模型中,你需要提供注意力掩码来标识添加了静音的位置,但 Whisper 能够自行识别。
Whisper 特征提取器做的第二件事是将这些调整后的音频样本转换为log-Mel声谱图。这些是显示声音频率随时间变化的视觉图表,其中不同的颜色代表不同强度的频率。Whisper 模型使用这些图表来理解和处理语音。它们的设计模仿人类的听觉,重点关注对理解语音更为重要的特定频率。
总结来说,在使用语音识别和 Whisper 模型时,确保你的音频样本具有正确的采样率(Whisper 的采样率是 16 kHz)是至关重要的。特征提取器接着会通过添加静音或剪切多余部分,将这些样本标准化为每个 30 秒。最后,它将这些样本转换为 log-Mel 声谱图,声频的可视化表示,Whisper 模型利用这些图表来识别和处理语音。这些步骤对于准确的语音识别至关重要。
幸运的是,Hugging Face Transformers 中的 Whisper 特征提取器只需一行代码就能完成填充和声谱图转换!让我们从预训练检查点加载特征提取器,以便为我们的音频数据做好准备:
from transformers import WhisperFeatureExtractor
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small")
合并创建一个 WhisperProcessor 类
为了方便与特征提取器和分词器一起工作,我们可以将它们组合成一个名为WhisperProcessor的类。这个处理器同时充当WhisperFeatureExtractor和WhisperTokenizer。它可以根据需要在音频输入和模型预测上使用。这样,在训练过程中,我们只需要关注两个主要组件:处理器和模型。以下 Python 代码片段展示了如何为openai/whisper-small模型初始化WhisperProcessor,并特别配置为转录印地语音频:
from transformers import WhisperProcessor
processor = WhisperProcessor.from_pretrained("openai/whisper-small", language="Hindi", task="transcribe")
让我们查看 Common Voice 数据集中的第一条记录,以了解数据格式:
print(common_voice["train"][0])
Print output:
{'audio': {'path': '/home/sanchit_huggingface_co/.cache/huggingface/datasets/downloads/extracted/607848c7e74a89a3b5225c0fa5ffb9470e39b7f11112db614962076a847f3abf/cv-corpus-11.0-2022-09-21/hi/clips/common_voice_hi_25998259.mp3',
'array': array([0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 9.6724887e-07,
1.5334779e-06, 1.0415988e-06], dtype=float32),
'sampling_rate': 48000},
'sentence': 'खीर की मिठास पर गरमाई बिहार की सियासत, कुशवाहा ने दी सफाई'}
在这里,我们看到了一维音频数组和对应的书面转录。请记住,我们的音频采样率必须与 Whisper 模型的采样率(16 kHz)匹配。我们的示例音频以 48 kHz 录制,因此在使用 Whisper 特征提取器之前,必须将其调整为 16 kHz。
我们将使用数据集的cast_column方法将音频转换为合适的采样率。该方法对给定列中的数据应用转换,例如将音频数据重新采样到不同的采样率。当在机器学习任务中处理音频数据集时,这是非常有益的。cast_column方法不会修改原始音频文件;它只是告诉数据集在首次加载音频时改变采样率:
from datasets import Audio
common_voice = common_voice.cast_column("audio", Audio(sampling_rate=16000))
这是打印输出:
{'audio': {'path': '/home/sanchit_huggingface_co/.cache/huggingface/datasets/downloads/extracted/ted/607848c7e74a89a3b5225c0fa5ffb9470e39b7f11112db614962076a847f3abf/cv-corpus-11.0-2022-09-21/hi/clips/common_voice_hi_25998259.mp3',
'array': array([ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,
-3.4206650e-07, 3.2979898e-07, 1.0042874e-06], dtype=float32),
'sampling_rate': 16000},
'sentence': 'खीर की मिठास पर गरमाई बिहार की सियासत, कुशवाहा ने दी सफाई'}
当我们重新加载第一个音频样本时,它将以我们需要的 16 kHz 采样率呈现。
现在,采样率已降至 16 kHz。数组中的值也发生了变化——我们现在大约每三个原来的值对应一个新值。
接下来,让我们编写一个函数,准备我们的数据供模型使用:
def prepare_dataset(batch):
# load and resample audio data from 48 to 16kHz
audio = batch["audio"]
# compute log-Mel input features from input audio array
batch[«input_features"] = feature_extractor(audio["array"], sampling_rate=audio["sampling_rate"]).input_features[0]
# encode target text to label ids
batch[«labels»] = tokenizer(batch[«sentence»]).input_ids
return batch
在前面的代码片段中,我们执行了以下操作:
-
通过调用
batch["audio"]加载并重新采样音频。如前所述,Hugging Face Datasets 将自动重新采样音频。 -
使用特征提取器将一维音频数组转换为 log-Mel 谱图输入特征。
-
使用分词器将转录文本转换为标签 ID。
现在,我们已经定义了prepare_dataset()函数,可以使用数据集的.map方法将该数据准备函数应用于所有训练样本:
common_voice = common_voice.map(prepare_dataset, remove_columns=common_voice.column_names["train"], num_proc=4)
完成了!我们的数据现在已经完全准备好用于训练。接下来我们将讲解如何使用这些数据来微调 Whisper。
注意
目前,数据集使用torchaudio和librosa来处理音频。如果你想自行加载音频或进行采样,可以使用path列找到音频文件的位置,并忽略audio列。
在我们完成合成 WhisperProcessor 的探索,融合特征提取器和标记器为统一的工作流后,我们将过渡到定义训练参数和硬件配置。这一关键的转折点标志着我们为微调的复杂任务做好了准备,强调了选择与我们的学习项目规模和复杂性相匹配的训练参数和硬件配置。
里程碑 5 – 定义训练参数和硬件配置
现在我们的数据已经准备好,我们可以开始训练模型了。我们将使用 Hugging Face Trainer 来帮助完成大部分工作。Hugging Face 的 Trainer 类提供了一个功能完整的训练和评估循环,专为优化 Transformer 的 PyTorch 模型而设计。它支持在多个 GPU/TPU 上进行分布式训练和混合精度,并且提供了大量的可定制选项。Trainer 类抽象了训练循环的复杂性,使用户能够专注于提供训练所需的基本组件,比如模型和数据集。我们需要做的是:
-
设置数据整理器:这个工具将我们准备好的数据转化为模型可以使用的 PyTorch tensors。
-
选择评估指标:我们希望通过 字错误率 (WER) 指标来查看模型的表现。为了进行这个计算,我们将创建一个名为
compute_metrics的函数。 -
加载预训练模型:我们将从一个已经训练好的模型开始,并将其设置为继续训练。由于从头开始训练 Whisper 需要大量的计算资源和数据,这个选项不可行。
-
定义训练参数:这些参数将指导 Hugging Face Trainer 如何训练模型。
在微调模型后,我们将对新的数据进行测试,以确保它能够准确地转录印地语的语音。
设置数据整理器
对于像我们这样的语音模型,数据整理器有点特殊。它分别处理 输入特征 和 标签:特征提取器处理 输入特征,而标记器处理 标签。
输入特征设置为 30 秒,并已转换为固定大小的对数 Mel 频谱图。我们只需要将其转换为分组的 PyTorch tensors。我们可以使用特征提取器的 self.processor.tokenizer.pad 方法,参数设置为 return_tensors="pt" 来完成此操作。由于输入特征已经是固定大小,我们只是将其转换为 PyTorch tensors,而不添加额外的填充。
然而,标签仍然需要进行填充。首先,我们必须将标签填充到我们批次中的最长长度,使用 self.processor.tokenizer.pad 方法。我们将填充标记替换为 -100,以避免它们影响损失计算。我们还需要从标签序列的开头删除转录起始标记,因为我们将在训练期间将其重新添加回来。
我们可以使用之前定义的WhisperProcessor类来处理特征提取和分词任务:
import torch
from dataclasses import dataclass
from typing import Any, Dict, List, Union
@dataclass
class DataCollatorSpeechSeq2SeqWithPadding:
processor: Any
def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]:
# split inputs and labels since they have to be of different lengths and need different padding methods
# first treat the audio inputs by simply returning torch tensors
input_features = [{"input_features": feature["input_features"]} for feature in features]
batch = self.processor.feature_extractor.pad(input_features, return_tensors="pt")
# get the tokenized label sequences
label_features = [{"input_ids": feature["labels"]} for feature in features]
# pad the labels to max length
labels_batch = self.processor.tokenizer.pad(label_features, return_tensors="pt")
# replace padding with -100 to ignore loss correctly
labels = labels_batch["input_ids"].masked_fill(labels_batch.attention_mask.ne(1), -100)
# if bos token is appended in previous tokenization step,
# cut bos token here as it's append later anyways
if (labels[:, 0] == self.processor.tokenizer.bos_token_id).all().cpu().item():
labels = labels[:, 1:]
batch["labels"] = labels
return batch
现在,让我们实例化刚才定义的数据整理器:
data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor=processor)
里程碑 6 - 为性能基准测试建立标准化的测试集和度量标准
现在,让我们学习如何检查模型的性能。我们将使用 WER(词错误率)指标,这是评估语音识别系统的常用方法。我们将从 Hugging Face evaluate加载 WER 指标:
import evaluate
metric = evaluate.load("wer")
接下来,我们将创建一个名为compute_metrics的函数来计算 WER:
def compute_metrics(pred):
# [Code to replace -100, decode predictions and labels, and compute WER]
return {"wer": wer}
这个函数修复了我们的label_ids(我们将填充 token 替换为-100)。然后,它将预测的 ID 和标签 ID 转化为文本字符串。最后,它计算这两者之间的 WER。
加载预训练模型检查点
我们将从一个预训练的 Whisper 模型开始。这在 Hugging Face Transformers 中很容易实现:
from transformers import WhisperForConditionalGeneration
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
该模型有一些设置需要我们调整以进行训练。我们将特定的 tokens 设置为None,并确保没有 tokens 被抑制:
model.config.forced_decoder_ids = None
model.config.suppress_tokens = []
定义训练参数
我们必须定义训练细节,例如模型保存的位置、检查性能的频率以及其他设置。这里有一个特别的类叫做Seq2SeqTrainingArguments,用于明确声明训练参数。这里解释了一部分参数:
-
output_dir:保存模型权重的本地目录。这也将是 Hugging Face Hub 上的仓库名称(huggingface.co/)。 -
generation_max_length:在评估期间,自回归生成的最大 token 数量。 -
save_steps:在训练过程中,每经过save_steps步训练,中间检查点将被保存并异步上传到 Hub。 -
eval_steps:在训练过程中,每经过eval_steps步训练,就会执行一次中间检查点。 -
report_to:用于保存训练日志的地方。支持的平台有azure_ml、comet_ml、mlflow、neptune、tensorboard和wand。选择你喜欢的平台,或者将其保留为tensorboard以便将日志记录到 Hub 中。
欲了解更多其他训练参数的详细信息,请参阅Seq2SeqTrainingArguments文档(huggingface.co/docs/transformers/v4.40.1/en/main_classes/trainer#trainer)。
以下代码片段展示了如何声明Seq2SeqTrainingArguments及其部分参数。你可以在本书 GitHub 仓库中的 Python 笔记本中找到完整的工作示例:
from transformers import Seq2SeqTrainingArguments
training_args = Seq2SeqTrainingArguments(
output_dir="./whisper-small-hi",
per_device_train_batch_size=16,
gradient_accumulation_steps=1,
learning_rate=1e-5,
warmup_steps=500,
max_steps=4000,
gradient_checkpointing=True,
fp16=True,
evaluation_strategy="steps",
per_device_eval_batch_size=8,
predict_with_generate=True,
generation_max_length=225,
save_steps=1000,
eval_steps=1000,
logging_steps=25,
report_to=["tensorboard"],
load_best_model_at_end=True,
metric_for_best_model="wer",
greater_is_better=False,
hub_model_id = "your-huggingface-id/whisper-small-hi",
push_to_hub=True,
)
注意
如果你不想将模型上传到 Hub,可以将push_to_hub=False。
我们将这些训练细节提供给 Hugging Face Trainer,并与我们的model、dataset、data collator以及compute_metrics函数一起使用:
from transformers import Seq2SeqTrainer
trainer = Seq2SeqTrainer(
# [Details of the trainer setup]
trainer = Seq2SeqTrainer(
args=training_args,
model=model,
train_dataset=common_voice["train"],
eval_dataset=common_voice["test"],
data_collator=data_collator,
compute_metrics=compute_metrics,
tokenizer=processor.feature_extractor,
)
通过强大的模型性能评估指标和定义明确的透明训练过程,我们现在将重点关注实际实现——在利用已配置的超参数、数据集和硬件的基础上,执行优化的训练循环。
里程碑 7 – 执行训练循环
要开始训练,只需运行以下命令:
trainer.train()
图 4.1 显示了你可以期望从 trainer.train() 命令执行中看到的输出示例:

图 4.1 – Google Colab 中 trainer.train() 的示例输出
每个训练批次都将包含一个评估步骤,计算并显示训练/验证损失和 WER 指标。根据你的 GPU,训练可能需要 5 到 10 小时。如果遇到内存问题,尝试减小批量大小,并在 Seq2SeqTrainingArguments 的声明中调整 gradient_accumulation_steps。
由于我们在声明 Seq2SeqTrainingArguments 时设定的参数,我们的模型指标和性能将在每次训练迭代后推送到 Hugging Face Hub。驱动推送到 Hub 的关键参数如下所示:
from transformers import Seq2SeqTrainingArguments
training_args = Seq2SeqTrainingArguments(
[… previous parameters here]
report_to=["tensorboard"],
load_best_model_at_end=True,
metric_for_best_model="wer",
greater_is_better=False,
hub_model_id = "your-huggingface-id/whisper-small-hi",
push_to_hub=True,
)
以下截图展示了如何导航到 Hugging Face TensorBoard,并展示了我的某个微调模型的指标面板示例:

图 4.2 – 在 Hugging Face 仓库中,选择“训练指标”以显示 TensorBoard

图 4.3 – Hugging Face TensorBoard 中一些指标的示例
成功训练后,任何人都可以通过 Hugging Face Hub 访问并使用你的模型。他们可以通过 Hub 的链接加载模型,或使用 your-hugging-face-id/the-name-you-picked 标识符加载模型。以下是加载模型的示例:
from transformers import WhisperForConditionalGeneration, WhisperProcessor
model = WhisperForConditionalGeneration.from_pretrained("jbatista79/whisper-small-hi")
processor = WhisperProcessor.from_pretrained("jbatista79/whisper-small-hi")
尽管我们微调的模型在 Common Voice Hindi 测试数据上表现良好,但它并不完美。本指南旨在展示如何在多语言的任何语音识别数据集上微调预训练的 Whisper 模型。通过调整训练设置,如学习率和 dropout,或使用更大的预训练模型(例如中型或大型版本),你可能会获得更好的结果。
在优化的训练过程完成并且我们的微调模型上传后,我们将过渡到评估我们增强的语音识别能力在现实世界中的有效性。我们将通过在不同数据集上进行性能基准测试,验证我们定制的 Whisper 模型在语言、领域和声学环境中的泛化能力。
里程碑 8 – 在数据集之间评估性能
在结束 Whisper 微调之旅时,验证模型在各种真实世界条件下的表现是一个关键的最终里程碑。在将我们的优化语音识别器投入生产环境之前,全面评估其在不同数据集、语言、口音和声学环境中的有效性对于增强信心至关重要。这一测试阶段揭示了模型的实际能力,揭示了可能需要额外调整的地方,同时突出了适合立即应用的领域。本节中概述的严格评估过程旨在验证定制的性能提升,同时通过涵盖偏见缓解、领域优化、翻译能力和期望管理等关键方面,指导伦理和包容性部署。
减少人口统计偏见
机器学习模型,包括语音识别模型,有时会检测到对某些性别、种族或年龄群体的偏见。这是因为它们学习的音频数据在不同群体之间可能差异很大。为防止这种情况,我们必须用广泛的数据来训练模型,并使用独特的方法来检查偏见。
我们应该仔细检查模型在哪些群体中可能表现更好。这将帮助我们了解哪些群体可能需要模型提供更多支持。我们还可以改变模型学习的数据,看看它是否对不同的群体表现不同。这将帮助我们找出不公平现象的真正原因。
发现问题还不够,我们还需要向模型中添加多样化的数据。这意味着需要从多个不同来源获取数据,尤其是那些之前未被充分包含的数据。我们可以使用网页抓取等方法来寻找新的语音数据。我们还可以创建人工语音,但必须小心并且在这方面保持透明。
我们需要小心避免过度修正并创造出新的问题。我们的目标是改善每个人的模型。我们可以通过对不同群体进行平等测试,确保它适用于所有人,从而实现这一目标。
我们应该致力于使用语言技术来团结人们,而不是将人们分开。我们应该专注于开发公平且对每个人都有帮助的语音技术。这意味着我们需要不断检查和改进我们的模型,以确保它们对所有不同群体都公平且有帮助。
优化内容领域
虽然 Whisper 的广泛预训练提供了丰富的语言能力,但将其知识针对特定领域进行定制对竞争性的企业应用至关重要。呼叫中心、律师事务所、金融经纪人、远程医疗服务商——语音识别已经渗透到各个行业,每个行业都有其独特的挑战。除了词汇量,准确建模非语言提示、话语模式和微妙的暗示也在特定领域的上下文理解中起着基础性作用。
然而,现成的自动语音识别(ASR)系统常常在面对专业术语时碰壁,并且难以传达隐含的层次化意义。例如,在法律语境中,精确理解条款具有重要意义。仅用通用数据集训练的模型无法提炼出这些专业含义。因此,将系统暴露于特定领域的数据对于注入领域上下文掌握至关重要。
领域优化的核心在于术语掌握。法律、医学和金融等领域涉及大量的特殊词汇,这些词汇塑造了具体任务的能力。然而,仅仅依靠术语表无法概括专家词典中编码的层次化语义。
一种选择是采用显式语义分析(ESA),这是一种通过数学表示人类语言意义的计算方法。ESA 是从大量文本语料库中衍生出的高维概念空间,广泛应用于自然语言处理和信息检索。
简单来说,ESA 是一种通过将文本与其已经分析过的大量文本数据进行对比,帮助计算机理解文本含义的方法。它通过将文本映射到一个由大量文本数据衍生的概念或主题集来实现这一点。这种映射发生在一个高维空间中,其中每个维度代表不同的概念或主题。
例如,如果文本关于“狗”,ESA 可能会将其映射到“动物”、“宠物”、“犬类”等概念上。通过这样做,ESA 可以理解文本的语义,这些语义可以用于信息检索、文本分类等任务。ESA 的好处在于它能够捕捉文本的意义,即使使用的词汇不同。例如,可以理解“狗”和“犬类”指的是相同的概念,尽管这两个词不同。这使得它成为理解和处理自然语言的强大工具。
管理用户期望
负责任地使用 AI 语音识别技术需要确保用户理解该技术的能与不能。对技术的能力和局限性保持透明至关重要,这样人们才能做出关于是否使用它的明智选择。对于那些可能缺乏数字经验的人来说,这一点尤为重要。
有效地传达技术能力有助于建立信任。这可以通过易于理解的总结和解释来实现,针对特定用户需求进行阐述,而不会让他们感到过于复杂。诸如模型置信度评分和可视化工具可以帮助用户评估技术预测的可靠性,使其在何时何种情况下最佳使用更加透明。
公开技术的局限性同样重要。认识到局限性并非失败的标志,而是成长和改进的机会。例如,Whisper 在嘈杂环境中的实时识别可能存在困难,这应被视为通过协作努力解决的挑战,而不是永久的缺陷。
听取用户反馈并将其纳入技术改进至关重要,以便为每个人提升语音识别技术。定期检查技术在实际应用中的表现,有助于防止它偏离用户需求。通过让用户参与这个过程,我们能够专注于解决最紧迫的问题,并更高效地进行改进。
里程碑 9 – 构建展示定制语音识别的应用程序
现在我们的模型已经完成微调,让我们展示它在语音识别(ASR)方面的表现!我们将使用 Hugging Face Transformers 流水线来处理所有的工作,从准备音频到解码模型所认为音频的内容。为了展示,我们将使用Gradio,一个让构建机器学习演示变得超级简单的工具。你只需要几分钟就能用 Gradio 创建一个演示!
这里是 Gradio 演示的一个示例。在这个演示中,你可以使用电脑麦克风录音,然后经过微调的 Whisper 模型会将其转录成文本:
from transformers import pipeline
import gradio as gr
pipe = pipeline(model="jbatista79/whisper-small-hi") # change to "your-username/the-name-you-picked"
def transcribe(audio):
text = pipe(audio)["text"]
return text
iface = gr.Interface(
fn=transcribe,
inputs=gr.Audio(source="microphone", type="filepath"),
outputs="text",
title="Whisper Small Hindi",
description="Realtime demo for Hindi speech recognition using a fine-tuned Whisper small model.",
)
iface.launch()
这是输出结果:

图 4.4 – Hugging Face 中微调 Whisper 模型的 Gradio 用户界面示例
使用麦克风录制音频,直接从 Google Colab 测试模型;然后点击Namaste,它会被完美地转录为印地语单词नामास्ते。
总结
随着我们进入 OpenAI Whisper 技术的细节,我们的探索已经超越了理论的讨论,变成了一个实际的体验过程,赋予了你微调 Whisper 以满足特定领域和语言需求的能力,并帮助你克服语音识别技术中固有的挑战。
我们从建立一个强大的 Python 环境的基础工作开始,通过整合诸如 Common Voice 等多语言数据集,增强了 Whisper 的知识。这一步至关重要,因为它扩展了 Whisper 的语言广度,并为后续的微调过程奠定了基础。
本章的核心围绕着将 Whisper 的预测结果调整得与目标应用完美对接。你已经学会了如何调整置信度、输出类别和时间限制,以便在特定用例中匹配预期结果。你在这里获得的知识非常宝贵,尤其是在处理专业术语和多样化语言数据集时。
我们的大部分努力都集中在通过简明的测试跟踪进展。我们设立了固定的基准,客观地衡量不同语言和使用场景中的进展,确保我们的微调工作是有根据的,并且没有数据偏差。
我们讨论的一个关键方面是技术的伦理使用。我们强调了确保跨人口群体实现公平表现的必要性,确保语音技术的进步不会无意中排除那些处于不利地位的群体。
如你所见,微调 Whisper 涉及对其架构和训练方法的深入探讨。你已经了解了如何处理不同语言,如何为各种内容领域优化 Whisper,以及如何平衡准确性和效率。我们还解决了诸如人口偏差、技术和语言障碍以及快速适应新词汇的挑战。
此外,我们还讨论了管理用户期望,这是部署 AI 技术的一个重要方面。必须透明地说明技术能做什么以及其局限性,确保用户能够做出明智的决策并对其产生信任。
展望本书的下一部分,第三部分 - 现实世界的应用和使用案例,我们即将踏上新的冒险旅程。在这里,我们将探索如何在各个行业中有效地应用 Whisper,并将其整合到实际场景中。你将发现如何在医疗保健和语音辅助技术等领域中利用 Whisper,并运用你在本章中获得的技能和知识,在自动语音识别(ASR)中产生实际影响。
因此,让我们继续带着本章的知识和经验,看看如何以多种有影响力的方式应用 Whisper。旅程仍在继续,可能性既令人兴奋又无限。
第三部分:现实世界的应用和使用案例
在本部分中,你将探索 OpenAI 的 Whisper 在现实世界中的多种应用场景,学习如何将这一强大工具有效地整合到不同的环境中。从转录服务、语音助手到无障碍功能和客户服务,你将深入了解如何利用 Whisper 的功能来提升多个行业。你还将深入学习一些高级技术,如量化、实时语音识别和说话人分离,使用WhisperX和 NVIDIA 的 NeMo 框架。此外,你将发现如何利用 Whisper 进行个性化语音合成,创建捕捉目标声音特征的独特语音模型。最后,本部分将提供一个前瞻性的视角,探讨自动语音识别(ASR)和语音技术的不断发展,讨论预期的趋势、伦理考量以及如何为未来做好准备。
本部分包括以下章节:
-
第五章**,在不同情境中应用 Whisper
-
第六章**, 用 Whisper 扩展应用
-
第七章**, 探索高级语音功能
-
第八章, 使用 WhisperX 和 NVIDIA 的 NeMo 进行语音标注
-
第九章**, 利用 Whisper 进行个性化语音合成
-
第十章, 用 Whisper 塑造未来
第五章:在各种环境中应用 Whisper
欢迎来到 第五章,在这里我们探索 OpenAI 的 Whisper 在将口语转化为书面文本方面的卓越能力。在探讨包括转录服务、语音助手、聊天机器人和辅助功能等多个应用时,你将深入了解 Whisper 在这些领域中的关键作用。
首先,我们将探讨转录服务,并研究 Whisper 如何简化音频文件(如会议和采访)的文本转换。它的准确性和效率减少了手动转录的需求,使其成为一项不可或缺的工具。
此外,我们将深入探讨 Whisper 在语音助手和聊天机器人中的集成,提升它们的响应能力和用户互动。通过将语音命令转换为文本,Whisper 将这些技术提升到新的互动水平。
关于辅助功能,本章突出了 Whisper 对听力或语言障碍人士工具的贡献。其 语音转文本 功能不仅提供了实用的解决方案,还丰富了用户体验。
本章将涵盖以下主题:
-
探索转录服务
-
将 Whisper 集成到语音助手和聊天机器人中
-
使用 Whisper 增强辅助功能
本章结束时,你将全面了解如何在各种环境中有效应用 Whisper。你将学习最佳的设置和优化实践,发现创新的使用案例,并理解实施这项技术时的伦理考量。有了这些知识,你将能够充分利用 Whisper 的潜力,在不同领域提升数字体验。
让我们从深入探索通过 Whisper 进行转录的创新世界开始,揭示这项前沿技术如何重塑我们将口语转化为书面文本的方式,提高效率和准确性,适用于各种专业和个人环境。
技术要求
为了利用 OpenAI 的 Whisper 实现高级应用,本章采用 Python 和 Google Colab,以便于使用和提高可访问性。Python 环境设置包括用于转录任务的 Whisper 库。
关键要求:
-
Google Colab 笔记本:这些笔记本设置为使用最低要求的内存和容量运行我们的 Python 代码。如果可用,选择 T4 GPU 运行时类型以获得更好的性能。
-
Python 环境:每个笔记本都包含加载所需 Python 库的指令,包括 Whisper 和 Gradio。
-
Hugging Face 账户:一些笔记本需要 Hugging Face 账户和登录 API 密钥。Colab 笔记本中包含了关于这一主题的信息。
-
麦克风和扬声器:一些笔记本实现了一个带有语音录制和音频播放功能的 Gradio 应用程序。连接到您计算机的麦克风和扬声器可能有助于您体验互动语音功能。另一种选择是通过 Gradio 在运行时提供的 URL 链接在手机上打开;在该链接中,您可能可以使用手机的麦克风录制您的声音。
-
GitHub 仓库访问:所有 Python 代码,包括示例,均可在本章的 GitHub 仓库中找到(
github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter05)。这些 Colab 笔记本可以直接运行,为学习提供了实用的动手实践方式。
通过满足这些技术要求,您将为在不同环境中探索 Whisper 做好准备,同时享受 Google Colab 提供的流畅体验以及 GitHub 上的全面资源。
探索转录服务
从捕捉头脑风暴会议的微妙差异到记录关键访谈,转录服务架起了语言的短暂性与文字的永久性之间的桥梁。在本节中,我们将揭示 Whisper 的先进技术与日益增长的转录需求之间复杂的互动。这一部分为您奠定了基础知识,展示了 Whisper 如何利用其编码器-解码器变换器模型,以卓越的精度应对各种音响环境、口音和方言。然而,它也不回避讨论当前的局限性以及充满活力的社区努力,以推动其进一步发展。
我们还将从理论过渡到实践。从安装依赖项到运行模型,本章将使您掌握将音频文件转化为准确文本转录的知识,确保 Whisper 的表现得到优化,确保转录内容准确无误,并无缝整合到各种应用程序中,从字幕生成到详细内容分析。
本节结束时,您将掌握 Whisper 在转录服务中的重要作用,并具备有效利用其功能的知识。这段旅程是开启数字领域中声音潜力的道路,使信息更易获取,并在各个领域提升沟通效率。
理解 Whisper 在转录服务中的作用
理解 Whisper 在转录服务中的作用,需要深入探索其能力、局限性以及在各类应用中的整合潜力。在这一探索过程中,我们不仅会欣赏 Whisper 的技术实力,还会考虑其在转录领域的实际应用影响。
Whisper 的架构是一个编码器-解码器变压器模型,擅长处理各种音频输入。Whisper 通过将音频转换为 log-Mel 频谱图并按 30 秒的时间段处理,确保每个语音片段都得到关注。这种细致的音频处理方法是 Whisper 在转录中高准确率的原因之一。
Whisper 对口音、背景噪声和技术性语言的强大适应性尤为值得注意。在转录服务中,这些因素通常是影响准确性和可靠性的“祸根”。Whisper 在这些领域的抗干扰能力意味着它能够在多种声学条件下提供高质量的转录,对于需要精确口语内容文档的企业和个人来说具有不可估量的价值。
尽管 Whisper 在转录方面表现出色,但需要注意的是它在讲话者分离(即区分音频文件中的不同说话者)方面的局限性。然而,Whisper 的社区正在积极探索增强其功能的方法,例如将其与其他模型(如Pyannote)结合进行说话人识别。在接下来的章节中,我们将进一步了解讲话者分离和 Pyannote。此外,Whisper 的单词级时间戳功能是一个重要的进步,允许用户将转录文本与音频同步,这对于字幕制作和详细内容分析等应用至关重要。
Pyannote 简介
Pyannote 是一个开源工具包,专为讲话者分离设计,这一过程对于通过识别每个发言的时间和发言者来分析对话至关重要。Pyannote 由 Hervé Bredin 开发,利用 PyTorch 机器学习框架提供可训练的端到端神经组件。这些组件可以组合并联合优化,以构建讲话者分离流水线。pyannote.audio是该工具包的一个组成部分,提供了包括语音活动检测 (VAD)、讲话者分割、重叠语音检测和讲话者嵌入等多个领域的预训练模型和流水线。在大多数这些领域,它都达到了最先进的性能。
在讲话者分离的背景下,Pyannote 与 OpenAI Whisper 的关系是互补的。Pyannote 可以执行讲话者分离任务,识别音频文件中的不同说话者,而 Whisper 可以进行转录。这种协同作用使得创建更详细且有价值的转录成为可能,其中包含了讲话者标签,从而增强了对话分析。然而,整合这两个系统可能比较复杂,且并非总能产生理想的结果,正如一些用户所指出的。
尽管存在这些挑战,将 Pyannote 的讲话者分离能力与 Whisper 的转录能力相结合,代表了语音分析的强大工具,特别是在需要准确识别讲话者的情况下。
从商业角度来看,转录服务的成本是一个关键因素。如果使用 OpenAI 的 API,Whisper 每分钟音频的定价为 0.006 美元,使其成为企业在不承担过高成本的情况下引入转录服务的一个有吸引力的选择。当然,Whisper 也可以通过开源获得。这种价格实惠和高准确性的结合,使 Whisper 成为转录市场中的颠覆性力量。
Whisper API 的文件大小限制为 25 MB,这是开发者在将模型集成到应用程序时需要考虑的因素。尽管这对于较长的音频文件可能带来挑战,但社区已经提出了绕过这一限制的策略,例如拆分音频文件和使用压缩格式。API 的易用性以及实时转录的潜力,进一步增强了 Whisper 作为开发者工具的吸引力。
OpenAI 决定开源 Whisper,催生了创新和定制化的进程。通过提供模型代码和权重的访问权限,OpenAI 使得开发者社区能够调整和扩展 Whisper 的功能。这引领了人工智能的模块化未来,像 Whisper 这样的工具将成为许多应用的基础构件。
展望未来,Whisper 在转录服务中的角色将变得更加重要。随着模型的不断演进以及其周围社区的成长,我们可以预见在说话人分离、语言支持以及其他领域的进展。Whisper 的开源性质确保它将始终处于创新的前沿,由一个协作努力推动,不断完善其转录能力。这为我们接下来的讨论主题奠定了基础:设置 Whisper 用于转录任务,在这里我们将深入探讨如何利用 Whisper 的能力,满足转录需求的实际步骤和注意事项。
设置 Whisper 用于转录任务
设置 Whisper 用于转录任务包括多个步骤,其中包括安装依赖项、安装 Whisper 和运行模型。可以使用书籍 GitHub 仓库中的 LOAIW_ch05_1_setting_up_Whisper_for_transcription.ipynb Google Colab 笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter05/LOAIW_ch05_1_setting_up_Whisper_for_transcription.ipynb) 获取更全面的实践实现。在该笔记本中,我们将逐步讲解从准备环境、下载示例音频到使用 Whisper 进行转录的全过程。下图描述了整体步骤:

图 5.1 – 设置 Whisper 用于转录任务
图 5.1 描述了笔记本中的逐步方法,确保你在使用 Whisper 时建立了扎实的基础,从基本设置到探索高级转录技术。我鼓励你从 GitHub 仓库中找到并运行整个笔记本。以下是一些高层步骤和部分代码片段,供你参考:
-
安装必要的依赖项:我们首先设置环境并安装关键包:
!sudo apt install ffmpeg !pip install -q cohere openai tiktoken ffmpeg is used for audio file manipulation. The cohere and openai Python libraries offer various AI models for tiktoken is required as a supporting library for authentication or token handling in the context of API requests. We also installed the latest Whisper files from the official OpenAI GitHub repository. These steps ensure we have all the tools ready for our transcription tasks. -
下载音频样本:接下来,我们从 GitHub 仓库和 OpenAI 的 内容分发网络(CDN)下载多种音频样本,包括英语和西班牙语。这些样本将作为我们的测试用例,帮助我们探索 Whisper 在不同语言中的转录能力。
-
验证计算资源:我们检查 GPU 的可用性,以确保高效处理。Whisper 的性能显著受益于 GPU 加速,因此我们配置环境以在 GPU 可用时使用它:
import numpy as np import torch torch.cuda.is_available() DEVICE = "cuda" if torch.cuda.is_available() else "cpu" print(f"Using torch {torch.__version__} ({DEVICE})") -
"medium"大小的多语言模型,选择适合我们需求的特定配置:import whisper model = whisper.load_model("medium", device=DEVICE) print( f"Model is {'multilingual' if model.is_multilingual else 'English-only'} " f"and has {sum(np.prod(p.shape) for p in model.parameters()):,} parameters." ) -
设置自然语言工具包 (NLTK) 进行文本处理:我们安装并配置 NLTK 以增强转录的可读性。NLTK 帮助将转录文本分割,使其更易阅读和理解。
-
OpenAI 的
whisper.DecodingOptions()函数用于指定控制解码过程行为的各种选项,当转录音频时使用。DecodingOptions函数中的参数允许用户指定诸如转录语言、是否包含时间戳,以及是否将DecodingOptions与whisper.decode()函数结合使用等选项:for audiofile in audiofiles: # Load audio and pad/trim it to fit 30 seconds audio = whisper.load_audio(audiofile) audio = whisper.pad_or_trim(audio) # Make log-Mel spectrogram and move to the same device as the model mel = whisper.log_mel_spectrogram(audio).to(model.device) #Next we detect the language of your audio file _, probs = model.detect_language(mel) detected_language = max(probs, key=probs.get) print(f"----\nDetected language: {detected_language}") # Set up the decoding options options = whisper.DecodingOptions(language=detected_language, without_timestamps=True, fp16=(DEVICE == "cuda")) # Decode the audio and print the recognized text result = whisper.decode(model, mel, options)在这个例子中,
DecodingOptions函数设置了三个选项:-
language=detected_language:此选项指定转录的语言。如果你提前知道语言并希望依赖其他方式而非模型的自动语言检测,设置语言可以提高转录准确性。 -
without_timestamps=True:当设置为True时,表示转录不包括时间戳。如果需要每个单词或句子的时间戳,则应将此选项设置为False。 -
fp16=(DEVICE == "cuda"):此选项决定是否使用 FP16(16 位浮动精度)进行解码。(DEVICE == "cuda")评估检查 CUDA 是否可用。在笔记本的早期,我们使用DEVICE = "cuda" if torch.cuda.is_available() else "cpu"来设置DEVICE。然后,如果DEVICE为"cuda",则将fp16设置为True,表示计划在 GPU 上运行模型。如果DEVICE为"cpu",则将fp16设置为False,以确保兼容性并避免不必要的警告或错误。
这些选项可以根据你的转录任务的具体要求进行调整。例如,如果你转录的是另一种语言的音频,你会相应地更改语言选项。如果你需要优化性能,且你的硬件支持,你可以启用
fp16来使用半精度。FP16(16 位浮动点数)计算在兼容的 GPU 上非常有利,因为它可以显著减少内存使用,并且可能提高计算速度,而不会对模型的准确性造成实质性影响。然而,并非所有 CPU 都支持 FP16 计算,尝试在 CPU 上使用它可能会导致错误或回退到 FP32(单精度浮动点数)计算。 -
-
定义一个简化转录的函数:我们介绍了一个自定义函数来简化转录过程。这个函数简化了处理多个文件的流程,并且我们探索了如何在其中加入翻译选项,从而增强其功能:
def process_file(audiofile, model, w_options, w_translate=False): # Load audio audio = whisper.load_audio(audiofile) transcribe_options = dict(task="transcribe", **w_options) translate_options = dict(task="translate", **w_options) transcription = model.transcribe(audiofile, **transcribe_options)["text"] if w_translate: translation = model.transcribe(audiofile, **translate_options)["text"] else: translation = "N/A" return transcription, translation -
process_file()函数来转录非英语音频样本。这个示例展示了 Whisper 在全球范围内对多语言的强大支持,展示了其在全球化环境中的有效性。w_options = dict(without_timestamps=True, fp16=(DEVICE == "cuda")) audiofile = 'Learn_OAI_Whisper_Spanish_Sample_Audio01.mp3' transcription, translation = process_file(audiofile, model, w_options, False) print("------\nTranscription of file '" + audiofile + "':") for sent in sent_tokenize(transcription): print(sent) print("------\nTranslation of file '" + audiofile + "':") for sent in sent_tokenize(translation): print(sent) import ipywidgets as widgets widgets.Audio.from_file(audiofile, autoplay=False, loop=False) -
initial_prompt参数以及调整设置如温度。我们将研究两种方法,通过使用initial_prompt来优化转录输出,特别是针对那些拼写模糊或具有专门术语的音频:-
initial_prompt参数。在面对一个常见挑战时,这种方法非常有用:准确转录不常见的专有名词,如产品名称、公司名称或个人姓名。这些元素常常会让即便是最先进的转录工具也犯错,导致拼写错误。如果没有initial_prompt值的简单转录,结果如下:------ Transcription of file 'product_names.wav': Welcome to Quirk, Quid, Quill, Inc., where finance meets innovation. Explore diverse offerings from the P3 Quattro, a unique investment portfolio quadrant to the O3 Omni, a platform for intricate derivative trading strategies. Delve into unconventional bond markets with our B3 Bond X and experience non-standard equity trading with E3 Equity. Surpass your wealth management with W3 Rap Z and anticipate market trends with the O2 Outlier, our forward-thinking financial forecasting tool. Explore venture capital world with U3 Unifund or move your money with the M3 Mover, our sophisticated monetary transfer module. At Quirk, Quid, Quill, Inc., we turn complex finance into creative solutions. Join us in redefining financial services.
This results in the following:
------ 转录文件 'product_names.wav': 欢迎来到 Quirk Quid Quill Inc.,在这里,金融与创新交汇。 探索多样化的产品,包括 P3-Quattro,一个独特的投资组合象限,和 O3-Omni,一个复杂衍生品交易策略平台。 深入探索非常规债券市场,使用我们的 B3-BondX,并体验 E3-Equity 的非标准股票交易。 超越财富管理,使用 W3-WrapZ,并通过我们的前瞻性金融预测工具 O2-Outlier 预判市场趋势。 探索风险投资世界,使用 U3-UniFund,或通过我们的 M3-Mover 模块转移资金,这是一个精密的货币转移工具。 在 Quirk Quid Quill Inc.,我们将复杂的金融问题转化为创造性的解决方案。 `initial_prompt`参数非常重要。如果没有`initial_prompt`,Whisper 会在处理专有名词时遇到困难,导致拼写错误,例如“Quirk, Quid, Quill, Inc.”,“P3 Quattro”,“O3 Omni”,“B3 Bond X”,“E3 Equity”,“W3 Rap Z”,“O2 Outlier”,“U3 Unifund”和“M3 Mover”。然而,在`initial_prompt`参数中包含正确的拼写后,Whisper 成功地将这些术语转录为“Quirk Quid Quill Inc.”,“P3-Quattro”,“O3-Omni”,“B3-BondX”,“E3-Equity”,“W3-WrapZ”,“O2-Outlier”,“U3-UniFund”和“M3-Mover”。这展示了`initial_prompt`参数的强大作用,能够引导 Whisper 产生更准确的转录,特别是在处理不常见或复杂术语时。* `initial_prompt`参数。最有效的方法是创建并提供一个实际的或虚构的提示,以通过确保拼写、风格或术语来引导 Whisper。为了说明第二种方法,我们将转向为本练习专门制作的另一个音频片段。场景是一次不同寻常的烧烤活动。我们的第一步是使用 Whisper 生成一个基准转录,以评估其初步准确性。没有`initial_prompt`值的简单转录结果如下: ```py ------ Transcription of file 'bbq_plans.wav': Hello, my name is Preston Tuggle. I am based in New York City. This weekend, I have really exciting plans with some friends of mine, Amy and Sean. We're going to a barbecue here in Brooklyn. Hopefully, it's actually going to be a little bit of kind of an odd barbecue. We're going to have donuts, omelets. It's kind of like a breakfast as well as whiskey. So that should be fun. And I'm really looking forward to spending time with my friends, Amy and Sean. This results in the following:
文件'bqq_plans.wav'的转录:
你好,我叫普雷斯顿·塔格尔。
我住在纽约市。
这个周末我有一些非常令人兴奋的计划,要和我的朋友 Aimee 和 Shawn 一起度过。
我们要去布鲁克林的烧烤聚会。
希望这实际上会是一场有点奇怪的烧烤聚会。
我们要吃甜甜圈,煎蛋卷。
它有点像早餐,也像威士忌。
所以那应该会很有趣。
在提供虚构的提示后,
initial_prompt和第二次输出,我们得到了更精确的结果(例如,“Aimee 和 Shawn”而不是“Amy 和 Sean”,“doughnuts”而不是“donuts”,“BBQ”而不是“barbeque”,“whisky”而不是“whiskey”)。 -
当你在笔记本中运行单元时,每个部分都会在前一个部分的基础上构建,逐步介绍使用 Whisper 的更复杂功能和技术。这种结构化的方式有助于为转录任务设置 Whisper,并探索提高转录准确度的策略,以适应各种音频内容。
理解 Whisper 的initial_prompt的超能力和局限性
OpenAI 的 Whisper 中的initial_prompt参数是一个可选的文本提示,用于在转录第一个音频窗口时为模型提供上下文。以下是关于initial_prompt需要理解的关键内容:
initial_prompt用于在模型开始转录音频之前,为其提供相关的上下文。这有助于提高转录的准确性,特别是在涉及专业词汇或特定写作风格时。
initial_prompt 只影响正在转录的音频的第一个片段。对于较长的音频文件,如果被拆分成多个片段,那么在音频的前 30-90 秒之后,它的影响可能会减弱。对于较短的音频,手动分割或拆分音频并应用 initial_prompt 参数是一种克服这一限制的选择。对于较大的脚本,分割过程可以自动化。也可以选择进行一些后处理调整,包括将整个转录本传递给一个更复杂提示的 LLM。
initial_prompt。文档中似乎对使用前 224 个令牌还是后 224 个令牌存在不一致的描述,但无论哪种情况,超出该限制的部分都会被忽略。
initial_prompt 不一定要是一个实际的转录文本。可以创建虚构的提示来引导 Whisper,使用准确的拼写、风格或术语等。包括拼写指南或通过 GPT-3 生成提示等技术都可以有效地发挥作用。
initial_prompt 参数不同于 prompt 参数,后者为当前片段提供之前转录片段的上下文,有助于在较长的音频文件中保持一致性。
initial_prompt 参数是一种将相关上下文提前提供给 Whisper 以提高转录准确性的方法。然而,它的影响仅限于音频的开始部分,并且受限于令牌数量。因此,它是一个有用但有限的工具,用于提升 Whisper 在特定音频内容上的表现。
现在,让我们深入了解转录技巧,以更全面地理解 Whisper 中可用的选项。应用这些技巧,你将能够为各种音频处理任务做好充分准备,从简单的转录到更复杂的多语言项目。
使用 Whisper 高效转录音频文件
在深入探讨相关参数之前,先来考虑一下模型大小的选择:tiny、base、small、medium 或 large。这个选择直接影响转录速度和准确性之间的平衡。例如,尽管 medium 模型提供了更快的转录速度,但 large 模型在准确性方面表现出色,因此在需要精度的应用中,它是首选。随着模型大小的增加,其准确性也随之提升,使得 large 模型成为精度的巅峰。large 模型是文献中报告准确性的基准(《心理健康研究中的高效和准确转录——使用 Whisper AI 进行音频文件转录的教程——2023 年 11 月 10 日——osf.io/preprints/osf/9fue8),这也凸显了它在需要高精度任务中的重要性。
我的实际经验强调了选择适当的模型大小和计算资源的必要性。特别是在运行 Whisper 时,尤其是其更大的变体,需要 GPU 加速以显著减少转录时间。例如,测试表明使用 GPU 可以显著缩短转录一分钟音频所需的时间。此外,在选择模型大小时,考虑速度和准确性之间的权衡是至关重要的。例如,虽然中等模型的速度是大模型的两倍,但大模型提供了更高的准确性。
选择优化转录的关键推理参数
配置 OpenAI 的 Whisper 中的推理参数和解码选项对于实现准确的转录至关重要,因为这些设置可以显著影响转录过程的性能和精度。这种探索增强了转录的准确性并优化了性能,充分发挥了 Whisper 的能力。根据我的经验,参数如 temperature、beam_size 和 best_of 在微调 Whisper 的转录能力中显得至关重要。
-
temperature参数控制生成文本中的变化水平,这可以导致更准确的转录。 -
beam_size参数在解码中至关重要,影响潜在转录的搜索广度。较大的beam_size值可以通过考虑更全面的可能性来提高转录准确性。 -
同样,
best_of允许我们控制解码过程的多样性,从多次尝试中选择最佳结果。这在实现转录的最高可能准确性方面特别有用。
理解 temperature、beam_size 和 best_of 推理参数之间的关系
Whisper 模型中的 beam_size 参数指的是在解码过程中使用的束搜索中的束数量。束搜索是一种启发式搜索算法,通过扩展有限集中最有前途的节点来探索图。在 Whisper 的背景下,束搜索用于在给定音频输入时找到最可能的单词序列。
temperature 参数控制抽样过程中输出的随机性。较高的温度会产生更随机的输出,而较低的温度会使模型的输出更为确定性。当温度设置为零时,模型采用贪婪解码策略,总是选择最可能的下一个词。
beam_size 和 temperature 影响解码策略以及生成文本的多样性。较大的 beam_size 值可以通过考虑更多的替代单词序列来提高转录的准确性,但它也需要更多的计算资源,并可能导致推理过程变慢。另一方面,temperature 影响输出的可变性;非零温度允许从可能的后续单词分布中进行采样,这可以引入可变性并潜在地捕捉到语音中的更多细微差别。
在实践中,当温度设置为零时,使用 beam_size 参数,表示应该使用束搜索。如果温度非零,则使用 best_of 参数来确定要从中采样的候选项数量。Whisper 模型使用动态温度设置,初始温度为 0,在满足特定条件时(例如生成的标记的平均对数概率低于阈值,或生成的文本的 gzip 压缩率高于特定值),会将温度提高 0.2,直到达到 1.0。
总结来说,beam_size 控制了束搜索解码中的搜索范围,而 --temperature 控制了采样过程中输出的随机性。它们是解码策略的一部分,影响最终由 Whisper 模型生成的转录或翻译结果。
在 Whisper 中配置参数和解码选项是一个微妙的过程,需要深入理解模型及其功能。通过仔细调整这些设置,用户可以优化转录的准确性和性能,使 Whisper 成为一个适用于广泛应用的强大工具。与任何 AI 模型一样,必须在特定使用场景下彻底测试和验证结果,确保它们满足要求。以下部分将更深入地介绍一个专门设计的实践笔记本,旨在展示 Whisper 解码过程中运行时参数的强大功能。
在实践中应用 Whisper 的运行时参数
本节将探索 LOAIW_ch05_2_transcribing_and_translating_with_Whisper.ipynb Colab 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter05/LOAIW_ch05_2_transcribing_and_translating_with_Whisper.ipynb)以进行更全面的实践操作。我鼓励你在本书的 GitHub 仓库中找到该笔记本,并在 Google Colab 中运行。该笔记本旨在展示如何在 Python 环境中安装和使用 Whisper,展示其处理多语言 ASR 和翻译任务的能力。具体而言,它利用 FLEURS 数据集展示了 Whisper 在处理多语言音频数据方面的高效性。FLEURS 代表 少量学习评估通用语音表示,这是一个用于评估通用语音表示在少量学习场景中的性能的基准,少量学习指的是模型能够在仅有少量数据的情况下学习或适应新任务或新语言。这对于那些没有大量数据集可供训练模型的语言尤其重要。以下图示展示了笔记本的高级结构:

图 5.2 – 使用 Whisper 进行转录和翻译
如图 5.2所示,笔记本还集成了一个交互式 Gradio 界面,供用户进行 Whisper 转录和翻译功能的实地实验,使用选定的音频样本。以下是一些高级步骤和代码片段,展示了相关操作:
-
librosa、gradio和kaleido。这些库能够显著增强基于 Whisper 的项目的功能和应用。librosa可以预处理音频文件以满足 Whisper 的要求,gradio可以创建交互式演示以展示 Whisper 的功能,而kaleido则可以生成可视化内容以补充音频处理任务。它们共同为即将进行的任务准备了 Python 环境,解决了潜在的兼容性问题,并设置了计算设备:!pip install -q cohere openai tiktoken !pip install -q librosa !pip install git+https://github.com/openai/whisper.git Fleurs(torch.utils.data.Dataset) custom class is implemented to download, extract, and preprocess audio files from the selected language dataset, preparing the dataset for processing with Whisper. We extract 5% of the dataset for the selected language using that class. Notice that we are removing only a few records from the FLEURS dataset for a given language. For example, if we choose the Korean language as the dataset, we must download about 840 records. Thus, downloading just 5% (77 records) is more manageable and runs the demo code faster. Feel free to experiment with other percentage values:dataset = Fleurs(lang, subsample_rate=5)
-
temperature、beam_size和best_of推理参数:options = dict(language=language, beam_size=5, best_of=5, temperature=0) transcribe_options = dict(task="transcribe", **options) translate_options = dict(task="translate", **options) -
启动与 Gradio 的交互式探索:一个交互式 Gradio 界面允许用户选择音频样本,调整推理参数,并查看 ASR 和翻译结果,同时显示原始音频。本节旨在提供实时体验,通过更改推理参数并观察转录结果。
-
探索用于单词级时间戳的高级技术:本节展示了如何通过 Whisper 的交叉注意力权重,从音频转录中提取单词级时间戳。这涉及到动态时间规整、注意力权重处理和可视化技术,将转录中的单词与音频录音中的特定时间对齐,适用于字幕生成和详细音频分析等应用。
本 Colab 笔记本是一个结构良好的指南,介绍了 Whisper 及其多语言功能,并提供了关于模型推理参数的实践操作经验。它涵盖了从数据准备到模型推理和结果可视化的整个工作流程,为任何对语音处理和机器学习感兴趣的人提供了宝贵的见解。这种全面的方法确保你能掌握使用现有最先进的自动语音识别(ASR)和翻译模型之一的复杂性,为语音技术的进一步探索和应用开发铺平道路。
在确立了 Whisper 在转录音频文件方面的高效性后,我们现在将重点放在下一个前沿:将这一先进的语音识别技术集成到语音助手和聊天机器人中。这一整合有望彻底改变我们与人工智能的互动,提供无缝且直观的沟通,能够准确理解并响应我们的口头请求。让我们探索如何利用 Whisper 的功能来提升这些交互式应用中的用户体验。
将 Whisper 集成到语音助手和聊天机器人中
将 Whisper 的先进语音识别功能融入语音助手和聊天机器人中,可以显著提升用户体验。这涉及到理解口语,并用更高的准确性和上下文意识进行解释。目标是创造能够听懂和理解的系统,使互动更加自然和类人化。
在这一部分,我们将通过实践的方式学习和理解 Whisper 如何补充和增强现有结构。这一整合并不是要替代现有系统,而是通过 Whisper 强大的功能对其进行增强。它涉及到对 Whisper 与助手或聊天机器人之间互动的微调,以确保无缝的沟通。这种协同作用对于释放语音技术的全部潜力至关重要。
优化 Whisper 以提高效率和用户体验对这一整合至关重要。效率不仅仅是速度,还包括回应的准确性和相关性。Whisper 准确地转录和理解各种口音、方言和语言的能力,是其实用性的基石。此外,当技术能够处理自发的、日常的语言交流时,用户体验会大大增强,使互动更加生动、自然,而不那么机械化。因此,重点是创建技术熟练和以用户为中心的设计之间的和谐平衡。
Whisper 在转录服务中的角色是多方面且重要的。其技术的复杂性、对复杂音频条件的鲁棒性以及成本效益,使其成为企业和开发者的重要工具。所以,让我们深入了解一下!
认识到 Whisper 在语音助手和聊天机器人中的潜力
在我们这个数字化驱动的时代,智能个人助手(IPAs)如 Siri、Google Assistant 和 Alexa,已经无处不在,帮助完成购物、播放音乐和管理日程等任务。语音助手和聊天机器人,作为数字互动的重要组成部分,正在迅速发展。尽管它们的架构根据使用场景和需求有所不同,但它们的潜力巨大,尤其是在引入像 Whisper 这样的技术时。
聊天机器人和语音助手正日益成为我们数字互动的重要组成部分,提供客户支持、虚拟助手等服务。虽然根据具体的使用场景和需求有所不同,但它们的架构通常遵循类似的结构。
向着更复杂的聊天机器人发展
聊天机器人可以大致分为两类:基于规则的和基于 AI 的。基于规则的聊天机器人根据预定义的规则和模式进行操作,通过简单的真/假算法提供回应。而基于 AI 的聊天机器人则利用机器学习和自然语言处理(NLP)来理解和回应用户查询。一个典型的聊天机器人架构由几个关键组件组成:
-
自然语言理解引擎(NLU):这个组件解析用户输入,利用机器学习和 NLP 理解信息的上下文和意图。
-
知识库:这是聊天机器人用来回应的一个信息库。它可以包括常见问题、关于公司产品或服务的信息以及其他相关数据。
-
数据存储:聊天机器人存储对话历史和分析数据。
-
问答系统:该系统回答客户的常见问题。问题由问答系统进行解析,随后从知识库中提供合适的回答。
在数字通信中弥合语音助手的空白
语音助手,如亚马逊 Alexa 或 Google Assistant,具有稍微不同的架构。语音助手的一般流程从客户端设备的麦克风录制用户的原始音频开始。然后使用语音活动检测(VAD)系统处理这些音频,将其分离成短语。这些短语被转录成文本,并发送到服务器进行进一步处理。语音助手的架构通常分为两个主要组件:
-
客户端-服务器:客户端处理音频信息并将其转换为文本短语。然后将信息发送到服务器进行进一步处理。
-
技能:这些独立应用程序在客户端处理的文本/音频上运行。它们处理信息并返回结果。在像亚马逊 Alexa 或 Google Assistant 这样的语音助手的上下文中,技能指的是扩展语音助手平台功能的第三方应用程序。这些技能由第三方创作者使用亚马逊提供的 Alexa 技能套件(
www.amazon.science/blog/the-scalable-neural-architecture-behind-alexas-ability-to-select-skills)开发。它们使语音助手能够执行广泛的功能,超越内置特性,如玩游戏、提供新闻更新、控制智能家居设备等。语音助手的架构允许这些技能与用户的语音命令互动,并提供量身定制的响应或服务。
目前,智能个人助理(IPA)缺乏互操作性,尤其是在交换用户行为学习方面。IPA 的架构高度定制化,以适应商业操作和客户需求的可用性和上下文。这一局限性突显了 IPA 架构标准化的必要性,尤其是以语音为主要交互方式。然而,这一概念不仅限于语音,还包括基于文本的聊天机器人和多模态交互。例如,在多模态场景中,组件可能包括语音识别、自然语言处理(NLP)甚至环境动作执行,如控制工业机械。
随着人工智能和机器学习技术的不断发展,特别是像 OpenAI 的 Whisper 这样的进展,我们预期将出现更加复杂、具有上下文感知能力的聊天机器人和语音助手。这些进展有望提升用户体验和数字互动的可能性。这一演变对企业和组织中的专业虚拟助手至关重要,因为它要求与通用助手进行互操作,以避免重复实现。Whisper 在这个领域的潜力体现在其先进的语音处理能力上,树立了智能个人助理(IPA)的新标准,并革新了用户与数字平台的互动方式。
当我们将注意力转向下一个部分时,理解为何我们专门讨论聊天机器人,而不涉及语音助手领域,显得尤为重要。这一战略决策与 OpenAI 开发 ChatGPT 的方法一致,ChatGPT 代表了 AI 聊天机器人技术的一个里程碑。ChatGPT 的设计理念和实现方式为如何将先进技术如 Whisper 集成到聊天机器人架构中提供了关键的见解。以下部分将探讨 Whisper 如何无缝地融入现有的聊天机器人框架,增强其功能和智能。
将 Whisper 集成到聊天机器人架构中
在本节中,我们将踏上探索 OpenAI Whisper 在聊天机器人架构中的实际应用之旅。聊天机器人架构指的是聊天机器人系统的基本结构和设计。它包括使聊天机器人能够理解用户输入、提供准确回应并提供无缝对话体验的组件和流程。聊天机器人的架构对于其有效性至关重要,并由具体的使用案例、用户互动、集成需求、可扩展性要求、可用资源以及预算限制等因素决定。
Whisper 的架构旨在将口语语言转换为文本,这一过程被称为转录。这个能力对于基于语音的聊天机器人至关重要,因为聊天机器人必须理解并响应口头的用户输入。
为 Whisper 选择合适的聊天机器人架构
选择 Whisper 聊天机器人架构时需要考虑具体的使用案例和需求。架构应能够处理聊天机器人将执行的任务、目标受众和所需功能。例如,如果聊天机器人用于回答常见问题,那么架构可能会包含一个问答系统,用于解读问题并从知识库中提供适当的回应。
通过调整其神经网络架构,Whisper 模型可以针对特定的使用场景进行优化。例如,一家聊天机器人开发公司可能会使用 Whisper 来构建实时转录服务。相反,一家拥有智能助手和物联网设备的公司可能会将 Whisper 与语言模型结合,以处理转录后的语音并根据用户命令执行任务。
将 Whisper 聊天机器人架构应用于行业中的使用案例
Whisper 的聊天机器人架构可以应用于各种消费者、商业和工业领域的使用案例。例如,使用 Whisper 的聊天机器人可以通过语音理解客户查询,并生成详细的、具备上下文意识的书面或口头回应,用于客户服务。这可以通过提供快速、准确且个性化的回应来增强客户体验。
在商业领域,Whisper 可以自动化诸如会议记录、访谈转录、以及将讲座和播客转换为文本以便进行分析和记录的任务。自动化日常任务并方便获取信息可以提升效率和生产力。
Whisper 可以在工业领域的智能助手和物联网设备中集成,提供更自然、高效和准确的语音交互。例如,智能助手可以处理转录后的语音,执行任务、回答问题或根据用户命令控制智能设备。
实现基于 Whisper 的聊天机器人需要将 Whisper API 集成到您的应用程序中,这可以通过 Python 实现。Whisper API 是 open/open-python 的一部分,允许您访问各种 OpenAI 服务和模型。实现过程还涉及定义使用场景、选择合适的聊天机器人架构以及设置用户界面。
作为起点,让我们通过一个实际的编码示例来了解如何构建一个基本的语音助手,使用 Whisper 进行演示。我们将深入探讨的完整编码示例可以在我们的 GitHub 仓库中找到,格式为 LOAIW_ch05_3_Whisper_and_Stable_LM_Zephyr_3B_voice_assistant_GPU.ipynb Colab 笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter05/LOAIW_ch05_3_Whisper_and_Stable_LM_Zephyr_3B_voice_assistant_GPU.ipynb)。
下图提供了一个高层次的逐步说明,展示了笔记本如何设置一个简单的语音助手,利用 Whisper 的能力:

图 5.3 – 使用 Whisper 创建语音助手
图 5.3 展示了加载 Whisper 模型、将音频输入转录为文本并使用 StableLM Zephyr 3B – GGUF 生成响应的步骤。StableLM Zephyr 3B – GGUF 是一个拥有 30 亿参数的量化 GGUFv2 模型,继 Stability AI 的 StableLM Zephyr 3B 后开发。该模型文件与 llama.cpp 兼容。随后,使用 Google 文本转语音 (gTTS) 服务将响应转换为语音,实现完整的语音对话交互。
介绍 StableLM Zephyr 3B – GGUF
StableLM Zephyr 3B – GGUF 是由 Stability AI 开发的语言模型。以下是一些关于该模型的详细信息:
模型描述:StableLM Zephyr 3B 是一个拥有 30 亿参数的指令调优模型,灵感来自 Hugging Face 的 Zephyr 7B 训练管道。它使用 直接偏好优化 (DPO) 在公开可用和合成数据集的混合上进行了训练。该模型的评估基于 MT Bench 和 Alpaca Benchmark。
目的和能力:StableLM Zephyr 3B 高效地满足各种文本生成需求,从简单查询到复杂的指导性文本。它可用于多种任务,包括自然语言理解(NLU)、文本补全等。
Meta 的llama.cpp团队。GGUF 代表“Georgi Gervanov 的统一格式”,是 GGML 的替代品,GGML 是一个专注于机器学习的 C 语言库。GGUF 被各种客户端和库支持,包括llama.cpp、text-generation-webui、koboldcpp、gpt4all等。
量化级别:模型文件有不同的量化级别:
Q5_0:遗留版;中等,平衡质量。
Q5_K_S:大,低质量损失(推荐)。
Q5_K_M:大,低质量损失(推荐)。
从 2023 年 8 月 27 日起,llama.cpp以及许多第三方 UI 和库。
本节不仅仅是理解代码,更重要的是欣赏将 Whisper 集成到聊天机器人架构中的潜力。它让我们设想,这项技术如何革新我们与聊天机器人互动的方式,使这些互动更加自然和直观。它让我们认识到语音启用的聊天机器人在各种应用中的潜力,从客户服务到个人助手,乃至更广泛的领域。
当我们深入探讨编码示例的细节时,请记住我们的目标是理解技术的更广泛影响。Whisper 集成到聊天机器人架构中如何提升我们的 AI 解决方案?它如何在市场上提供竞争优势?这些是我们在本节中应考虑的问题。
我鼓励你打开 Colab Notebook 并跟着一起操作。这里是一些高层次步骤,并附有部分代码片段供参考:
-
对于
stablelm-zephyr-3b-GGUF stablelm-zephyr-3b.Q5_K_S.gguf模型,我们需要安装并编译llama-cpp-python包,同时安装whisper、gradio和gTTS。为了利用 NVIDIA CUDA 加速,我们必须先设置CMAKE_ARGS="-DLLAMA_CUBLAS=on"环境变量:import os os.environ["CMAKE_ARGS"] = "-DLLAMA_CUBLAS=on" print(os.getenv("CMAKE_ARGS")) !pip install llama-cpp-python==0.2.34 !huggingface-cli download TheBloke/stablelm-zephyr-3b-GGUF stablelm-zephyr-3b.Q5_K_S.gguf --local-dir . --local-dir-use-symlinks False !pip install -q git+https://github.com/openai/whisper.git !pip install -q gradio !pip install -q gTTS !ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono -t 10 -q:a 9 -acodec libmp3lame Temp. -
初始化 Python 库:我们现在导入必要的库,并设置一个日志记录器,用于记录在 Notebook 执行期间的事件和输出:
import datetime import os from rich.console import Console console = Console(width=110) ## Logger file tstamp = datetime.datetime.now() tstamp = str(tstamp).replace(' ','_') logfile = f'{tstamp}_log.txt' def writehistory(text): with open(logfile, 'a', encoding='utf-8') as f: f.write(text) f.write('\n') f.close() -
llama.cpp,如果有 GPU 可用,则进行配置。它指定了诸如最大序列长度、CPU 线程数和要卸载到 GPU 的层数等参数:warnings.filterwarnings("ignore") with console.status("Loading...",spinner="dots12"): llm_gpu = Llama( model_path="/content/stablelm-zephyr-3b.Q5_K_S.gguf", # Download the model file first n_ctx=4096, # The max sequence length to use - note that longer sequence lengths require much more resources n_threads=8, # The number of CPU threads to use, tailor to your system, and the resulting performance n_gpu_layers=35 # The number of layers to offload to GPU if you have GPU acceleration available ) -
探索推理示例:一个简单的示例演示了如何根据文本提示从 StableLM Zephyr 3B 模型生成响应:
prompt="In a short response, what is the capital of France?" template = f"<|user|>\n{prompt}<|endoftext|>\n<|assistant|>" start = datetime.datetime.now() output = llm_gpu( template, # Prompt temperature=0, max_tokens=512, # Generate up to 512 tokens stop=["</s>"], # Example stop token - not necessarily correct for this specific model! Please check before using. echo=False # Whether to echo the prompt ) console.print(output['choices'][0]['text']) -
定义 LLM 的支持函数:在这里,我们创建并测试一个与 StableLM 模型交互的函数:
import re def llm_call(input_text): prompt = """Act as Tatianna, a junior-level assistant characterized by your cheerful demeanor and unwavering helpfulness. \ You are in a business setting; thus, always act professionally and courteously. \ Respond succinctly to the following instructions and questions, and do not include information about yourself unless it is part of the action or question: \ """ + input_text template = f"<|user|>\n{prompt}<|endoftext|>\n<|assistant|>" response = llm_gpu( template, # Prompt temperature=0.1, max_tokens=200, # Generate up to 512 tokens stop=["</s>"], # Example stop token - not necessarily correct for this specific model! Please check before using. echo=False # Whether to echo the prompt ) if response is not None: match = re.search(r':\s*(.*)', response['choices'][0]['text']) if match: reply = match.group(1).strip() reply = response['choices'][0]['text'] else: reply = "No response generated." return reply -
transcribe(audio)函数是语音助手系统的关键组件。它无缝集成了 Whisper 的转录能力与 StableLM Zephyr 3B 模型和 gTTS,能够让语音助手以自然、对话的方式理解并回应用户的查询:import whisper model = whisper.load_model("medium", device=DEVICE) def transcribe(audio): if audio is None or audio == '': return ('','',None) # Return empty strings and None audio file language = 'en' audio = whisper.load_audio(audio) audio = whisper.pad_or_trim(audio) mel = whisper.log_mel_spectrogram(audio).to(model.device) _, probs = model.detect_language(mel) options = whisper.DecodingOptions() result = whisper.decode(model, mel, options) result_text = result.text out_result = llm_call(result_text) audioobj = gTTS(text = out_result, lang = language, slow = False) audioobj.save("Temp.mp3") return [result_text, out_result, "Temp.mp3"] -
创建用户界面:这段 Python 代码使用 Gradio 库创建了一个用户界面,允许用户与语音助手系统进行交互。该界面包括一个麦克风输入用于捕捉音频,两个文本框分别显示转录的文本和生成的响应,以及一个音频播放器播放语音响应:
gr.Interface( title = 'Learn OpenAI Whisper: Voice Assistance', fn=transcribe, inputs = gr.Audio(sources=["microphone"], type="filepath"), outputs=[ gr.Textbox(label="Speech to Text"), gr.Textbox(label="ChatGPT Output"), gr.Audio("Temp.mp3") ], live=True).launch(debug=True)这个单元使用 Gradio 创建了一个用户界面。界面包括一个麦克风输入用于接收用户的声音,一个文本框显示转录的文本,一个文本框显示 GPT-3 模型的响应,以及一个音频播放器播放模型的音频响应:

图 5.4 – Whisper 语音助手
Python 代码审查展示了如何将 OpenAI 的 Whisper 集成到聊天机器人架构中。我们学习了如何安装和导入必要的库,设置 OpenAI API 身份验证的环境变量,加载 Whisper 模型,并创建用于交互的用户界面。我们还看到如何定义与免费模型交互的函数,例如 Stability AI 的 StableLM Zephyr 3B,Google 的 gTTS,以及如何使用 Whisper 将音频输入转录为文本。这种动手实践让我们对如何利用 Whisper 构建语音助手有了实际的理解,展示了它在增强聊天机器人架构中的潜力。
在接下来的部分,我们将深入探讨 为聊天机器人效率和用户体验量化 Whisper,我们将探索如何微调 Whisper 在聊天机器人中的集成,以提升其性能,使用户体验更加流畅和有趣。我们将关注优化转录过程、处理不同语言和口音,以及提升聊天机器人响应速度的技术。所以,让我们继续前行,发现如何释放 Whisper 在创建高效且用户友好的聊天机器人系统中的全部潜力。
为了提高聊天机器人的效率和用户体验,对 Whisper 进行量化
对效率和性能优化的追求是一个持续的努力。近年来,量化模型技术在 ASR(自动语音识别)系统中,特别是在 OpenAI 的 Whisper 中,得到了广泛关注。
量化是一系列旨在减少模型大小和预测延迟的技术,主要通过降低模型权重的精度来实现。例如,这可能涉及将精度从 16 位小数点降至 8 位小数点,或将浮点数转换为整数表示。这一过程可以显著减少内存需求,从而实现高效的部署在边缘设备和嵌入式平台上,支持实时应用。
对 Whisper 进行量化可以带来多个好处,特别是在聊天机器人和语音助手的应用中:
-
性能提升:量化可以显著加速 Whisper 模型的推理时间,特别是在基于 CPU 的部署中。这对于计算资源有限的应用非常有益,比如笔记本电脑或移动设备。例如,将 PyTorch 中包含的简单后训练动态量化过程应用于 OpenAI Whisper,可以为基于 CPU 的部署提供最多 3 倍的加速。
-
模型尺寸缩减:量化还可以减少模型的大小,使其存储和传输更加高效。这对于在存储容量有限的边缘设备上部署模型尤为有用。
-
保持准确性:根据经验结果,较小模型的准确性在量化后保持不变,甚至略有提高。然而,最大的模型的准确性可能会略微降低。
然而,值得注意的是,量化的好处可能会根据具体的模型和部署的硬件有所不同。因此,在您的特定环境中,必须仔细评估量化的影响。下一章将更详细地探讨 Whisper 的量化,并结合实际编程示范。
在探讨了 Whisper 在聊天机器人和语音助手中的应用后,我们现在将注意力转向另一个至关重要的应用领域。接下来的部分将深入探讨 Whisper 如何增强辅助功能,从识别 Whisper 在辅助工具中的需求开始,并评估其对用户体验的影响。
使用 Whisper 增强辅助功能
在前面的章节中,我们探讨了 Whisper 如何用于转录服务,并与语音助手和聊天机器人相结合。现在,我们将关注这种技术的另一种同样重要的应用:增强辅助功能。
第一小节将深入探讨当前辅助工具的现状,并识别 Whisper 能够填补的空白。为什么在这个领域需要 Whisper?它带来了哪些独特的能力,能够增强现有工具的功能?这些问题是我们将要探讨的内容,旨在全面了解 Whisper 在该领域的必要性和潜力。
接下来,我们将评估 Whisper 对用户体验的实际影响。Whisper 在辅助工具中的集成如何影响最终用户?能观察到哪些改进?这些改进对依赖这些工具的个人有哪些意义?本节将提供详细的评估,深入分析 Whisper 集成的实际影响。
当我们展开这次探索时,重要的是要记住,我们的旅程不仅仅是理解 Whisper 的技术方面。更重要的是认识到它的变革性潜力,以及它如何改善听力或语言障碍者的生活。
那么,你准备好深入探索 Whisper 及其在提升可访问性方面的潜力了吗?让我们开始这段令人兴奋的探索之旅,记住——理解的过程与最终的目标同样重要。
识别在辅助工具中需要 Whisper 的地方
随着世界数字化连接的加深,对更具包容性和可访问性技术的需求也在增加。对于听力或语言障碍的人群,与数字设备的互动可能是一个挑战。传统的输入方式,如打字或触控,可能对这些用户来说更加可行和高效。这正是 Whisper 发挥作用的地方。
Whisper 的 ASR 技术可以将口语转录为书面文本,使听力障碍者能够更轻松地访问数字内容。它还可以将书面命令转化为行动,为语言障碍者提供一种替代输入方式。通过将 Whisper 集成到辅助工具中,我们可以改善这些用户的体验,使数字设备变得更加包容和易于使用。
利用 Whisper 的独特能力
Whisper 提供了几个独特的功能,可以增强现有工具的功能。Whisper 的一个关键优势是其卓越的准确性。在与多种语音识别系统的测试中,Whisper 展现了令人印象深刻的准确率。这种高准确度可以显著提高转录服务的可靠性,使其对听力障碍者更加有用。
Whisper 还能够理解和转录多种语言。这种多语言能力可以使数字内容对更广泛的用户更具可访问性,打破语言障碍,促进更加高效和包容的沟通。
Whisper 的另一个独特特点是其开源性质。OpenAI 已将 Whisper 提供给公众使用,鼓励开发者将其集成到各种应用中,并探索新的可能性。这种开源方法促进了创新,并使技术得以不断改进,扩大了 Whisper 的影响力和覆盖范围。
使用 Whisper 增强现有的辅助工具
Whisper 的功能可以用于提升现有辅助工具的功能。例如,Whisper 可以集成到转录服务中,以提供更准确和可靠的转录结果。这将改善听力障碍者对音频内容的可访问性,使他们更容易理解和参与这些内容。
Whisper 还可以集成到语音助手和聊天机器人中,提升其功能。通过将口语命令转录为书面文本,Whisper 可以使这些工具更具互动性和用户友好性,特别是对于有语言障碍的用户。
此外,Whisper 的多语言能力可以用于增强语言学习工具。通过几乎实时地转录和翻译口语,Whisper 可以为学习者提供即时反馈,帮助他们更有效地提高语言技能。
Whisper 融入辅助工具的整合仅仅是个开始。随着 Whisper 的持续发展,我们期待在用户体验方面看到更多的改进。例如,Whisper 扩展到更多语言的可能性,可能会使其成为真正全球化的转录工具。
此外,将 Whisper 与其他 AI 模型整合,可以创造出更强大、更多样化的系统。例如,将 Whisper 与 OpenAI 的语言预测模型 GPT-3 结合,可以实现理解口语并预测生成类人文本的系统。
因此,让我们深入探讨 Whisper 对用户体验的实际影响,探索它带来的改进以及这些增强对依赖这些工具的个人的影响。
Whisper 的主要功能是将口语转换为书面文本,这一功能在增强辅助工具功能方面被证明是非常宝贵的。例如,它已经被整合到转录服务、语音助手和聊天机器人中,使得这些技术更加互动和用户友好。
Whisper 的最显著影响之一是它有潜力弥合沟通鸿沟,让世界变得更加包容。它改善了诸如 On Wheels 应用(dataroots.io/blog/on-wheels)中的包容性,这是一款为轮椅使用者、行动不便人士和推婴儿车或手推车的父母重新定义城市环境无障碍的移动应用。该应用提供一个地图,显示一系列实用信息,例如无障碍餐厅、酒吧、博物馆、厕所、商店、停车位、医院、药店和加油站的位置。例如,用户可能会说:“在 123 主街添加一家新的无障碍餐厅。入口宽度为 32 英寸,并有一条坡道通向门口。厕所也可通行,门宽为 36 英寸。”该应用由 Whisper 提供支持,将这段语音输入转录为文本,然后提取相关信息,如餐厅地址、入口宽度、是否有坡道以及厕所的无障碍详情。这些数据会被添加到应用的数据库中,使其他搜索该地区无障碍位置的用户可以使用。Whisper AI 的整合显著改善了语音或听力障碍者的用户体验。Whisper 还被用来开发该应用的语音助手功能。这个语音功能特别适合那些有打字或视力障碍的用户,使他们可以通过语音命令与应用互动,更全面地参与其中。通过自然语言,语音助手使用户能够提供他们想添加到应用中的地点信息,例如建筑物的功能、地址、入口或厕所。这增加了包容性,让那些可能无法通过传统方式使用或贡献无障碍信息的用户,能够通过语音实现这一目标。该应用还将根据用户的轮椅宽度和可管理的门口高度,个性化其体验,显示仅对他们容易到达的地点。用户也可以通过测量自己喜欢的城市地点来贡献,帮助他人未来也能享受这些地方。
Whisper 技术的整合到辅助工具中,带来了用户体验的几项显著改善。例如,Whisper 替代了键盘,允许用户通过语音输入,这对运动障碍者尤其有益。
在教育领域,WhisperPhone(whisperphone.com/)作为一种学习工具,利用 Whisper 技术将学习者的声音直接传递到耳朵,增强听觉反馈回路,帮助学习者听到、产生和纠正语言的正确发音。这个工具对有学习和发育障碍的学习者以及自闭症谱系的个体尤其有益。
此外,Whisper 的鲁棒性和通用性使得集成现有的产品或服务变得更加容易,从而提高了它们的可用性。它的高准确性和速度也有助于提供更流畅的用户体验。
例如,On Wheels 应用程序的语音驱动功能使得有打字或视觉障碍的用户能够为应用程序的数据库贡献内容,从而提高他们的参与度和互动性。同样,WhisperPhone 增强听觉反馈回路的能力也能改善有学习和发育障碍的个体的语言学习成果。
从概念到实践的过渡,我们现在集中于一个实际应用,利用 Whisper 与视觉转文本生成 AI 模型以及 Google 的 gTTS 服务相结合。接下来的部分展示了如何将这些技术集成,以开发一个互动的图像到文本应用,展示了 Whisper 的多功能性及其在推动无障碍和用户互动中的作用。让我们一起探索这个实现的逐步过程和收获的见解。
使用 Whisper 构建互动的图像到文本应用
从评估 Whisper 对无障碍工具中用户体验的影响过渡到实际应用,让我们深入探讨一个结合 Whisper、GPT-4 Vision 和 Google 的 gTTS 服务的应用。该应用将接收图像和音频输入,转录音频,描述图像,然后将描述转回语音。
我鼓励你访问本书的 GitHub 仓库,找到 LOAIW_ch05_4_Whisper_img2txt_LlaVa_image_assistant.ipynb 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter05/LOAIW_ch05_4_Whisper_img2txt_LlaVa_image_assistant.ipynb),亲自尝试这个应用。下图描述了该笔记本如何作为实际示例,展示如何结合使用这些模型来处理和解释音频与视觉数据:

图 5.5 – Whisper img2txt LlaVa 图像助手
图 5.5 说明了本笔记本的主要目标:展示LlaVa作为一个多模态图像文本转文本模型的能力,它被描述为GPT-4-vision 的开源版本,并展示了如何将其与 Whisper 的音频处理结合,构建一个全面的多模态 AI 系统。以下是高层步骤,并附有一些选定的代码片段以进行说明:
-
transformers、bitsandbytes、accelerate、whisper、gradio和gTTS。还使用ffmpeg创建一个临时音频文件以便音频处理:!pip install -q -U transformers==4.37.2 !pip install -q bitsandbytes==0.41.3 accelerate==0.25.0 !pip install -q git+https://github.com/openai/whisper.git !pip install -q gradio !pip install -q gTTS !ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono -t 10 -q:a 9 -acodec libmp3lame Temp.mp3 -
配置量化:本节包括准备量化配置的代码,这对于加载具有 4 位精度的 LlaVa 模型至关重要。这一步骤对优化模型的内存和速度性能至关重要:
import torch from transformers import BitsAndBytesConfig quantization_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16 ) -
初始化 LlaVa 模型:我们登录 Hugging Face Hub 并初始化图像到文本的管道,使用先前的量化配置。此管道处理图像并生成描述性文本:
from huggingface_hub import notebook_login notebook_login() from huggingface_hub import whoami whoami() # you should see something like {'type': 'user', 'id': '...', 'name': 'Wauplin', ...} from transformers import pipeline model_id = "llava-hf/llava-1.5-7b-hf" pipe = pipeline("image-to-text", model=model_id, model_kwargs={"quantization_config": quantization_config}) -
PIL库:import whisper import gradio as gr import time import warnings import os from gtts import gTTS for i in range(1, 11): !wget -nv https://github.com/PacktPublishing/Learn-OpenAI-Whisper/raw/main/Chapter05/images/LOAIW_ch05_image_{str(i).zfill(2)}.jpg from PIL import Image image_path = "/content/LOAIW_ch05_image_03.jpg" image = Image.open((image_path)) image -
从图像生成文本:本节提示 LlaVa 模型详细描述加载的图像。它使用特定格式的提示,并处理输出以提取并打印生成的文本:
max_new_tokens = 200 prompt_instructions = """ Describe the image using as much detail as possible. Is it a painting or a photograph? What colors are predominant? What is the image about? """ prompt = "USER: <image>\n" + prompt_instructions + "\nASSISTANT:" outputs = pipe(image, prompt=prompt, generate_kwargs={"max_new_tokens": 200}) # outputs # print(outputs[0]["generated_text"]) for sent in sent_tokenize(outputs[0]["generated_text"]): print(sent) -
将语音转为文本:加载 Whisper 模型,并定义一个函数将音频输入转录为文本。本节还包括检查 GPU 可用性的代码,这对于运行 Whisper 是首选的:
import warnings from gtts import gTTS import numpy as np import torch torch.cuda.is_available() DEVICE = "cuda" if torch.cuda.is_available() else "cpu" print(f"Using torch {torch.__version__} ({DEVICE})") import whisper model = whisper.load_model("medium", device=DEVICE) print( f"Model is {'multilingual' if model.is_multilingual else 'English-only'} " f"and has {sum(np.prod(p.shape) for p in model.parameters()):,} parameters." ) import requests import re from PIL import Image input_text = 'What color is the flag in the image?' input_image = '/content/LOAIW_ch05_image_10.jpg' # load the image image = Image.open(input_image) # print(input_text) prompt_instructions = """ Act as an expert in imagery descriptive analysis, using as much detail as possible from the image, respond to the following prompt: """ + input_text prompt = "USER: <image>\n" + prompt_instructions + "\nASSISTANT:" img2txt() function in charge of converting image-to-text output using LlaVa; transcribe() does speech-to-text using Whisper, and text_to_speech() uses gTTS to convert text to speech. The result is saved as an audio file:导入 re
导入 requests
从 PIL 导入 Image
定义 img2txt(input_text, input_image):
加载图像
image = Image.open(input_image)
写入历史记录(f"输入文本: {input_text} - 类型: {type(input_text)} - 目录: {dir(input_text)}")
如果 type(input_text) == tuple:
prompt_instructions = """
使用尽可能多的细节描述图像,它是画作、照片吗?有哪些主色调?图像的内容是什么?
"""
否则:
prompt_instructions = """
作为影像描述分析专家,使用尽可能多的细节从图像中提取信息,回答以下提示:
""" + input_text
prompt = "USER:
\n" + prompt_instructions + "\nASSISTANT:"
outputs = pipe(image, prompt=prompt, generate_kwargs={"max_new_tokens": 200})
正确提取响应文本
如果 outputs 不为空且 len(outputs[0]["generated_text"]) > 0:
match = re.search(r'ASSISTANT:\s(.)', outputs[0]["generated_text"])
如果匹配成功:
提取"ASSISTANT:"后的文本
reply = match.group(1)
否则:
reply = "未找到响应。"
否则:
reply = "未生成响应。"
返回回复
定义转录(audio):
检查音频输入是否为 None 或为空
如果音频为 None 或为空:
返回 ('','',None) # 返回空字符串和 None 音频文件
语言 = 'en'
audio = whisper.load_audio(audio)
audio = whisper.pad_or_trim(audio)
mel = whisper.log_mel_spectrogram(audio).to(model.device)
_, probs = model.detect_language(mel)
options = whisper.DecodingOptions()
result = whisper.decode(model, mel, options)
result_text = result.text
return result_text
def text_to_speech(text, file_path):
language = 'en'
audioobj = gTTS(text = text,
lang = language,
slow = False)
audioobj.save(file_path)
return file_path
-
运行 Gradio 界面:本笔记本的最后一部分设置了一个 Gradio 界面,允许用户通过上传图像和提供语音输入与系统进行交互。该界面使用定义的函数处理输入,进行图像描述和音频转录,并提供音频和文本输出。有关实现,请参阅笔记本:

图 5.6 – 本应用演示了结合 Whisper、LlaVa 和 gTTS 的强大功能;它提供了一个基于音频输入描述图像的实用工具,对于无障碍应用尤其有用
小结
在本章中,我们开始了一段启发性的旅程,探索了 OpenAI 的 Whisper 的广泛功能。我们深入了解了 Whisper 如何革新语音技术,特别是在转录服务、语音助手、聊天机器人以及增强无障碍功能方面的应用。
我们首先探讨了转录服务,在这方面 Whisper 擅长将口语转化为书面文字。其编码器-解码器 Transformer 模型确保了即使在复杂的音频条件下也能提供高准确性。我们还讨论了 Whisper 的局限性,如说话人分离问题,并强调了社区在提升其能力方面的努力。
接下来,我们探讨了如何设置 Whisper 进行转录任务,并提供了一个涵盖安装和配置步骤的全面实践指南。本章强调了理解并调整 Whisper 参数(如DecodingOptions)以实现最佳性能的重要性。
在语音助手和聊天机器人部分,我们探讨了 Whisper 集成如何提升用户体验。我们讨论了聊天机器人和语音助手的架构,解释了 Whisper 如何与现有结构相辅相成。本部分的重点在于平衡技术能力和以用户为中心的设计。
然后,我们将注意力转向了如何利用 Whisper 增强无障碍功能。我们评估了 Whisper 对用户体验的影响,特别是对于听力或语言障碍的个体。Whisper 的高准确性、多语言能力以及开源特性使其成为无障碍工具的革命性改变者。
最后,我们通过第二个实践编码示例来总结本章,演示了 Whisper 如何集成到语音助手中。我们提供了逐步的指南,展示了 Whisper 在聊天机器人架构中的实际应用。
在本章结束时,我们展望第六章,使用 Whisper 扩展应用。在这一章中,我们将深入探讨 Whisper 在各个行业中的多种应用。从转录服务到基于语音的搜索,我们将探索如何利用 Whisper 的变革性潜力,提升各个领域的专业和消费者体验。加入我们,一起继续揭开 Whisper 带来无限可能的面纱。
第六章:扩展 Whisper 的应用
本章将继续深入 OpenAI 的 Whisper 广泛应用领域。我们将探讨这项创新技术如何转变和提升各种应用,从精确的转录到跨多个语言和平台创建可访问且可搜索的内容。我们将探索如何在不同语言环境中实现高转录准确度,如何将 Whisper 与 YouTube 等平台集成以处理多语言内容,并使用OpenVINO等工具优化 ASR 模型部署。本章还将介绍如何利用 Whisper 将音频和视频内容转化为可搜索的文本,并与FeedParser结合使用,以便转录播客内容,提升 SEO 效果。通过实践示例和 Python 笔记本,你将获得实际经验,学习如何利用 Whisper 的功能克服自动语音识别中的挑战,并使多媒体内容更易访问且具有全球观众的吸引力。
本章将涵盖以下主要内容:
-
精确转录
-
提升与 Whisper 的互动和学习
-
优化环境以部署基于 Whisper 的 ASR 解决方案
这些部分旨在为你提供全面的理解和实际技能,帮助你在各种环境中有效地使用 Whisper,提高数字内容的价值和影响力。
到本章结束时,你将获得实践经验,并深入了解如何利用 Whisper 的功能解决来自音频和视频服务的自动转录挑战,同时处理多语言内容。你将学习如何将 Whisper 与 YouTube 等平台集成,并利用转录功能进行 SEO 优化,使你的内容更易被发现和更具吸引力。
技术要求
为了充分利用 OpenAI 的 Whisper 进行高级应用,本章将结合 Python、OpenVINO1(用于优化模型性能)以及 Google Colab(便于使用和访问)来讲解。Python 环境的设置包括 Whisper 库用于转录和翻译任务,OpenVINO 用于提升模型推理速度,以及其他特定应用的库,如 PyTube 和 FeedParser。
1 OpenVINO 是英特尔公司拥有的商标。
关键要求:
-
Python 环境:确保已安装 Whisper 和 OpenVINO。OpenVINO 对于优化 Whisper 在不同硬件上的性能至关重要。
-
Google Colab 笔记本:使用本书 GitHub 仓库中提供的 Google Colab 笔记本。这些笔记本已设置为运行我们的 Python 代码,所需的内存和容量最小。如果可用,选择T4 GPU运行时类型,以获得更好的性能。
-
GitHub 仓库访问:所有 Python 代码,包括集成 Whisper 与 OpenVINO 的示例,都可以在本章的 GitHub 仓库中找到:(
github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter06)。这些 Colab 笔记本已经可以直接运行,提供了一种实用且动手实践的学习方式。
通过满足这些技术要求,读者将为探索多语言转录、提升内容可发现性以及高效部署基于 Whisper 的自动语音识别(ASR)解决方案做好准备,同时享受 Google Colab 提供的简化体验和 GitHub 上提供的丰富资源。
在打下技术基础并准备好工具后,我们将转向深入探索 Whisper 的核心功能。精准转录是我们的下一个目标,我们将深入探讨如何在多语言和方言之间实现高准确度的转录。这一部分将是一次充实的旅程,旨在完善转录艺术,充分发挥 Whisper 的先进技术潜力。
精准转录
在本节中,我们将把 OpenAI 的 Whisper 的实用性提升到新的高度,展示它在处理各种语言挑战方面的多样性和强大能力。本部分将引导你了解如何利用 Whisper 进行转录,并真正理解和解读多语言内容,确保出色的准确性。从方言的细微差别到不同语言的节奏,Whisper 在转录方面的高效性为解锁内容的全球潜力提供了门户。
我们首先探索如何利用 Whisper 进行多语言转录。我们演示了 Whisper 的复杂算法如何应对多语言的复杂性,确保你的转录准确且在文化和语境上相关。这一点尤为重要,因为我们生活在一个以多样性和包容性为基础的世界中。
接下来,我们将把重点转向为提升内容可发现性而进行的索引处理。在这个数字化时代,信息的可访问性至关重要,而 Whisper 提供了一种创新的方法,使音频和视频内容能够被搜索。通过将口语转录为文本,Whisper 扩大了内容的传播范围,并增强了其在互联网上的可见性和互动性。
最后,我们将使用 FeedParser 和 Whisper 创建可搜索的文本。本节内容阐明了从 RSS 源中检索音频内容并将其转化为可搜索文本之间的协同作用,从而显著提升 SEO 和内容营销效果。通过实际示例和动手实践,你将学会如何利用这些工具扩大内容的数字足迹,使其更易被发现,并为更广泛的受众提供访问。
利用 Whisper 进行多语言转录
在全球沟通的丰富多彩的画卷中,我们无缝过渡到为多种语言配置 Whisper 的实际操作。这一步至关重要,是理论与实践的结合,使 Whisper 能轻松跨越语言障碍。在这里,我们将学习如何配置 Whisper,确保它成为你工具库中捕捉人类语言多样性的多功能工具。这一基础将为进一步探索 Whisper 在多语种环境中理解并准确转录内容的能力铺平道路。
为不同语言设置 Whisper
Whisper 支持多种语言,包括但不限于英语、印地语、西班牙语等。要为不同语言设置 Whisper,你可以使用 Whisper API,提供两个端点:转录和翻译。
对于仅支持英语的模型,可以手动将语言设置为 en(英语)。然而,多语种模型可以自动检测语言。可以使用命令 whisper.load_model("base") 加载 Whisper 模型,音频的语言可以通过 model.detect_language(mel) 方法检测。
比如,如果你想转录一份西班牙语的音频文件,你可以在进行转录时指定语言:whisper japanese.wav --``language Spanish。
在本书的 GitHub 仓库中 (github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter06),你会找到一个名为 LOAIW_ch06_1_Transcripting_translating_YouTube_with_Whisper.ipynb 的笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter06/LOAIW_ch06_1_Transcripting_translating_YouTube_with_Whisper.ipynb),其中包含了转录和翻译音频文件的示例。以下是来自该笔记本的代码片段,展示了如何使用 Whisper 进行语言检测,而不进行转录:
Import whisper
import torch
model = whisper.load_model("small")
audio = whisper.load_audio(source_audio)
audio = whisper.pad_or_trim(audio)
mel = whisper.log_mel_spectrogram(audio).to(model.device)
# detect the spoken language
_, probs = model.detect_language(mel)
audio_lang = max(probs, key=probs.get)
print(f"Detected language: {audio_lang}")
下面是代码的逐步讲解,帮助我们更好地理解基础设置和交付流程:
-
whisper模块,包含 Whisper 模型、相关函数,以及用于处理张量的torch库(PyTorch)。 -
whisper.load_model("small")函数加载 Whisper 模型的"small"版本。Whisper 提供了不同的模型大小,"small"模型是性能和资源使用之间的权衡。 -
whisper.load_audio(source_audio)函数加载由source_audio指定的音频文件。然后,使用whisper.pad_or_trim(audio)对音频进行填充或裁剪,以适应合适的长度。 -
whisper.log_mel_spectrogram(audio)函数将音频转换为对数 Mel 频谱图,这是 Whisper 模型用作输入的时频表示。然后,使用.to(model.device)将频谱图移到与模型相同的设备上,以确保兼容性。 -
model.detect_language(mel)函数用于检测音频中所说的语言。该函数返回一个元组,其中第二个元素是一个字典类型的对象,包含不同语言的概率值。max(probs, key=probs.get)表达式用来找到概率最高的语言,假设它就是音频中所说的语言。 -
输出:最后,检测到的语言将被打印出来。
通过回顾并在 第四章 中获得的见解,针对特定领域和语言的微调 Whisper,我们确定了微调 Whisper 提供了一种定制的方法,旨在解决特定口音和方言的细微挑战。这种定制使 Whisper 能够适应地区性语音模式的独特语音和节奏特征,从而提高转录准确性。在进入下一小节时,必须记住,微调不仅仅是一种策略,而是那些希望提升 Whisper 在多样化语言环境中表现的用户所必须采取的步骤。本节将深入探讨微调 Whisper 的实际操作和优势,确保它能满足您转录任务的具体需求。
克服口音和方言的挑战
像 Whisper 这样的 ASR 系统面临着理解和转录各种口音和方言的复杂任务。这些语音模式的变化由于其独特的发音、语调和重音模式而构成了显著的挑战。然而,Whisper 配备了处理这种多样性的能力,这得益于它在庞大的数据集上的广泛训练,涵盖了各种语言的细微差别。
正如我们在 第四章 中学到的,针对特定领域和语言的微调 Whisper,微调 Whisper 以适应特定的口音和方言需要采取量身定制的方法,考虑到地区性语音模式的独特语音和节奏特征。这种定制对于提高转录准确性至关重要,因为它使 Whisper 能够适应不同语言和方言的语音特征中的微小变化。
要微调 Whisper,必须深入研究目标口音或方言的语言细节。这涉及分析和理解定义口音的三个基本元素:语调、节奏和重音模式。
语调指的是讲话时声音的升降;节奏指的是声音和静默的模式,重音模式则表明某些音节或单词的强调。通过理解这些元素,可以调整 Whisper 的转录参数,更好地捕捉口语的本质。
例如,某种特定的方言可能有独特的语调模式,而 Whisper 的通用模型可能无法准确识别。通过对模型进行微调,使其适应这一特定的语调模式,Whisper 可以学习到这些细微差别,从而提高转录的准确性。同样,理解方言的节奏和重音模式,可以帮助 Whisper 区分不同方言中可能发音不同的同音词,从而减少转录错误。
微调可能需要通过精心策划的数据集来重新训练 Whisper,该数据集能显著代表目标口音或方言。该数据集应包含各种语音样本,捕捉方言中所有语言特征的全貌。通过将 Whisper 暴露于这种定向训练,模型可以更精确地识别和转录该方言。
此外,针对口音和方言对 Whisper 进行微调,不仅仅是提高单词识别率;它还涉及理解单词被说出的语境。口音和方言可以影响语言所传达的意义,微调后的 Whisper 模型可以更好地解读单词背后的意图。
在实践中,针对特定口音或方言对 Whisper 进行微调可能涉及以下步骤:
-
数据收集:收集一个全面的音频录音数据集,准确地代表目标口音或方言
-
模型训练:使用该数据集重新训练或调整 Whisper 的现有模型,重点关注口音或方言的独特特征
-
参数调整:修改 Whisper 的解码参数,如语言和语音模型,以更好地适应目标语音模式
-
测试和评估:在单独的验证集上评估微调后的模型表现,以确保目标口音或方言的转录准确性得到提升
-
迭代优化:通过整合反馈和额外数据,持续优化模型,以进一步提高其准确性
通过采用这种量身定制的方法,Whisper 成为一个更强大的转录工具,能够从音频中提供准确可靠的文本,覆盖更广泛的语言和方言范围。这提升了与 ASR 系统交互的用户体验,并为在全球多元文化环境中应用语音识别技术开辟了新的可能性。
在深入探讨如何微调 Whisper,以巧妙应对各种口音和方言的挑战之后,我们现在将注意力转向旅程中的下一个重要步骤。将 PyTube 与 Whisper 集成进行多语言转录,为将 Whisper 的转录能力扩展到 YouTube 内容的广阔宝库提供了创新的路径。这一集成不仅拓宽了可访问信息的范围,还增强了多语言转录工作的丰富性。
将 PyTube 与 Whisper 集成进行多语言转录
YouTube 在数字内容生态系统中的重要性不容小觑。作为全球第二大搜索引擎和领先的视频内容平台,YouTube 是内容创作者接触广泛、不同观众的关键渠道。该平台承载了从教育讲座、操作指南到娱乐节目和公司通讯等各类内容。然而,内容的价值不仅仅体现在其视觉和听觉的吸引力上;视频中的口语内容是一个宝贵的信息宝库,一旦被转录,就能提高其可发现性和可访问性。
对 YouTube 视频进行转录有多重目的。它将视听内容转化为文本,使搜索引擎可以对其进行索引。这样的文本格式允许用户通过关键词搜索定位到特定内容,而光靠音频和视频是无法做到的。此外,转录文本还可以用于生成字幕和闭路字幕,进一步扩大内容的覆盖范围,帮助非母语观众和听力障碍人士获取信息。
要转录 YouTube 内容,首先必须提取音频。这时,Python 库 PyTube 就成为了一个至关重要的工具。PyTube 使得下载 YouTube 视频成为可能,为转录提供所需的原始音频。在本书的 GitHub 仓库中,你会找到名为 LOAIW_ch06_1_Transcripting_translating_YouTube_with_Whisper.ipynb 的笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter06/LOAIW_ch06_1_Transcripting_translating_YouTube_with_Whisper.ipynb),其中包含了一个实用的、基础的 Python 代码示例,展示了如何使用 PyTube 下载 YouTube 视频的音频。以下是关键代码片段:
import re
from pytube import YouTube
video_url = "<Place video URL here>" #@param {type:"string"}
drive_folder = "" #@param {type:"string"}
yt = YouTube(video_url)
episode_date = yt.publish_date.strftime('%Y%m%d-')
source_audio = drive_folder + episode_date + (re.sub('[^A-Za-z0-9 ]+', '', yt.title).replace(' ', '_')) + ".mp4"
audio_file = YouTube(video_url).streams.filter(only_audio=True).first().download(filename=source_audio)
print(f"Downloaded '{source_audio}")
这段代码片段实现了多个任务:
-
导入必要的
"pytube"库,以便与 YouTube 内容进行交互 -
定义要下载的 YouTube 视频的 URL
-
根据视频的标题和发布日期创建下载音频的文件名,确保文件管理方法系统化
-
下载指定 YouTube 视频的音频流,使其可供转录使用
一旦获得音频,就可以使用 Whisper 进行转录。Whisper 能够处理各种语言和方言,使其成为转录 YouTube 多样化内容的理想工具。转录后的文本可以创建可搜索的索引,提高内容在搜索引擎中的可见性,并增强 YouTube 搜索算法中的曝光度。
转录文本不仅对索引有益,而且对 SEO 和内容营销策略也有帮助。从转录文本中提取的关键词可以用于优化网页、博客文章和社交媒体更新,从而提升内容在搜索引擎中的排名。此外,转录后的文本还可以重新用于不同的格式,如文章、信息图表和电子书,扩展内容的传播范围和互动潜力。
YouTube、PyTube 和 Whisper 之间的协同作用,代表了内容可发现性的未来的一个实际示例。随着视频内容继续主导数字领域,将这些内容转化为可搜索的文本将变得越来越重要。这个过程不仅通过提高内容的可访问性来增强用户体验,还为内容创作者提供了强大的工具,帮助他们优化内容以便搜索引擎抓取,并接触到更广泛的受众。
随着我们从 PyTube 与 Whisper 创新的整合中向前迈进,提升我们的多语言转录工具包,我们将注意力转向加强转录内容的可见性和可访问性。为提高可发现性而对内容进行索引,成为了一项关键策略,架起了未被充分利用的音频资源和可搜索的网络生态系统之间的桥梁。接下来的部分将指导我们优化转录内容,确保它被听到、轻松找到,并且能够被全球受众参与。
为提高可发现性而对内容进行索引
在这个时代,我们都面临着一个重大挑战:海量的在线内容令人震惊。为了在这片信息的浩瀚海洋中航行,搜索引擎使用了一种叫做索引的过程。索引是搜索引擎收集、评估和组织海量互联网信息的方式,包括网页、文档、图像、视频和其他类型的内容。这个过程使搜索引擎能够高效地检索并展示与用户查询相关的信息。其工作原理如下:
-
爬行:搜索引擎部署了被称为爬虫或蜘蛛的机器人,用来发现互联网内容。这些机器人系统地浏览网页,按照链接从一个页面跳转到另一个页面。它们仔细检查每个 URL 的内容和代码,包括网页、图像、视频和 PDF 文件。
-
索引:爬取之后,内容将被索引。这意味着爬虫发现的信息会存储并组织在一个庞大的数据库中,这个数据库被称为搜索引擎的索引。索引类似于一个巨大的在线文件管理系统,包含搜索引擎发现并认为值得提供给用户的每个网页和内容。
-
排名:一旦内容被索引,它可以根据相关查询进行展示。搜索引擎通过相关性对这些内容进行排名,首先展示最相关的结果。排名涉及各种算法,考虑关键词、网站权威性和用户体验等因素。
网站管理员可以使用像XML 网站地图和Google 搜索控制台这样的工具来促进索引。XML 网站地图列出网站上的所有页面,并附上额外的详细信息,比如每个页面最后修改的时间。这些网站地图可以提交给搜索引擎,提醒它们内容的存在,并帮助爬虫理解网站结构。
搜索引擎根据“爬取预算”进行操作,即它们为爬取网站分配的资源。这个预算受到服务器速度和网站重要性等因素的影响。高价值、频繁更新内容的网站可能会比小型、不太重要的网站更频繁地被爬取。
索引过程还涉及使用倒排索引,这是一个包含指向包含这些元素的文档的指针的文本元素数据库。这个系统使得搜索引擎能够快速检索数据,而无需在单独的页面中查找关键词和主题。
搜索引擎的索引是一个复杂但至关重要的过程,涉及爬取网页以发现内容、存储内容、在索引中组织内容,然后对其进行排序,以向用户提供最相关的搜索结果。理解和优化这个过程是搜索引擎优化(SEO)的基础。
从音频和视频创建可搜索的文本
增强音频和视频内容可发现性的最有效方法之一是通过转录。转录是将语音转换为文本,使得无法搜索的语音变成可搜索的文本。转录本为搜索引擎提供了额外的数据用于索引,使其能够爬取音频或视频内容的完整文本。这可能会增加你的内容在自然搜索结果中的可见度。在你的视频内容中加入转录本,更有可能使其在搜索结果中排名更高,包括像 YouTube 这样的 платформ。
转录本还可以针对特定关键词进行优化,提升目标受众发现你内容的可能性。这一过程不仅使你的内容对更广泛的观众(包括聋人或听力受损者)更具可访问性,而且还使搜索引擎能够索引音频和视频文件的内容。
自动化和人工转录服务都可以将音频和视频内容转换为文本。这些服务可以处理各种类型的内容,从播客和访谈到讲座和商业通讯。一旦转录完成,搜索引擎便可以对这些文本进行索引,从而使您的音频和视频内容通过基于文本的搜索被发现。
利用转录进行 SEO 和内容营销
转录不仅能让您的内容更具可访问性和可搜索性;它还可以显著提升您的 SEO 和内容营销效果。在转录中加入关键词可以提升您内容在搜索引擎上的可见性。转录内容还可以被重新加工成其他形式的内容,如博客文章、案例研究和信息图表,从而进一步增强您的内容营销策略。
转录在内容营销中也扮演着至关重要的角色,通过提升客户互动和覆盖面。发布您的音频和视频内容的转录本,让观众能够将您的内容翻译成他们的语言,从而覆盖更广泛的受众。
此外,转录本还可以帮助满足偏好阅读文本的用户以及有听力障碍的用户,使您的内容更加包容和可访问。这种包容性提高了用户体验,并扩大了您的受众覆盖范围,可能带来更多的网页流量和更高的搜索排名。
为了提高可发现性,内容的索引化是数字内容策略中的关键方面。通过有效地对您的内容进行索引,并利用音频和视频内容的转录,您可以显著提高内容的可见性,接触到更广泛的受众,并增强您的 SEO 和内容营销效果。随着数字环境的不断发展,这些策略将继续是那些希望最大化在线存在并取得可衡量商业成果的企业的核心要素。
在探索了利用转录进行 SEO 和内容营销的重要性之后,我们的下一个目标是创建可搜索的文本,旨在通过使用播客内容作为基础示例,充分挖掘 Whisper 的潜力。这一创新的结合简化了将口语转化为已编制索引的文本的过程,并为在数字平台上提高内容的可发现性和互动性开辟了新途径。
利用 FeedParser 和 Whisper 创建可搜索的文本
FeedParser 和 Whisper 的结合在从音频和视频中创建可搜索的文本方面具有高度相关性,尤其是对于通过 RSS 订阅分发的内容,如播客。FeedParser 是一个 Python 库,可以轻松下载和解析联合订阅的源,包括RSS、Atom和RDF源。它在自动化音频内容从各种渠道的获取中起着重要作用,随后可以进行转录处理。
当 FeedParser 和 Whisper 结合使用时,能够实现一个简化的流程,将 RSS 订阅源中的音频内容自动获取、下载并转录为文本。该文本随后可以被搜索引擎索引,从而提升内容的可发现性。例如,一集本来无法被搜索引擎访问的播客节目,可以通过 FeedParser 下载,再由 Whisper 转录成文本,使得该集播客的内容可以通过音频中提到的关键词和短语进行搜索。这个过程不仅让内容对更广泛的受众更加可及,同时也便于与数字图书馆和内容管理系统更好地集成,后者的可搜索性至关重要。
由 Whisper 生成的转录文本,结合 FeedParser 提取的音频内容,对于 SEO 和内容营销工作有极大的帮助。具体如下:
-
关键词优化:转录的文本提供了丰富的相关关键词来源。这些关键词可以战略性地用于优化网页、博客文章和其他内容的搜索引擎排名。通过在元标签、描述以及内容本身中加入这些关键词,可以提高相关内容的 SEO 排名,使其更容易被正在搜索相关话题的用户发现。
-
内容再利用:转录的文本可以作为创建额外内容格式的基础。例如,播客中的关键见解可以转化为博客文章、信息图表,甚至一系列社交媒体帖子。这延长了原始内容的生命周期,并满足了不同受众的偏好,从而增加了整体的覆盖范围和互动性。
-
增强用户体验:在音频和视频内容旁提供转录文本,通过迎合不同的消费偏好来改善用户体验。有些用户可能更喜欢阅读而非听内容,转录文本让这一点成为可能。此外,转录文本使得内容对听障或有听力障碍的用户更具可及性,从而扩大潜在的受众群体。
-
链接建设:转录文本可以创造更多的内部和外部链接机会,这是 SEO 中的一个关键因素。通过在转录中链接相关的文章、资源和其他播客,内容创作者可以建立一个更加互联的网络存在,这也是搜索引擎所青睐的。
-
分析与洞察:转录文本使得更详细的内容分析成为可能,这有助于制定 SEO 和内容营销策略。通过分析转录内容,创作者可以洞察与受众产生共鸣的主题、话题和语言,并据此调整内容策略。
使用 FeedParser 从 RSS 订阅源提取音频并通过 Whisper 进行处理的基础示例,可以扩展到许多行业的商业案例中。例如,这种方法可以在媒体和娱乐行业中用于转录和索引大量的视听内容,使其可以被搜索,并开辟新的盈利渠道。在客户服务领域,转录并分析客户电话可以提高服务质量和客户满意度。
此外,在市场调研和竞争分析中,转录播客和行业讲座可以提供关于市场趋势和竞争对手策略的及时洞察。在法律和合规领域,能够转录并搜索数小时的法律程序和监管会议记录,可以简化工作流程并确保遵守法规。
通过建立一个系统化的音频内容提取和转录过程,企业可以构建一个强大的框架,适应其他各种数据源,例如视频流、网络研讨会和实时通信。这将提升现有内容的可发现性,并帮助组织准备好利用新兴数据流的潜力。
FeedParser 和 Whisper 的整合是 AI 和机器学习如何应用于解决现实商业挑战的一个典型例子。通过利用这些技术,企业可以构建一个可扩展和灵活的基础设施,适应不断变化的数字化环境,在信息驱动的经济中提供竞争优势。
现在,让我们通过一个实用的 Python 笔记本,增强我们的技术专长,演示 FeedParser 的实际应用!
将 FeedParser 和 Whisper 集成进行文本转录
该笔记本LOAIW_ch06 _2_Transcripting_translating_RSS_with_Whisper.ipynb (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter06/LOAIW_ch06_2_Transcripting_translating_RSS_with_Whisper.ipynb)旨在弥合播客节目中锁定的大量知识与文本所提供的可访问性和分析潜力之间的差距。播客作为一种媒介,在过去几年里迅速普及,成为全球听众信息、娱乐和教育的丰富来源。然而,尽管播客的影响力不断扩大,但将内容转换为文本形式——这对于可访问性、可搜索性和进一步分析至关重要——仍然是一个挑战。这正是转录技术发挥作用的地方。
从 RSS 源中获取播客剧集——一种用于发布定期更新内容的标准联合格式——展示了如何自动化转录。这不仅让播客内容更具可访问性,还为内容创作者、研究人员和教育工作者提供了利用口语内容的全新途径。
通过结合 Python 编程,本笔记本将引导你完成安装必要的库、解析 RSS 源以列出可用的播客剧集、下载音频文件,并使用 Whisper 进行转录。这个过程展示了如何将不同技术整合,形成从音频到文本的无缝工作流:
-
设置 环境
环境设置包括安装在笔记本中将使用的必要 Python 库和系统工具:
!pip install -q cohere openai tiktoken !apt-get install ffmpeg !pip install -q "git+https://github.com/openai/whisper.git" cohere, openai, tiktoken, ffmpeg, and whisper. Here’s what the following commands are doing:* `feedparser`: This library is specifically designed for parsing RSS and Atom feeds. It simplifies working with feed data, such as extracting podcast information. Its role in the notebook is to parse the RSS feed provided by the user, enabling the extraction of details about the podcast episodes available for download and transcription.* `requests`: A fundamental library for making HTTP requests in Python. It’s used in the notebook to download audio files from the URLs specified in the podcast’s RSS feed. The simplicity and flexibility of requests make it a go-to choice for web scraping tasks, API interactions, and downloading files over HTTP. -
导入库
一旦环境设置完成,下一步是导入笔记本中使用的 Python 库:
import feedparser import requests import os import time from urllib.parse import urlparse import subprocess import re我们已经在前一部分了解了大部分这些库。让我们来看一下首次出现的库:
-
os:这是一个标准 Python 库,用于与操作系统进行交互。它用于文件路径操作和环境变量访问,确保笔记本能够保存文件、浏览目录等。 -
time:一个标准的 Python 库,这里用于处理与时间相关的任务。它可以包括在请求之间添加延迟,以避免过度负载服务器,或对操作进行计时以进行性能分析。 -
urlparse:Python 标准库的一部分,用于解析 URL。urlparse帮助拆解 URL 组件,这在从播客的 URL 中提取信息或确保 URL 格式正确后再进行请求时非常有用。 -
subprocess:这个模块允许你生成新进程、连接它们的输入/输出/错误管道,并获取它们的返回码。笔记本调用外部命令,如ffmpeg,来处理音频文件。 -
re:这是requests库的简称。
这些库共同构成了笔记本的核心,使其能够处理网页内容、处理音频文件,并高效地与文件系统和外部进程交互。这个准备工作对于顺利执行从解析 RSS 源到转录音频内容的后续任务至关重要。
-
-
list_episodes()帮助用户浏览播客系列中的可用内容,而download_episode()提供了访问特定剧集原始音频的方式。download_episode_start_end()函数提供了更精细的下载内容的方法。让我们简要探讨一下笔记本中定义的三个函数:-
list_episodes():此函数旨在解析给定的 RSS 源 URL,并列出所有可用的播客集。它系统地提取并整理每集的关键信息,如标题、URL(通常指向音频文件)和发布日期。以下是该函数的 Python 代码定义:def list_episodes(feed_url): d = feedparser.parse(feed_url) episodes = [] for entry in d.entries: title = entry.title published = time.strftime('%Y%m%d', time.gmtime(time.mktime(entry.published_parsed))) url = None for link in entry.links: if link.type == "audio/mpeg": url = link.href break if url: episodes.append((title, url, published)) return episodes
此函数作为用户查看播客系列内容的工具,使用户能够选择特定的集进行下载和转录。
-
download_episode():此函数用于下载特定的播客集。它需要输入播客集的 URL(通常从list_episodes()获取),并将音频文件保存到用户系统中的指定位置。以下是该函数的 Python 代码定义:from urllib.parse import urlparse def download_episode(url, filename=None): # If a custom filename is provided, append the appropriate extension from the URL if filename: parsed_url = urlparse(url) # Extract only the base path without any query parameters base_path = os.path.basename(parsed_url.path) ext = os.path.splitext(base_path)[1] filename += ext else: filename = os.path.basename(parsed_url.path) response = requests.get(url, stream=True) response.raise_for_status() with open(filename, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) return filename
此函数对于获取转录所需的原始音频数据至关重要。它确保用户能够直接访问感兴趣的内容并为进一步处理做好准备,例如使用 Whisper 进行转录。
-
download_episode_start_end():此函数是download_episode()的一个变种,具有额外的功能。它允许通过从给定的 URL 下载播客集并裁剪出从start_at秒到end_at秒的时间段来提取特定的时间片段。以下是该函数的 Python 代码定义:def download_episode_start_end(url, filename=None, start_at=0, end_at=None): parsed_url = urlparse(url) if filename: # Ensure the filename has the correct extension ext = os.path.splitext(parsed_url.path)[1] filename += ext else: filename = os.path.basename(parsed_url.path) # Download the file response = requests.get(url, stream=True) response.raise_for_status() temp_filename = "temp_" + filename with open(temp_filename, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) # Use ffmpeg to trim the audio file trimmed_filename = "trimmed_" + filename command = ['ffmpeg', '-y', '-i', temp_filename, '-ss', str(start_at)] if end_at is not None and end_at != 0: command.extend(['-to', str(end_at)]) command.extend(['-c', 'copy', trimmed_filename]) subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # Remove the original downloaded file os.remove(temp_filename) return trimmed_filename
以下是输入参数的详细说明:
-
url:播客集的 URL。 -
filename:保存播客的期望文件名。如果未提供,它将使用 URL 的最后一部分。 -
start_at:音频应从哪一秒开始裁剪的起始时间。 -
end_at:音频应该裁剪到的结束时间(以秒为单位)。如果未提供或设置为 0,音频将裁剪到结束位置。
在笔记本和实际演示中,
download_episode_start_end()函数允许我们处理音频文件的较小样本;在某些情况下,赞助商相关的内容对我们的学习和实验并不重要。这对于转录某一集的特定片段而非整个内容特别有用,能节省时间和计算资源。例如,如果播客每个片段的前 30 秒总是包含赞助广告,该函数可以直接下载其余部分的内容。 -
-
选择 RSS 源播客
然后,笔记本指定了播客的 RSS 源 URL 和要列出的集数。将此 URL 替换为您感兴趣的任何播客源:
# Gigantes Podcast Spanish podcast = '<Place RSS URL Here>' d = feedparser.parse(podcast) print(f"Podcast name:", d.feed.title) print(f"Number of episodes:", len(d.entries)) # List episodes episodes = list_episodes(podcast) # Print the first ten episodes print("Episodes:") for idx, (title, url, published) in enumerate(episodes, 1): print(f"{idx}. {published}-{title}") if idx == 10: break -
选择并下载 一集
接下来,笔记本提示用户从源中选择一集并进行下载。用户设置该集的编号,相关的音频文件将被获取:
episode_num = 5 #@param {type:"integer"} drive_folder = "" #@param {type:"string"} start_at_seconds = 1300 #@param {type:"integer"} end_at_seconds = 0 #@param {type:"integer"} title, url, published = episodes[episode_num - 1] custom_filename = published + '-' + (re.sub('[^A-Za-z0-9 ]+', '', title[:75]).replace(' ', '_')) # Download the selected episode audio_file = download_episode_start_end(url, drive_folder + custom_filename, start_at_seconds, end_at_seconds) print(f"Downloaded '{title}' as {audio_file}.") -
显示音频小部件
为了提供友好的用户界面,笔记本中显示了一个音频小部件,可以直接播放下载的播客集:
import ipywidgets as widgets widgets.Audio.from_file(audio_file, autoplay=False, loop=False) -
使用 Whisper 转录
最后,笔记本展示了如何使用 Whisper 来转录下载的播客集:
import whisper import torch # NLTK helps to split the transcription sentence by sentence import nltk nltk.download('punkt') from nltk import sent_tokenize model = whisper.load_model("small") audio = whisper.load_audio(audio_file) audio = whisper.pad_or_trim(audio) # make log-Mel spectrogram and move to the same device as the model mel = whisper.log_mel_spectrogram(audio).to(model.device) # detect the spoken language _, probs = model.detect_language(mel) audio_lang = max(probs, key=probs.get) print(f"Detected language: {audio_lang}") # decode the audio options = whisper.DecodingOptions(fp16=torch.cuda.is_available(), language=audio_lang, task='transcribe') result = whisper.decode(model, mel, options) # print the recognized text print("----\nTranscription from audio:") for sent in sent_tokenize(result.text): print(sent) # decode the audio options = whisper.DecodingOptions(fp16=torch.cuda.is_available(), language=audio_lang, task='translate') result = whisper.decode(model, mel, options) # print the recognized text print("----\nTranslation from audio:") for sent in sent_tokenize(result.text): print(sent)
我鼓励你运行 Google Colab 笔记本,提升其功能,并找到一个与行业相关的实际应用案例,借助这一基础知识,快速利用 Whisper 获得成功!
我们的下一步是深入探讨客户服务和教育平台,在这些领域,Whisper 的能力在转录准确性以及创造更加互动、响应和丰富的用户体验方面表现出色。
使用 Whisper 提升互动和学习
现在,我们将更深入地探讨如何将 Whisper 定制并整合到客户服务工具和语言学习平台中。在下一章节中,我们将探索一个动手操作的笔记本,展示如何利用 Whisper 尽可能地实现实时转录。同时,让我们简要提醒您在进行实时转录时使用 Whisper 的一些注意事项。
使用 Whisper 实现实时 ASR 的挑战
尽管 Whisper 提供了先进的语音识别能力,但其缺乏原生的实时转录支持,给开发者和组织带来了显著的挑战。然而,通过第三方优化、自定义实现以及利用第三方提供的 API,仍然可以将 Whisper 调整为适用于实时 ASR 应用程序。尽管这些解决方案也存在一定的挑战和成本,但它们为组织在实时场景中利用 Whisper 的强大功能提供了一条可行的路径。
部署 Whisper 用于实时自动语音识别(ASR)应用程序面临若干重大挑战,包括以下几点:
-
缺乏原生实时支持:Whisper 本质上是一个批量语音转文本模型,并未设计用于流式或实时转录。这一局限性对于需要即时转录的应用程序,如实时客户服务互动或直播语言翻译服务来说,是一个重大挑战。
-
基础设施和运营成本:运行 Whisper,特别是较大且更精确的模型,需大量基于 GPU 的计算资源,这可能会非常昂贵。组织需要准备投资必要的硬件或云服务,以支持 Whisper 的计算需求,而这些需求在大规模应用时可能会迅速增加。
-
内部 AI 专业知识:为了有效部署 Whisper,公司必须拥有一支内部的机器学习工程团队,能够在生产环境中操作、优化和支持 Whisper。这还包括开发 Whisper 本身不提供的附加 AI 功能,如说话人分离和个人身份信息(PII)遮蔽。
尽管存在这些挑战,组织仍然可以采取一些解决方案和变通方法,以便利用 Whisper 实现实时 ASR:
-
分块与批处理:Whisper 可以与分块算法一起使用,用于转录任意长度的音频样本,以处理较长的音频。然而,这并不是一种原生的实时解决方案。
-
第三方 API 提供商:几家公司已对 Whisper 进行了规模优化,解决了核心性能参数,并添加了高价值功能,如实时转录和语者分离。
-
定制实现:开发人员可以创建定制的解决方案,录制短音频片段并通过 Whisper 将其发送到服务器进行转录,从而模拟接近实时的体验。
在探讨了使用 Whisper 实施实时 ASR 的挑战之后,让我们回到主题,深入探讨这项技术如何彻底改变客户服务,改善互动,并提升整体客户体验。
在客户服务中实施 Whisper
强调实时转录领域的不断发展是至关重要的。Whisper 在客户服务中的集成不仅仅是技术创新,它还为组织创造了重要的机会,以提升服务质量,使每一次客户互动更加有影响力、个性化和高效。
在接下来的章节中,我们将探讨如何利用 Whisper 接近实时的转录能力定制客户回复,以及如何将这项技术与现有的客户服务工具无缝集成,以提升整体效率和效果。
使用接近实时转录定制回复
定制回复使其尽可能接近实时转录的能力可以显著提高客户服务质量。Whisper 在将口语转录为文本方面的高精度,使客户服务代表能够更加有效和高效地理解并解决客户问题。将转录能力从接近实时转变为实时的努力仍在不断发展,并迅速变化。这一进程具有潜在的重大影响:通过实时转录,客户互动过程中没有任何细节被遗漏,从而提供更加个性化和准确的回复。例如,Whisper 在处理各种语言任务方面的熟练程度,如其 API 文档中所强调的,使得能够转录来自不同语言和方言的客户查询,确保了客户服务的包容性和可访问性。
此外,将 Whisper 与客户服务平台集成可以自动化转录过程,缩短响应时间并提高整体效率。通过利用 Whisper 先进的语音识别能力,企业可以创建一个更加动态和响应迅速的客户服务环境,以满足全球客户的需求。
将 Whisper 与现有的客户服务工具集成
将 Whisper 与现有的客户服务工具集成可以简化操作并提升客户体验。在企业层面上,存在着展示这种集成潜力的需求,这将使得在聊天机器人和客户支持软件中能够识别和转录语音信息。目标是使这些集成能够促进语音和基于文本的互动之间的无缝过渡,从而帮助客户服务人员更高效地管理和回应查询。
这些集成最终将实现客户语音信息的自动转录并生成基于文本的响应,从而减少人工工作量并提高响应速度。
使用 Whisper 促进语言学习
Whisper 在语言学习平台中的集成可以彻底改变学习者接收反馈的方式。通过转录口语练习,Whisper 能够对发音、流利度和语言使用提供即时而准确的反馈。这种即时反馈机制对语言学习者至关重要,使他们能够迅速识别和纠正错误,从而加速学习过程。
Whisper 还可以被用来开发更具互动性和吸引力的语言学习体验。通过转录和分析口语,语言学习平台可以创建动态练习,适应学习者的熟练程度和学习风格。这种个性化的语言学习方法可以显著增强学习者的参与感和动力。此外,Whisper 处理多语言内容和大量音频文件的能力,使其成为创造多样化和包容性语言学习材料的理想工具,以满足全球受众的需求。
将 Whisper 集成到客户服务和语言学习平台中提供了许多提升用户互动和教育体验的机会。企业可以通过实时转录定制响应,并将 Whisper 与现有工具集成,从而彻底改变客户服务操作。类似地,通过即时反馈和互动体验来改善语言学习,可以显著提高学习成果。随着我们不断探索和扩展 Whisper 的功能,改变数字互动和学习体验的潜力是无限的。
如我们所见,Whisper 在客户服务和语言学习平台中的集成提供了巨大的潜力,能够提升用户互动和教育体验。然而,要充分实现这些 ASR 解决方案的好处,优化部署环境至关重要。在下一部分,我们将探讨如何通过优化部署环境来显著提高使用 Whisper 构建的 ASR 解决方案的性能、效率和可扩展性,从而确保企业和教育机构能够充分利用这项强大技术的潜力。
优化部署基于 Whisper 构建的 ASR 解决方案的环境
像 Whisper 这样的 ASR 解决方案的部署代表了人机交互的新前沿,展示了一个未来的可能性:技术以前所未有的准确性和效率理解并响应我们的需求。像 OpenAI 的 Whisper 这样的 ASR 系统可以通过提供更加自然和直观的人机沟通方式,革新各个行业。然而,这些系统在现实应用中的真正效能,往往依赖于一个关键方面,而这一点在开发的兴奋中常常被忽视:优化部署环境。
优化部署环境以运行像 Whisper 这样的 ASR 解决方案尤为重要。Whisper 本质上是一个最先进的 ASR 模型,利用深度学习将语音从音频准确转录成文本。尽管其功能令人印象深刻,但 Whisper 在实际操作中的性能和效率取决于其部署环境。这时,类似于优化深度学习模型在不同硬件上性能的工具所使用的优化原则变得至关重要。优化部署环境对 ASR 解决方案(如 Whisper)的整体性能、效率和可用性至关重要,原因如下:
-
计算效率和资源利用率:部署 ASR 解决方案时,计算效率是首要考虑因素之一。ASR 模型计算密集型,需要大量的处理能力来分析音频数据,并实时或接近实时地生成准确的转录文本。资源利用率低效可能导致瓶颈、增加运营成本,并且由于转录延迟或不准确,降低用户体验。优化部署环境能够确保 ASR 模型充分利用可用硬件,提升性能并减少延迟。
-
可扩展性和灵活性:优化部署环境的另一个关键方面是可扩展性。ASR 解决方案通常在需求可变的情况下部署,从移动设备上的个人用户到处理成千上万并发请求的企业级应用。优化的环境允许动态扩展,在需求波动时调整资源分配,而不影响性能。这种灵活性对维持服务质量和有效管理成本至关重要。
-
能源效率与可持续性:在今天这个日益关注环保的世界里,能源效率不仅仅是操作成本的问题,更是环境责任的问题。优化 ASR 解决方案的部署环境有助于通过最小化处理所需的能源消耗来推动可持续发展。这一点对于数据中心和基于云的服务尤为重要,因为计算任务的能源足迹已经成为一个日益严重的问题。通过确保像 Whisper 这样的 ASR 模型能够更加高效地运行,组织可以在提供高质量服务的同时减少碳足迹。
尽管某些优化技术的具体细节并未明确提及,但很明显,它们所体现的原则在实现这些好处方面起到了关键作用。这些技术有助于将深度学习模型适配到各种硬件架构,提高其性能和效率。通过采用如模型压缩、精度降低和硬件特定优化等技术,它们能够让 ASR 解决方案即使在较弱的设备上也能更快、更高效地运行。
这种优化方法不仅仅是关于逐步改进,而是关于释放 ASR 技术(如 Whisper)的全部潜力。通过确保这些模型能够在从高端服务器到边缘设备的广泛硬件上高效运行,我们可以扩大语音识别技术的可访问性和适用性。这种技术的民主化为创新应用铺平了道路,以前由于硬件限制,这些应用是无法想象的。
然而,实现这一愿景不仅仅需要先进的算法;它还要求对部署环境进行精心优化。在现实世界应用中部署如此复杂的模型,必须要有一个优化过的环境,以确保性能、效率和可扩展性。这就是OpenVINO发挥作用的地方,它作为一个免费的关键蓝图,帮助优化和部署自动语音识别(ASR)解决方案。
引入 OpenVINO
OpenVINO由英特尔开发,代表着开放视觉推理和神经网络优化。它是一个工具包,旨在加速应用程序和解决方案在各种英特尔硬件上的部署,优化性能。OpenVINO 通过为开发人员提供优化深度学习模型以进行推理的工具,尤其是在英特尔 CPU、GPU 和神经计算棒上的优化来实现这一点。这种优化包括模型压缩、精度降低和利用特定硬件加速。尽管如此,关键问题是,为什么要使用 OpenVINO 优化我们为 Whisper 部署的环境?原因如下:
-
最大化计算效率:作为高级自动语音识别(ASR)模型,Whisper 需要大量计算资源来处理音频数据并生成准确的转录。OpenVINO 优化这些模型,使其能够更高效地在现有硬件上运行,显著减少计算负载。这种效率对于实时或接近实时处理应用至关重要,延迟可能会降低用户体验。
-
增强可扩展性:在从个人移动设备到企业级系统等多样环境中部署 ASR 解决方案,需要可扩展性。OpenVINO 使 Whisper 模型能够动态调整以适应不同的需求,而不损失性能。这种可扩展性确保 ASR 解决方案能够有效处理高峰负载,这对于经历变化的使用模式的服务至关重要。
-
扩展可访问性:通过 OpenVINO 进行优化,改善性能,并使在更广泛设备上部署高级 ASR 解决方案如 Whisper 变得可行。通过降低运行 Whisper 等模型的硬件要求,OpenVINO 使得使用尖端语音识别技术在更广泛领域内成为可能。这种可访问性可以推动辅助技术等领域的创新,使数字服务更具包容性。
-
简化部署流程:OpenVINO 通过提供支持多种英特尔硬件的统一工具包来简化部署流程。这种流程优化对于希望在不同平台上部署 Whisper 的开发人员尤为有益,确保了一致的性能并减少了管理多个部署环境的复杂性。
OpenVINO 的开源性质是其吸引力和在部署 Whisper 等 ASR 解决方案中实用性的基石。作为英特尔的产品,OpenVINO 得到了全球公司支持的可靠性和创新。然而,它保持了开源项目的灵活性和协作精神。虽然我们不支持英特尔的商业性质,但要认识到 OpenVINO 为技术专业人士提供了一个强大且可靠的基础,使他们能够部署像 Whisper 这样的尖端 ASR 解决方案。工具包在 Apache License 版本 2.0 下的开源许可证允许高度灵活性和协作,使像我们这样的技术专业人士能够在不受单一供应商约束的情况下进行适应和创新。
工具包的全面文档、可用资源和示例证明了其可靠性和对开发成功的承诺。这些资源旨在指导我们优化和部署 AI 模型,确保即使是新手也能实现快速且成功的部署。作为全球公司英特尔的支持进一步增强了工具包的可信度,保证了持续的开发和维护。英特尔的支持不仅限于文档和示例。
OpenVINO 社区是一个充满活力的生态系统,开发者可以在其中互动、分享见解,并保持对最新进展的了解。
根据我的经验,OpenVINO 是那些希望高效部署 Whisper 或其他 ASR 模型的人的一个有吸引力的选择。它的开源特性,加上强大的文档、示例和英特尔的全球支持,为开发者提供了一个坚实的基础。然而,是否选择使用 OpenVINO 应该通过全面评估所有可用选项来做出决策,确保所选解决方案与项目的独特需求和目标相符。
在探索 OpenVINO 的实际示例实现之前,让我们先更好地理解 OpenVINO 如何利用其模型优化器使得像 Whisper 这样的模型在可用硬件上运行得更加高效。
应用 OpenVINO 模型优化器到 Whisper
OpenVINO 模型优化器旨在将来自流行框架(如 TensorFlow 和 PyTorch)的深度学习模型转换为优化后的中间表示(IR)格式。此 IR 格式专为在英特尔硬件平台(如 CPU、GPU 和 VPU)上进行高效推理而量身定制。通过将模型优化器应用于 Whisper 模型,我们可以显著加速其性能,减少内存占用,并能够在不牺牲性能的情况下动态调整以应对不同的需求。
那么,这个优化过程在后台是如何工作的呢?模型优化器执行几个重要步骤:
-
转换模型:它首先将 Whisper 模型从原始格式(例如 PyTorch)转换为 OpenVINO 的 IR 格式。这涉及分析模型架构、提取参数,并将操作映射到 OpenVINO 支持的原语。
-
融合模型层:优化器识别可以合并为单一操作的相邻层,从而减少整体计算开销。例如,连续的卷积层和激活层可以融合。
-
折叠常量:它预计算常量表达式并直接将其嵌入到模型图中。这消除了推理过程中冗余的计算,从而节省了宝贵的处理时间。
-
剪枝:优化器删除所有不对模型输出有贡献的节点或层,包括无效分支和未使用的操作,从而使得模型更加精简和高效。
-
量化:它可以选择性地将模型的权重和激活从浮动点精度转换为更低精度的数据类型,如 INT8。此量化显著减少了内存带宽和存储需求,同时保持了可接受的准确性。
一旦 Whisper 模型经过这些优化步骤,它就可以通过 OpenVINO 的推理引擎进行部署。优化后的模型能够充分利用英特尔的硬件架构,利用指令集扩展和并行处理能力。
将 OpenVINO 模型优化器应用于 Whisper 模型的影响非常显著。它使得在资源受限的边缘设备上实现实时语音识别成为可能,为汽车、医疗保健和智能家居自动化等领域的智能语音界面开辟了新的可能性。
此外,优化后的模型可以通过后训练量化和剪枝进行微调,使开发者能够在准确性和效率之间为特定的应用场景找到完美的平衡。
作为一个实际例子,我们从运行 Google Colab 笔记本 LOAIW_ch06_3_Creating_YouTube_subtitles_with_Whisper_and_OpenVINO.ipynb(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter06/LOAIW_ch06_3_Creating_YouTube_subtitles_with_Whisper_and_OpenVINO.ipynb)开始,探索 OpenVINO 并理解其基础功能。
使用 Whisper 和 OpenVINO 生成视频字幕
在这一部分,我们将带您通过一个交互式演示,测试以下转录流程:我们提供一个 YouTube 链接,并选择转录或翻译音频,并为该视频返回自动生成的字幕。当然,YouTube 已经实现了自动字幕、转录和翻译功能。我们并不是试图复制这些现有功能,而是通过这个实践演示来展示如何在视频中创建和嵌入字幕的技术细节。
首先,我们将导入 Python 库并安装诸如 OpenVINO、transformers 和 Whisper 等依赖项。这些库为处理 AI 模型和语音数据提供了基础。
接下来,我们加载一个预训练的 Whisper 模型。让我们从基础模型开始。然后,我们将使用 OpenVINO 的模型转换工具来优化这些模型,并将结果保存到磁盘,方便以后重用。这个过程会跟踪模型、冻结参数,并转换为 OpenVINO 高效的 IR 格式。
最后,我们将使用优化后的模型构建我们的转录管道,提取视频中的音频,通过 Whisper 的编码器和解码器模型生成文本,并将结果保存为SubRip(SRT)字幕文件。我们还可以在一步中将其翻译成英文!
在后台,笔记本会下载视频、分离音频、利用 Whisper 和 OpenVINO 进行快速语音识别,准备 SRT 文件,并可以在原视频上显示字幕。
理解先决条件
我们首先通过以下命令从 GitHub 仓库导入一个名为 utils.py 的辅助 Python 工具模块:
!wget -nv "https://github.com/PacktPublishing/Learn-OpenAI-Whisper/raw/main/Chapter06/utils.py" -O utils.py
该模块包含我们稍后用于预处理和后处理的函数。接下来,我们安装关键的软件依赖项,以便能够处理 AI 模型和语音数据:
%pip install -q cohere openai tiktoken
%pip install -q "openvino>=2023.1.0"
%pip install -q "python-ffmpeg<=1.0.16" moviepy transformers --extra-index-url https://download.pytorch.org/whl/cpu
%pip install -q "git+https://github.com/garywu007/pytube.git"
%pip install -q gradio
%pip install -q "openai-whisper==20231117" --extra-index-url https://download.pytorch.org/whl/cpu
以下是相关方面的更多细节:
-
openvino模块和ov核心对象。 -
Transformers: 一个 Pytorch 库,包含如 Whisper 这样的架构,用于自然语言处理和语音任务。它提供可重用的模型实现。我们依赖它加载预训练的 Whisper 基础模型进行语音识别。
-
python-ffmpeg用于处理视频输入/输出并从视频中提取音频流。这些音频数据成为我们 Whisper 流水线的输入。它还包含moviepy,使得在 Python 中编辑和分析视频/音频变得更加简单。 -
Whisper: OpenAI 的语音识别模型包包含模型实现、分词、解码和音频转录的实用函数。这些是我们所需要的关键功能!
-
Pytube: 用于从 YouTube 链接下载视频。它填充了启动每次语音识别运行的初始视频文件。
-
Gradio: 这个程序为我们的互动演示创建了用户界面。它允许用户提供 YouTube URL,并通过网页浏览器选择翻译/转录选项。
通过预先处理导入和依赖项,我们为核心工作流铺平了道路。辅助工具也是一个关键要素;它们封装了可重用的逻辑,使我们的主代码可以专注于 Whisper 集成。
实例化 Whisper 模型
让我们深入到笔记本的核心部分,在那里我们实例化 Whisper 模型。正如我们已经确定的,Whisper 是一个基于变压器的编码器-解码器模型,擅长将音频频谱特征转换为一系列文本标记。这个过程从原始音频输入开始,通过特征提取器转化为 log-Mel 频谱图。然后,变压器编码器接管,编码频谱图并生成一系列编码器隐藏状态。最后,解码器根据之前的标记和编码器的隐藏状态进行自回归预测文本标记。
为了在我们的笔记本中实现这个模型,我们首先选择适合我们需求的模型大小。我们为本教程选择了 Whisper 基础 模型,尽管我们列出的步骤同样适用于 Whisper 系列中的其他模型。通过使用一个名为 model_id 的 widgets 对象,我们呈现了一个下拉菜单,允许选择不同的模型大小,确保对各种用例的灵活性和定制:
from whisper import _MODELS
import ipywidgets as widgets
model_id = widgets.Dropdown(
options=list(_MODELS),
value='base',
description='Model:',
disabled=False,
)
model_id
一旦选择了模型大小,我们就加载它并设置为评估模式。这是准备模型进行推理的关键步骤,确保它的表现与训练时一致:
import whisper
model = whisper.load_model(model_id.value, "cpu")
model.eval()
pass
随着我们的进展,我们将把 Whisper 的编码器和解码器转换为 OpenVINO IR,确保我们的模型能够进行高性能推理。正如我们在之前介绍的 OpenVINO IR 框架中提到的那样,IR 专为在 Intel 硬件平台(如 CPU、GPU 和 VPU)上进行高效推理而设计。通过应用 Model Optimizer 到 Whisper 模型,我们可以显著加速其性能、减少内存占用,并根据不同需求动态调整而不影响性能。这个转换过程不仅是技术上的必要性,也是在一个强大的预训练模型和可部署解决方案之间搭建桥梁的转型步骤。
在接下来的步骤中,我们将继续优化我们的管道,并准备进行转录过程。我们将选择推理设备,运行视频转录管道,并在为我们选择的视频生成字幕时见证我们的努力成果。
将模型转换为 OpenVINO IR 格式
笔记本中的下一部分是关于将 Whisper 模型转换为 OpenVINO IR 格式,以便与 OpenVINO 一起实现最佳性能。这个过程涉及将 Whisper 模型的编码器和解码器部分进行转换。转换过程从编码器开始:
mel = torch.zeros((1, 80 if 'v3' not in model_id.value else 128, 3000))
audio_features = model.encoder(mel)
if not WHISPER_ENCODER_OV.exists():
encoder_model = ov.convert_model(model.encoder, example_input=mel)
ov.save_model(encoder_model, WHISPER_ENCODER_OV)
使用零张量创建一个示例输入。然后使用ov.convert_model函数将编码器模型转换为 OpenVINO 的 IR 格式。转换后的模型保存到磁盘以备将来使用。
接下来,解码器进行转换。由于解码器具有自回归性质,根据先前预测的令牌和编码器隐藏状态预测下一个令牌,因此这个过程稍微复杂些。为了处理这个问题,覆盖解码器注意力模块和残差块的前向方法以显式存储缓存值:
tokens = torch.ones((5, 3), dtype=torch.int64)
logits, kv_cache = model.decoder(tokens, audio_features, kv_cache=None)
tokens = torch.ones((5, 1), dtype=torch.int64)
if not WHISPER_DECODER_OV.exists():
decoder_model = ov.convert_model(model.decoder, example_input=(tokens, audio_features, kv_cache))
ov.save_model(decoder_model, WHISPER_DECODER_OV)
然后使用ov.convert_model函数将解码器转换为 OpenVINO 的 IR 格式,示例输入包括令牌、音频特征和键/值缓存。转换后的解码器模型也保存到磁盘以备将来使用。
将 Whisper 模型转换为 OpenVINO IR 格式后,我们现在准备好准备推理管道。这是一个关键步骤,我们在这一步将转换后的模型集成到一个协调的管道中,该管道将处理音频并生成所需的字幕。
在运行转录管道之前,我们必须选择适当的推理设备。OpenVINO 让我们可以选择如 CPU、GPU 或专用加速器如 VPU 等元素。对于我们的目的,我们将使用AUTO选项,这允许 OpenVINO 自动选择最合适的设备:
core = ov.Core()
device = widgets.Dropdown(
options=core.available_devices + [AUTO»],
value='AUTO',
description='Device:',
disabled=False,
)
device
通过选择推理设备,我们确保我们的管道针对手头的硬件进行了优化,这对于在推理过程中实现最佳性能至关重要。
使用所选设备,我们为 OpenVINO 推理修补 Whisper 模型。这包括用 OpenVINO 对应部件替换原始的 PyTorch 模型组件:
from utils import patch_whisper_for_ov_inference, OpenVINOAudioEncoder, OpenVINOTextDecoder
patch_whisper_for_ov_inference(model)
model.encoder = OpenVINOAudioEncoder(core, WHISPER_ENCODER_OV, device=device.value)
model.decoder = OpenVINOTextDecoder(core, WHISPER_DECODER_OV, device=device.value)
这个补丁过程至关重要,因为它将 Whisper 模型适配到 OpenVINO 上,从而利用 OpenVINO 运行时的性能优势。
理解 OpenVINO IR 格式
推理模型通常是在多个平台上开发和训练的,可能会非常庞大且依赖于特定架构。为了在任何设备上高效推理并充分利用 OpenVINO 工具,模型可以转换为 OpenVINO IR 格式。
OpenVINO IR 是 OpenVINO 独有的,通过使用 API 进行模型转换生成的。这个过程将广泛使用的深度学习操作转换为 OpenVINO 内部等效的形式,并结合了原始训练模型的必要权重和偏置。转换过程会生成两个关键文件,这些文件具有以下文件扩展名:
-
.xml- 概述了模型的结构。 -
.bin- 存储模型的权重和二进制信息。
XML 文件通过 <layer> 标签概述了模型的结构,表示操作节点,并通过 <edge> 标签表示数据流之间的连接。每个操作节点都详细列出了指定操作特征的属性。例如,卷积操作的属性包括 dilation(膨胀),stride(步幅),pads_begin(开始填充)和 pads_end(结束填充)。
大的常数值,例如卷积权重,并不会直接存储在 XML 文件中。相反,这些值会引用二进制文件中的一个部分,并以二进制形式存储。
运行视频转录管道
现在,我们已经准备好进行视频转录。我们首先从 YouTube 选择一个视频,下载它并提取音频。图 6.1 展示了使用 Whisper 模型的视频转录管道:

图 6.1 – 运行视频转录管道
一旦提供了视频 URL,代码将自动下载视频并保存到本地文件系统。下载的视频文件将作为转录管道的输入。根据视频长度和网络速度,这个过程可能需要一些时间:
from pytube import YouTube
from pathlib import Path
print(f"Downloading video {link.value} started")
output_file = Path("downloaded_video.mp4")
yt = YouTube(link.value)
yt.streams.get_highest_resolution().download(filename=output_file)
print(f"Video saved to {output_file}")
一旦我们获得了音频,就可以选择模型的任务(转录或翻译内容):
task = widgets.Select(
options=["transcribe", "translate"],
value="translate",
description="Select task:",
disabled=False
)
task
选择任务后,我们调用 model.transcribe 方法来执行转录:
transcription = model.transcribe(audio, task=task.value)
转录结果将以 SRT 文件格式呈现,这是一个广泛使用的字幕格式,兼容许多视频播放器。这个文件可以在播放视频时将转录内容嵌入视频中,或者使用如 ffmpeg 等工具将其直接集成到视频文件中:
from utils import prepare_srt
srt_lines = prepare_srt(transcription, filter_duration=duration)
# save transcription
with output_file.with_suffix(".srt").open("w") as f:
f.writelines(srt_lines)
print("".join(srt_lines))
最后,我们可以查看带有生成字幕的视频,以验证转录管道的准确性和同步性:
import gradio as gr
def video_with_srt(t_video, t_srt):
return t_video, t_srt
demo = gr.Interface(
fn=video_with_srt, # Pass the function reference
inputs=[
gr.Textbox(label=»Video File Path»),
gr.Textbox(label=»SRT File Path»)
],
outputs="video",
examples=[[‹downloaded_video.mp4›, ‹downloaded_video.srt›]],
allow_flagging=»never»
)
try:
demo.launch(debug=True)
except Exception as e:
print(e)
demo.launch(share=True, debug=True)
通过这些步骤,我们成功地驾驭了使用 OpenAI 的 Whisper 和 OpenVINO 搭建高效视频转录管道的复杂过程。此过程展示了 AI 在理解和处理人类语言方面的强大能力,并展示了此类技术在创建可访问内容中的实际应用。
摘要
我们的旅程已接近尾声。本章精心设计,旨在指导你通过使用 Whisper 处理多种任务的细致过程,强调在多个语言和方言中的转录精准度,与数字平台的集成以提升内容可访问性,以及创新地利用 Whisper 改善客户服务体验和教育内容传递。
旅程从深入探讨精确转录开始,我们在此过程中了解了 Whisper 在处理多语言转录方面的能力。本节突出了该技术对不同语言的适应性,展示了 Whisper 如何针对特定语言需求进行微调,从而扩大了其在全球平台上的适用范围。
我们还学会了如何利用 PyTube 作为一种新兴的战略方法,将 YouTube 内容与 Whisper 集成,重点介绍了下载和转录视频的过程。这一整合有助于访问大量信息库,并展示了 Whisper 在处理和转录来自不同来源的音频时的强大能力。
为了提高可发现性而对内容进行索引,我们将重点转向了转录音频和视频内容在 SEO 方面的好处。通过将口语转化为可搜索的文本,本节展示了 Whisper 如何显著影响内容的可见性和可访问性,使其成为内容创作者和营销人员提升数字足迹的关键工具。
利用 FeedParser 和 Whisper,我们进一步拓展了创建可搜索文本的探索,特别是针对播客内容。这个创新的组合为弥合音频内容与基于文本的搜索之间的鸿沟提供了解决方案,提供了关于如何将播客转录以改善 SEO 和观众互动的见解。
本章的一个关键方面是探索了使用 Whisper 进行近实时转录,承认了在实现即时转录需求方面的挑战和未来潜力。尽管实时转录代表了一个不断发展的前沿,但本章为理解当前的能力和局限性奠定了基础,为未来在这一领域的进展铺平了道路。
随着本章的结束,你现在已经具备了对 Whisper 当前应用的全面理解,并窥见了语音技术未来的潜在方向。通过所提供的笔记本完成的基础工作,展示了所讨论概念的实际应用,强化了学习体验。
展望未来,第七章预示着这次探索的激动人心的延续。它旨在深入研究 Whisper 量化以及使用 Whisper 进行近实时转录的可能性。下一章将为你提供知识和工具,进一步利用语音技术的进展,推动 Whisper 的潜力,开启语音识别和处理领域的突破性应用。
第七章:探索高级语音功能
欢迎来到第七章,在这里我们将开始一段激动人心的旅程,探索 OpenAI Whisper 的高级语音功能。本章将深入探讨提升 Whisper 性能的技术,例如 量化,并揭示其在实时语音识别中的潜力。
我们首先检查量化的力量,这是一种在保持准确性的同时减少模型大小和计算要求的技术。您将学习如何通过使用 CTranslate2 和 Open Visual Inference and Neural Network Optimization(OpenVINO)等框架将量化应用于 Whisper,从而在资源受限的设备上实现高效部署。
在上一章中,我们简要讨论了使用 Whisper 实现实时 ASR(自动语音识别)面临的挑战,而在本章中,我们将深入探讨当前的局限性以及正在进行的研究工作,以使实时转录成为现实。我们将探索使用 Whisper 和 Gradio 构建流式 ASR 演示的实验性方法,并提供实际示例,展示 Whisper 在实时语音识别中的潜力。
在本章中,我们将涵盖以下主要内容:
-
利用量化的力量
-
面对实时语音识别的挑战与机遇
到本章结束时,您将深入了解优化 Whisper 性能的高级技术,理解实时语音识别的潜力与挑战。您将掌握实用的知识和动手经验,将这些技术应用到您的项目中,突破 Whisper 的应用边界。
那么,让我们解锁 Whisper 高级语音功能的全部潜力,使您能够构建创新应用,改变我们在数字世界中与语言互动的方式。
技术要求
为了利用 OpenAI Whisper 的功能进行高级应用,本章使用 Python 和 Google Colab,旨在简化使用和提高可访问性。Python 环境设置包括用于转录任务的 Whisper 库。
关键要求:
-
Google Colab 笔记本:这些笔记本已经设置好,以最小所需的内存和计算能力运行我们的 Python 代码。如果 T4 GPU 运行时类型可用,请选择它以获得更好的性能。
-
Python 环境:每个笔记本都包含加载所需 Python 库的指令,包括 Whisper 和 Gradio。
-
Hugging Face 账户:某些笔记本需要 Hugging Face 账户和登录 API 密钥。Colab 笔记本中包含有关此主题的信息。
-
麦克风和扬声器:一些笔记本实现了一个 Gradio 应用,支持语音录制和音频播放。连接到计算机的麦克风和扬声器可以帮助你体验交互式语音功能。另一种选择是通过手机打开 Gradio 在运行时提供的 URL 链接;在那里,你可以使用手机的麦克风录制语音。
-
GitHub 仓库访问:所有 Python 代码,包括示例,都可以在本章的 GitHub 仓库中找到(
github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter07)。这些 Colab 笔记本已准备好运行,提供了一个实践性强、动手操作的学习方法。
通过满足这些技术要求,你将能够在不同的环境中探索 Whisper,同时享受 Google Colab 提供的流畅体验和 GitHub 上的全面资源。
随着我们深入了解 Whisper 的高级功能,我们必须探索一些技术,以优化其性能和效率。量化就是其中一个备受关注的技术。在这一部分中,我们将探索量化的强大功能,以及如何利用它来提升 Whisper 的部署能力。
利用量化的强大功能
机器学习中的量化,特别是在 ASR 中,指的是减少模型参数的精度。通常,通过将连续的浮点值范围映射到一个离散的值集合,通常是整数,来实现量化。量化的主要目标是减少模型的计算复杂性和内存占用,这对于将 ASR 系统部署到资源有限的设备(如手机或嵌入式系统)上至关重要。量化具有以下几个重要作用:
-
减小模型尺寸:使用低精度表示模型的权重可以显著减小模型的整体尺寸。这对于设备端部署尤为重要,因为设备的存储空间有限。
-
提高推理速度:在许多硬件平台上,低精度算术运算比高精度运算更快,特别是那些没有专用浮点单元的硬件。这可以加快推理时间,对于实时应用(如自动语音识别 ASR)至关重要。
-
提高能效:量化后的模型需要更少的计算资源,从而降低功耗。这对于电池供电的设备至关重要。
-
扩展硬件兼容性:许多边缘设备对整数计算进行了优化。量化使得模型能够利用这些硬件优化。
在 ASR 中,一些标准的机器学习量化技术包括 向量量化(VQ)、int8 量化 和 低比特量化。我们简要描述每一种技术:
VQ 是一种经典的技术,广泛应用于包括语音编码和识别在内的各个领域。它涉及将向量从一个充足的向量空间映射到有限数量的区域,这些区域可以用更少的比特有效表示。VQ 已经成功应用于语音识别系统,通过有效压缩特征空间来提高性能。
INT8 量化 是一种最近的方法,通过使用 8 位整数代替 32 位浮点数来表示模型的权重和激活。这种方法可以在不显著降低性能的情况下,将模型大小缩小 4 倍,因为它在类型之间进行精确的四舍五入,而不是简单地截断数据。
随着进一步的进展,出现了低比特量化技术,探索了甚至为 1 位的激进量化。尽管这可以显著减少存储和运行时,但可能会增加词错误率(WER)在 ASR 任务中的表现。然而,通过精心设计,例如 DistilHuBERT(huggingface.co/ntu-spml/distilhubert),可以实现模型压缩,同时保持最小的准确度损失。
请注意,量化会引入量化误差,如果管理不当,可能会降低模型的性能。为减轻这些影响,已经开发了如量化感知训练(QAT)和训练后量化(PTQ)等技术。QAT 在训练过程中模拟量化过程,使模型能够适应较低的精度。另一方面,PTQ 在训练后应用量化,使用校准技术调整量化参数,以实现最小的性能损失。
图 7.1 显示了 ASR 模型的量化过程的高层次视图:

图 7.1 – ASR 模型的量化过程
图中大致概述的步骤是通用的,旨在提供基础概览。让我们更详细地回顾每个步骤:
-
准备:初始步骤是使用高精度(32 位浮点)表示法训练 ASR 模型。这确保了模型捕捉到准确语音识别所需的复杂模式。
-
int8),甚至更低。你的选择应考虑模型大小、计算效率和准确性。比特深度的选择直接影响模型大小、计算速度和准确度之间的权衡。较低的比特深度显著减少模型的内存占用并提高计算效率,但它们可能引入量化误差,从而可能降低模型性能。挑战在于选择一个最佳的比特深度,既能最小化这些误差,又能实现所需的效率提升。
-
校准:使用一个代表性的数据集通过模型进行推理以进行 PTQ。此步骤有助于收集激活值的分布统计信息,这对于确定量化参数至关重要。
-
权重和激活量化:使用收集到的统计信息,将模型的权重和激活量化到选定的位深度。这涉及使用比例因子和零点将高精度值映射到较低精度的空间。
-
QAT(可选):在某些情况下,模型会进行 QAT,即在训练过程中模拟量化效果。这有助于模型适应降低的精度,从而可能减轻准确度损失。
-
测试与微调:量化后,评估模型的性能,以确保准确度保持在可接受范围内。如有必要,进行微调或调整量化参数。
-
部署:量化后的模型被部署到目标硬件上,受益于减少的内存使用和更快的推理时间。这使得它适用于边缘设备或计算资源有限的环境。
有多个量化版本的 Whisper 可用,并且更多版本正在开发中。根据我的经验,我发现 Faster-Whisper 和 Distil-Whisper 提供了更优越且可靠的性能。以下是它们的简要描述:
-
Faster-Whisper在 CTranslate2 中实现了 Whisper 模型,这是一个用于高效推理 Transformer 模型的库。它通过各种方法提高效率,如权重量化、层融合和批量重排序。量化在 Faster-Whisper 中发挥了重要作用,通过减少模型的内存占用和加速推理,特别是在 GPU 上。我们将在使用 WhisperX 和 NVIDIA 的 NeMo 进行语音分离章节中体验 Faster-Whisper,因为 WhisperX 使用 Faster-Whisper 进行语音转文本(STT)转录。
-
small.en、medium.en和large-v2模型,它们在保持相当 WER 的同时更快且更小。量化可以进一步提高 Distil-Whisper 的效率,通过减少模型参数的精度,从而实现更快的处理速度和更低的内存需求。
在我们探索量化的强大功能时,让我们通过使用 CTranslate2 框架来深入了解一个实际示例。CTranslate2 提供了一种高效的方式来量化和优化 Whisper 模型,以便在资源受限的设备上部署。
使用 CTranslate2 量化 Whisper 并通过 Faster-Whisper 进行推理
请查找并打开LOAIW_ch07_1_Quantizing_Whisper_with_CTranslate2.ipynb Colab 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter07/LOAIW_ch07_1_Quantizing_Whisper_with_CTranslate2.ipynb)。该笔记本演示了如何使用 CTranslate2 和 Faster-Whisper 框架来加载量化模型并进行推理(转录或翻译)。你应先在 CPU 上运行笔记本,然后在 GPU 上运行。由于我们使用的是小型 Whisper 模型、短音频文件和量化,CPU 性能应该相对较快。图 7.2提供了量化过程的概览,从准备音频数据、转换和量化模型,到评估其在语言检测和转录任务中的表现。量化在优化模型以适应资源受限的环境中至关重要,它使得语音识别能力高效且准确:

图 7.2 – 使用 CTranslate2 框架量化 Whisper 过程的高层视图
以下步骤概述了量化过程。有关完整的端到端实现,请参考LOAIW_ch07_1_Quantizing_Whisper_with_CTranslate2.ipynb笔记本。本节将展示高层步骤和选定的代码片段来说明该过程。请记住,笔记本中包含了额外的细节和解释,帮助你全面理解量化工作流。以下是该过程的详细分解:
-
ctranslate2、transformers和faster-whisper:!pip install ctranslate2 !pip install transformers[torch]>=4.23 !pip install faster-whisper这些库对于量化以及充分利用 Whisper 模型的能力至关重要。
-
下载示例音频文件:从我们的 GitHub 仓库下载两个文件,用于测试 Whisper 模型的转录能力:
!wget -nv https://github.com/PacktPublishing/Learn-OpenAI-Whisper/raw/main/Chapter01/Learn_OAI_Whisper_Sample_Audio01.mp3 librosa:导入 ctranslate2
从 IPython.display 导入 Audio
导入 librosa
导入 transformers
加载并重采样音频文件。
sampling_frequency = 16000
audio, _ = librosa.load("Learn_OAI_Whisper_Sample_Audio01.mp3", sr=sampling_frequency, mono=True)
Audio(audio, rate=sampling_frequency)
This step is crucial for ensuring that the audio data is in the correct format for processing by the Whisper model. -
openai/whisper-tiny) 被转换为 CTranslate2 格式,这是一种更高效的推理格式:ct2-transformers-converter command converts models to the CTranslate2 format, optimized for fast inference. The core CTranslate2 implementation is framework-agnostic. The framework-specific logic is moved to a conversion step that loads supported models into a unified representation. The weights are then optionally quantized and saved into an optimized binary format for efficient storage and processing.When converting models using the CTranslate2 tool, the output directory typically contains several key files for the CTranslate2 engine to load and run the model. The command streamlines the process of preparing models for deployment in environments where computational efficiency is crucial and a preparatory step for quantization. While the exact output files can vary depending on the specific model being converted and the options used during conversion, standard files include the following:* `config.json`: This JSON file contains configuration information about the model, such as its architecture, the size of its layers, and other hyperparameters. This information is crucial for the CTranslate2 engine to interpret the model’s binary weights and perform inference correctly.* `model.bin`: This is the binary file containing the quantized weights of the model. Quantization reduces the precision of the model’s weights, which can significantly decrease the model size and improve inference speed, often with minimal impact on accuracy.* `vocabulary.json` or similar vocabulary files (for example, `source.spm` and `target.spm` for models using `SentencePiece` tokenization): These files contain the mapping between tokens (words or subwords) and their corresponding indices in the model’s vocabulary. This mapping is essential for converting input text into a format that the model can process (tokenization) and converting the model’s output back into human-readable text (detokenization).These files represent the converted and optimized model and are ready for use with CTranslate2\. The conversion process might also include copying additional files necessary for the model’s operation, such as tokenization configuration (`tokenizer_config.json`), special tokens mapping (`special_tokens_map.json`), and others, depending on the model’s requirements and the conversion options you use. -
INT8):!ct2-transformers-converter --force --model openai/whisper-tiny --output_dir whisper-tiny-ct2-int8 \ INT8) -
16 位整数(
INT16) -
16 位浮动点(
FP16) -
16 位大脑浮动点(
BF16)
这一步显著减少了模型的大小和计算需求,使其更适合在资源有限的设备上部署。
-
检测语言:量化模型检测所提供音频样本的语言:
# Detect the language. results = model.detect_language(features) language, probability = results[0][0] print("Detected language %s with probability %f" % (language, probability))这一步对于确保模型准确理解音频数据的上下文非常重要。
-
processor.tokenizer.convert_tokens_to_ids()方法:prompt = processor.tokenizer.convert_tokens_to_ids( [ "<|startoftranscript|>", language, "<|transcribe|>", "<|notimestamps|>", # Remove this token to generate timestamps. ] ) # Load the model on device model = ctranslate2.models.Whisper("whisper-tiny-ct2-int8", device=this_device) # Run generation for the 30-second window. results = model.generate(features, [prompt]) transcription = processor.decode(results[0].sequences_ids[0]) print(transcription))这展示了模型即使在量化后也能准确转录语音的能力。
-
评估性能:音频转录后,代码评估量化后模型的性能,如测量转录所用的时间:
# Print the end time and the delta in seconds and fractions of a second. end = time.time() print('start: ', start) print('end: ', end) print('delta: ', end - start) print('delta: ', datetime.timedelta(seconds=end - start))这一评估对于了解量化对模型效率和准确性的影响至关重要。
结果显示了实证证据,表明量化后的 Whisper 模型能够以更小的内存和处理足迹进行良好的转录。基于我们对量化的理解,让我们现在集中研究另一个强大的框架——OpenVINO。我们将探讨 OpenVINO 如何用于量化 Distil-Whisper 模型,提供一个更加全面和严格的量化过程。
使用 OpenVINO 量化 Distil-Whisper
这个实践练习依赖于LOAIW_ch07_2_Quantizing_Distil_Whisper_with_OpenVINO.ipynb Colab 笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter07/LOAIW_ch07_2_Quantizing_Distil_Whisper_with_OpenVINO.ipynb)。由于 OpenVINO 的原因,我建议你在 Colab 中使用 CPU 和大内存运行此笔记本。即使存在 NVIDIA GPU,OpenVINO 也不会使用它,仅使用 Intel GPU。不过,OpenVINO 提供的库经过优化,可以在普通 CPU 上运行,因此在计算处理资源有限时,这也是一个显著的优势。然而,进行量化时你至少需要 50GB 的内存。该笔记本提供了利用 Distil-Whisper(基于 WhisperX),一个经过蒸馏的 Whisper 模型变体,与 OpenVINO 结合用于自动语音识别(ASR)的全面指南。Distil-Whisper 大大减少了参数数量(从large-v2中的 1,550 个参数减少到distill-large-v2中的 756 个参数,约减少 50%),并在保持与原始 Whisper 模型在 WER(字错误率)方面相近性能的同时,提高了推理速度。
图 7.3概述了将 Distil-Whisper 模型转换为 OpenVINO 中间表示(IR)格式,应用 INT8 PTQ 以提高性能,并运行模型进行语音识别任务:

图 7.3 – 使用 OpenVINO 框架量化 Distil-Whisper 的高层架构图
以下子章节将描述使用 OpenVINO 框架量化 Distil-Whisper 模型的关键步骤。我们将安装必要的库,加载模型,将其转换为 OpenVINO 格式,并应用量化。我们还将探索如何使用 Optimum 库加载量化后的模型,并将其与 Hugging Face 管道集成。最后,我们将使用量化后的模型进行推理,并将其性能和准确性与原始模型进行比较。
安装库
首先,过程指导安装必要的 Python 库:
%pip install -q "transformers>=4.35" onnx "git+https://github.com/huggingface/optimum-intel.git" "peft==0.6.2" --extra-index-url https://download.pytorch.org/whl/cpu
%pip install -q "openvino>=2023.2.0" datasets "gradio>=4.0" "librosa" "soundfile"
%pip install -q "nncf>=2.6.0" "jiwer"
让我们更详细地查看每个库,重点介绍那些我们之前没有描述过的库:
-
Transformers:这个库用于处理自然语言处理任务,如文本分类、信息抽取和问答。它提供了访问预训练模型的功能,如 BERT、GPT-2,以及在本例中用于 ASR 的 Distil-Whisper 模型。
-
Open Neural Network Exchange (ONNX):ONNX 是一个开放格式,用于表示机器学习模型。它使模型能够在不同的框架和工具之间转移,促进了互操作性。
-
Optimum Intel:这是 Hugging Face Optimum 库的一部分,专为 Intel 硬件量身定制。它将模型转换为 OpenVINO IR 格式,这种格式经过针对 Intel 硬件的优化,并执行如量化等任务,以提高模型性能。
-
OpenVINO:OpenVINO 工具包旨在促进在 Intel 硬件上快速高效地进行深度学习模型推理。它包括优化工具和库,用于加速各种计算机视觉和深度学习任务。
-
Datasets:这是 Hugging Face 生态系统的一部分,用于简单高效地加载和处理数据集。它对于需要处理大量数据的机器学习任务非常有用。
-
Soundfile:这个库提供了从音频文件读取和写入多种格式的功能。它处理音频数据的输入输出操作。
-
神经网络压缩框架(NNCF):这是一个通过量化、剪枝和知识蒸馏优化深度学习模型的工具包。它提高了神经网络的性能,特别是在推理速度和内存使用方面。
-
JiWER:这是一个用于评估自动语音识别模型的库。它计算诸如 WER(词错误率)等指标,这是评估语音识别系统性能的标准方法。
每个库在运行和优化 Distil-Whisper 模型时都扮演着特定的角色,从模型转换和优化到性能评估和用户界面创建。
加载模型
在使用 transformers 库初始化 PyTorch Whisper 模型时,AutoModelForSpeechSeq2Seq.from_pretrained 方法是常用的方法:
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
processor = AutoProcessor.from_pretrained(model_id.value)
pt_model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id.value)
pt_model.eval();
本教程将使用 distil-whisper/distil-medium.en 模型作为主要示例。值得注意的是,该模型在第一次运行时需要下载,可能需要一些时间。
如果你想探索其他模型,Distil-Whisper Hugging Face 集合提供了如 distil-whisper/distil-large-v2 或 distil-whisper/distil-small.en 等选项。基于原始 Whisper 架构的其他模型也有提供,你可以在提供的资源中找到更多信息。
强调预处理和后处理在此模型使用中的重要性至关重要。AutoProcessor类用于初始化WhisperProcessor,它在为模型准备音频输入数据时发挥了至关重要的作用。它负责将音频转换为 Mel-谱图,并使用分词器将预测的token_ids输出解码回字符串。
通过利用AutoModelForSpeechSeq2Seq.from_pretrained方法,并了解预处理和后处理步骤,你将能够有效地与 PyTorch Whisper 模型进行工作。
使用 Optimum 库加载 OpenVINO 模型
Hugging Face Optimum API 是一个强大的工具,可以简化将 Hugging Face Transformers 库中的模型转换和量化为 OpenVINO™ IR 格式的过程。如果你想了解更多深入的信息,Hugging Face Optimum 文档是一个很好的资源。
Optimum Intel 是加载来自 Hugging Face Hub 的优化模型并创建用于 OpenVINO Runtime 推理的管道时的好伙伴。Optimum 推理模型的一个优点是它们与 Hugging Face 的transformers模型 API 兼容。你可以毫不费力地将AutoModelForXxx类替换为相应的OVModelForXxx类:
# Using HF transformers models
from transformers import AutoModelForSpeechSeq2Seq
from transformers import AutoTokenizer, pipeline
model_id = "distil-whisper/distil-large-v2"
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id)
# Using Optimum Inference models
from optimum.intel.openvino import OVModelForSpeechSeq2Seq
from transformers import AutoTokenizer, pipeline
model_id = "distil-whisper/distil-large-v2"
model = OVModelForSpeechSeq2Seq.from_pretrained(model_id, export=True)
你需要调用from_pretrained方法来初始化模型类。在下载和转换transformers模型时,包含export=True参数。这将确保平稳的转换过程。一旦你获得转换后的模型,就可以使用save_pretrained方法保存它:
from pathlib import Path
from optimum.intel.openvino import OVModelForSpeechSeq2Seq
model_path = Path(model_id.value.replace('/', '_'))
ov_config = {"CACHE_DIR": ""}
if not model_path.exists():
ov_model = OVModelForSpeechSeq2Seq.from_pretrained(
model_id.value, ov_config=ov_config, export=True, compile=False, load_in_8bit=False
)
ov_model.half()
ov_model.save_pretrained(model_path)
else:
ov_model = OVModelForSpeechSeq2Seq.from_pretrained(
model_path, ov_config=ov_config, compile=False
)
值得一提的是,随模型分发的分词器和处理器也与 OpenVINO 模型兼容。这种兼容性允许你重复使用之前初始化的处理器,节省时间和精力。
使用 Hugging Face Optimum 库,我们还可以将 Distil-Whisper 模型转换为 OpenVINO 的优化 IR 格式。这一步骤对于利用 OpenVINO 的推理引擎来高效执行模型至关重要:
-from transformers import AutoModelForSpeechSeq2Seq
+from optimum.intel.openvino import OVModelForSpeechSeq2Seq
from transformers import AutoTokenizer, pipeline
model_id = "distil-whisper/distil-large-v2"
-model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id)
+model = OVModelForSpeechSeq2Seq.from_pretrained(model_id, export=True)
通过利用 Hugging Face Optimum API 和 Optimum Intel,你可以高效地转换和量化模型,加载优化后的模型,并创建用于 OpenVINO Runtime 推理的管道。API 兼容性以及能够重复使用初始化处理器的能力,使得整个过程更加简化。
使用 OpenVINO 模型与 Hugging Face 管道
通过将 OpenVINO 模型与 Hugging Face 管道接口结合,并利用 Distil-Whisper 的分块算法和批处理能力,你将能够以前所未有的速度和轻松度处理长时间的音频转录任务。
与原始的 PyTorch 模型一样,OpenVINO 模型与 Hugging Face 的 ASR 管道接口完美集成。这种兼容性使得你可以轻松地使用管道转录长时间的音频文件:
from transformers import pipeline
ov_model.generation_config = pt_model.generation_config
pipe = pipeline(
"automatic-speech-recognition",
model=ov_model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
max_new_tokens=128,
chunk_length_s=15,
batch_size=16,
)
Distil-Whisper 通过采用分块算法将其推向更高级别,显著加快了长形音频的转录过程。这种分块长形算法比 OpenAI 在其 Whisper 论文中提出的顺序算法快了惊人的九倍(cdn.openai.com/papers/whisper.pdf)。
要利用分块的优势,您只需将chunk_length_s参数传递给管道即可。在使用 Distil-Whisper 时,将块长度设置为15秒是达到最佳性能的甜蜜点。但这还不是全部!如果您想利用批处理的能力,在调用管道时包括batch_size参数。这将使您能够同时处理多个音频块,进一步提升转录工作流的效率。
量化模型
量化是一种强大的技术,可以显著减少模型大小并提高推断速度。NNCF 使得实现 PTQ 变得比以往任何时候都更加简单。通过无缝集成量化层到模型图中,并利用训练数据集的子集来初始化这些额外层的参数,NNCF 确保对您原始训练代码的修改是最小的。
踏上优化之旅的第一步是创建专门为量化量身定制的校准数据集:
%%skip not $to_quantize.value
from itertools import islice
from optimum.intel.openvino.quantization import InferRequestWrapper
def collect_calibration_dataset(ov_model: OVModelForSpeechSeq2Seq, calibration_dataset_size: int):
# Overwrite model request properties, saving the original ones for restoring later
original_encoder_request = ov_model.encoder.request
original_decoder_with_past_request = ov_model.decoder_with_past.request
encoder_calibration_data = []
decoder_calibration_data = []
ov_model.encoder.request = InferRequestWrapper(original_encoder_request, encoder_calibration_data)
ov_model.decoder_with_past.request = InferRequestWrapper(original_decoder_with_past_request,
decoder_calibration_data)
calibration_dataset = load_dataset("librispeech_asr", "clean", split="validation", streaming=True)
for sample in tqdm(islice(calibration_dataset, calibration_dataset_size), desc="Collecting calibration data",
total=calibration_dataset_size):
input_features = extract_input_features(sample)
ov_model.generate(input_features)
ov_model.encoder.request = original_encoder_request
ov_model.decoder_with_past.request = original_decoder_with_past_request
return encoder_calibration_data, decoder_calibration_data
由于 Whisper 编码器和解码器是分别量化的,为每个模型准备一个校准数据集至关重要。这就是InferRequestWrapper类发挥作用的地方。导入此类,您可以拦截并收集模型输入到列表中。然后,您将在少量音频样本上运行模型推断。请记住,增加校准数据集的大小通常会导致更好的量化质量,因此值得尝试找到适当的平衡。
一旦准备好校准数据集,就是时候释放nncf.quantize的力量了。这个函数是获得量化编码器和解码器模型的关键。在 Distil-Whisper 的情况下,您将在encoder和decoder_with_past模型上运行nncf.quantize。值得注意的是,第一步解码器因其对整体推断时间的贡献微不足道而未被量化:
%%skip not $to_quantize.value
import gc
import shutil
import nncf
CALIBRATION_DATASET_SIZE = 50
quantized_model_path = Path(f"{model_path}_quantized")
def quantize(ov_model: OVModelForSpeechSeq2Seq, calibration_dataset_size: int):
if not quantized_model_path.exists():
encoder_calibration_data, decoder_calibration_data = collect_calibration_dataset(
ov_model, calibration_dataset_size
)
print("Quantizing encoder")
quantized_encoder = nncf.quantize(
ov_model.encoder.model,
nncf.Dataset(encoder_calibration_data),
subset_size=len(encoder_calibration_data),
model_type=nncf.ModelType.TRANSFORMER,
# Smooth Quant algorithm reduces activation quantization error; optimal alpha value was obtained through grid search
advanced_parameters=nncf.AdvancedQuantizationParameters(smooth_quant_alpha=0.50)
)
ov.save_model(quantized_encoder, quantized_model_path / "openvino_encoder_model.xml")
del quantized_encoder
del encoder_calibration_data
gc.collect()
print("Quantizing decoder with past")
quantized_decoder_with_past = nncf.quantize(
ov_model.decoder_with_past.model,
nncf.Dataset(decoder_calibration_data),
subset_size=len(decoder_calibration_data),
model_type=nncf.ModelType.TRANSFORMER,
# Smooth Quant algorithm reduces activation quantization error; optimal alpha value was obtained through grid search
advanced_parameters=nncf.AdvancedQuantizationParameters(smooth_quant_alpha=0.95)
)
ov.save_model(quantized_decoder_with_past, quantized_model_path / "openvino_decoder_with_past_model.xml")
del quantized_decoder_with_past
del decoder_calibration_data
gc.collect()
# Copy the config file and the first-step-decoder manually
shutil.copy(model_path / "config.json", quantized_model_path / "config.json")
shutil.copy(model_path / "openvino_decoder_model.xml", quantized_model_path / "openvino_decoder_model.xml")
shutil.copy(model_path / "openvino_decoder_model.bin", quantized_model_path / "openvino_decoder_model.bin")
quantized_ov_model = OVModelForSpeechSeq2Seq.from_pretrained(quantized_model_path, ov_config=ov_config, compile=False)
quantized_ov_model.to(device.value)
quantized_ov_model.compile()
return quantized_ov_model
ov_quantized_model = quantize(ov_model, CALIBRATION_DATASET_SIZE)
代码片段显示,最后一步是在量化后使用openvino.save_model函数序列化 INT8 模型。此步骤确保您的量化模型已准备好部署,并可以快速加载进行推断。
重要的是要记住,量化是一种计算密集型操作,可能既耗时又消耗内存。运行量化代码可能需要耐心,但模型尺寸减小和推断速度提高的好处使其绝对值得努力。
通过遵循这些步骤并利用 NNCF 的强大功能,您可以通过 PTQ 优化模型,从而实现更快、更高效的推理。
运行推理
这里,我们展示了如何使用量化模型进行推理,包括加载模型、准备输入样本以及执行模型进行语音转录。以下是详细步骤:
-
来自 Hugging Face 的
librispeech_asr_dummy,出自datasets库:%%skip not $to_quantize.value dataset = load_dataset( "hf-internal-testing/librispeech_asr_dummy", "clean", split="validation" ) sample = dataset[0] -
将
numpy数组格式转换为模型可以处理的张量:input_features = extract_input_features(sample) predicted_ids = ov_model.generate(input_features) -
在原始模型上运行推理:使用原始 OpenVINO 模型生成输入特征的预测。通过模型的处理器将预测的令牌 ID 解码为文本转录:
transcription_original = processor.batch_decode(predicted_ids, skip_special_tokens=True) -
在量化模型上运行推理:类似地,使用量化后的 OpenVINO 模型生成相同输入特征的预测。通过模型的处理器将预测的令牌 ID 解码为文本转录:
predicted_ids = ov_quantized_model.generate(input_features) transcription_quantized = processor.batch_decode(predicted_ids, skip_special_tokens=True) -
使用
Audio类播放用于转录的音频文件:display(ipd.Audio(sample["audio"]["array"], rate=sample["audio"]["sampling_rate"])) -
打印转录文本:打印来自原始模型和量化模型的转录文本以进行结果比较:
print(f"Original : {transcription_original[0]}") print(f"Quantized: {transcription_quantized[0]}")
在笔记本中运行此代码后,检查转录文本,并验证原始模型和量化模型的转录文本是否一致,确保量化没有显著影响模型的准确性。
此外,笔记本还包括如何通过 Hugging Face 的 ASR 管道接口使用模型,突出了用于长音频转录的分块算法的效率。
性能和准确性比较
接下来,我们将比较原始模型和量化后的 Distil-Whisper 模型在准确性(使用 WER)和性能(推理时间)方面的差异。这说明了量化在提高模型推理速度而不会显著降低准确性方面的好处。比较原始模型和量化模型的性能和准确性包括以下内容:
-
衡量准确性:我们使用1 - WER指标来衡量模型的准确性。这涉及将模型生成的转录文本与地面真实文本进行比较,以计算错误率。较低的 WER 表示更高的准确性:
word_accuracy = (1 - wer(ground_truths, predictions, reference_transform=wer_standardize, hypothesis_transform=wer_standardize)) * 100 -
衡量性能:推理时间分别为编码器、解码器-带有过去状态模型的前向推理以及整个模型推理进行测量。此步骤包括对模型的推理过程进行计时,以评估模型生成预测的速度。性能测量对于理解量化在提高效率方面的作用至关重要:
mean_whole_infer_time = sum(whole_infer_times) mean_encoder_infer_time = sum(encoder_infer_times) mean_decoder_with_time_infer_time = sum(decoder_with_past_infer_times) -
比较原始模型和量化模型:笔记本直接比较了原始 Distil-Whisper 模型及其量化版本在准确性(使用 1 - WER)和性能(推理时间)方面的表现。这种比较有助于说明量化对模型效率和效果的影响:
print(f"Encoder performance speedup: {times_original[1] / times_quantized[1]:.3f}") print(f"Decoder with past performance speedup: {times_original[2] / times_quantized[2]:.3f}") print(f"Whole pipeline performance speedup: {times_original[0] / times_quantized[0]:.3f}") print(f"Whisper transcription word accuracy. Original model: {accuracy_original:.2f}%. Quantized model: {accuracy_quantized:.2f}%.") print(f"Accuracy drop: {accuracy_original - accuracy_quantized:.2f}%.")
基于运行笔记本后打印出来的对比结果,你可以得出量化的好处,比如模型推理时间的显著改善,而精度几乎没有显著下降。这些步骤为评估量化对 ASR 模型性能和精度的影响提供了一个全面的框架,尤其是在使用 OpenVINO 优化 Distil-Whisper 等模型时。目标是证明,量化可以显著提高模型效率,使其能够在资源受限的环境中部署,而不会大幅牺牲精度。
运行交互式演示
作为附加内容,交互式 Gradio 演示允许我们在他们的音频数据或录音上测试模型的能力。此部分展示了量化后的 Distil-Whisper 模型在用户友好方式下的实际应用。
我鼓励你运行并实验 Colab 笔记本。它是理解量化过程的基础工具,更重要的是,它是你实验或生产工作的重要蓝图。运行完笔记本后,我们开始了一个迷人的旅程,探索了在自动语音识别(ASR)中集成尖端技术。笔记本详细介绍了如何利用 Distil-Whisper 模型,它是 OpenAI 的 Whisper 模型的精简版,在显著减少参数的同时优化了性能,并通过英特尔的 OpenVINO 工具包进行部署,以提高推理速度和效率。
从这个笔记本中获得的一个关键学习是,不同库和框架之间的无缝协同工作,帮助实现了 ASR 任务的高效工作流。使用 Hugging Face Transformers 库访问预训练模型,并利用 Optimum Intel 库将模型转换为 OpenVINO 的 IR 格式,展示了模型部署的一种强大方法。这个过程简化了用户体验,为利用英特尔架构提供的硬件加速能力铺平了道路。
笔记本进一步探讨了使用 NNCF 进行模型量化的实际操作。这一步对于在不显著影响精度的情况下优化模型性能至关重要。准备校准数据集、运行量化并比较原始模型和量化模型的性能与精度的详细演示,提供了关于模型优化细节的宝贵见解。
笔记本中还强调了另一个重要方面,即使用 Gradio 创建交互式演示。这展示了 Distil-Whisper 模型在现实场景中的实际应用,允许用户在他们的音频数据上测试模型的能力。包括这样的演示突显了在开发和部署 AI 模型时,易用性和用户参与的重要性。
你应该寻求将此笔记本中的学习内容直接应用于你的实验或生产 ASR 任务。这些内容可以扩展到 AI 模型部署和优化的更广泛领域,突显了 AI 技术的不断发展和其实际应用。
虽然量化技术已被证明是优化 Whisper 性能和实现高效部署的强大手段,但另一个令人兴奋的前沿领域是探索使用 Whisper 进行实时语音识别的挑战与机遇。实时转录开启了许多可能性,从增强可访问性到促进即时沟通。然而,它也带来了独特的技术难题,必须加以克服。在接下来的部分,我们将深入探讨实时转录面临的当前限制和正在进行的研究工作,旨在使 Whisper 的实时转录成为现实。通过理解这些挑战和前景中的潜在解决方案,我们可以更好地认识到 Whisper 在重塑我们如何在实时场景中与口语互动方面的巨大潜力。
面对实时语音识别的挑战与机遇
追求使用 Whisper 进行实时转录打开了许多应用,这些应用能够惠及教育、医疗和客户服务等各个领域。实时转录可以增强听力障碍人士的可访问性,促进多语言环境中的即时沟通,并提供口头交流的即时文档记录。随着 Whisper 功能的不断发展,它作为通用翻译工具和可访问性工具的潜力变得越来越明显。
然而,目前仍有更多的限制和挑战阻碍着实时转录的实现。让我们深入探讨这些方面,重点关注实现实时转录的技术复杂性和前景:
-
处理时间和延迟:实现实时转录的主要挑战之一是 Whisper 操作的固有延迟和处理时间。正如 GitHub 和 Hugging Face 等平台上的讨论所揭示,Whisper 并非天生为实时语音转文字(STT)转换设计。虽然它在处理任意长度的音频文件时表现稳健,但系统架构在提供即时转录结果时遇到了障碍。这种延迟源于支撑 Whisper 的复杂神经网络模型,这些模型需要大量计算资源来准确分析和转录语音。
-
提高准确性和上下文理解能力:另一个限制在于 Whisper 转录的准确性和上下文知识。尽管 Whisper 在转录多种语言和口音方面表现出了非凡的能力,但实时应用仍然面临独特的挑战。系统必须准确识别语音,并理解对话中的上下文、习语和口语表达。这要求具备当前模型仍在努力完善的语言学和文化细微差别。
尽管存在这些限制,Whisper 在实时转录方面的潜力巨大。该技术当前的能力和不断发展的进展为我们展示了一个未来,届时这些挑战将变得可以克服:
-
提升模型效率:近期的研究集中于提高 Whisper 的效率并减少延迟,使实时转录成为一个切实可行的目标。例如,在 arXiv 上的一项研究《将 Whisper 转变为实时转录系统》(
arxiv.org/abs/2307.14743)探讨了将 Whisper 转变为实时转录系统的方法。这些方法包括优化模型的架构以及利用更强大的计算资源。随着这些进展的持续,我们可以预见到处理时间将大幅减少,Whisper 将更接近实现无缝的实时转录。 -
与边缘计算的整合:Whisper 与边缘计算的整合为克服延迟问题提供了一个有前景的途径。通过在数据生成源附近处理数据,边缘计算可以显著减少音频转录所需的时间。这一方法加速了转录过程,缓解了带宽限制,使实时转录变得更加可行和高效。
尽管通过 Whisper 实现完美的实时转录之路充满了技术挑战,但它所带来的机遇无疑是令人振奋的。延迟、处理时间和上下文准确性方面的限制虽大,但可以管理。通过持续的研究、技术进步和创新应用,Whisper 正站在重新定义实时转录的风口浪尖。展望未来,Whisper 在我们日常生活中的整合不仅有望提升沟通和可访问性,还将推动人工智能领域的可能性边界。前方的道路充满挑战和激动人心的机会,突显了在这一动态领域持续探索和发展的重要性。
为了更好地理解 Whisper 在实时语音识别中的挑战和潜力,让我们深入一个实际的示例。在接下来的部分,我们将使用 Hugging Face 对 Whisper 的实现和用户友好的 Gradio 库构建一个互动式实时 ASR 演示。
使用 Hugging Face Whisper 构建实时 ASR 演示
在本节中,我们将利用 Gradio(一个用户界面库)的强大功能,快速构建一个 Whisper 模型的互动演示。这个演示将允许你或其他人通过设备上的麦克风测试模型的表现。让我们找到并运行 LOAIW_ch07_3_Building_real_time_ASR_with_HF_Whisper.ipynb 笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter07/LOAIW_ch07_3_Building_real_time_ASR_with_HF_Whisper.ipynb)。该笔记本分为三个主要部分:
-
transformers库,用于为我们的演示准备 ASR 模型。 -
创建完整上下文的 ASR 演示:我们将构建一个演示,其中用户在 ASR 模型处理并生成转录之前讲述完整音频。
-
创建流式 ASR 演示:我们将扩展之前的演示,支持实时流式处理,让 ASR 模型在用户讲话时实时转录音频,提供更加互动的体验。
到本笔记本的最后,你将能够充分理解如何使用 Gradio 和 Hugging Face Transformers 库为语音识别模型创建引人入胜的演示。
准备开发环境
在开始构建语音识别演示之前,首先需要设置开发环境并安装必要的依赖项。在这一部分,我们将进行以下操作:
-
安装所需的库,如 Gradio,以确保开发过程顺利进行。
-
配置环境,以便与 Hugging Face Transformers 库无缝协作,允许我们利用预训练模型和强大的 NLP 工具。
通过正确设置环境,我们为整个笔记本提供了一个高效且无烦恼的编程体验基础。
为了将我们对实时 ASR 与 Whisper 的探索付诸实践,我们首先需要设置开发环境。让我们一起走过安装必要库和配置设置的过程,以确保能够与 Hugging Face Transformers 库无缝协作。
%%capture
!pip -q install gradio
设置你的 Hugging Face 令牌对于确保在使用此笔记本时的流畅体验至关重要。该笔记本将从 Hugging Face 仓库加载 transformer 类和模型,这需要有效的令牌认证。
如果你还没有创建 Hugging Face 令牌,或者需要重新了解这一过程,请参考 github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter03/LOAIW_ch03_working_with_audio_data_via_Hugging_Face.ipynb。该资源提供了创建和配置 Hugging Face 令牌的逐步说明。
通过正确设置您的令牌,您将能够轻松访问 Hugging Face 生态系统中可用的所有功能和模型,从而使您能够构建强大的语音识别演示:
from huggingface_hub import notebook_login
notebook_login()
from huggingface_hub import whoami
whoami()
在设置好我们的开发环境后,让我们首先加载 transformers 的 ASR 模型,它将作为我们交互式应用程序的基础。
步骤 1 – 加载 transformers ASR 模型
我们首先需要一个 ASR 模型来开始构建我们的语音识别演示。您可以选择训练自己的模型或使用预训练模型。加载来自 Hugging Face transformers库的"whisper"模型非常简单。以下是实现此功能的代码片段:
from transformers import pipeline
p = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
仅通过这两行代码,我们使用"openai/whisper-base.en"模型初始化了一个自动语音识别(ASR)管道。该管道抽象了直接使用模型时的复杂性,提供了一个高层次的接口来执行 ASR 任务。
通过利用像"whisper"这样的预训练模型,我们可以迅速开始构建演示,而无需进行大量的模型训练。这使我们能够专注于将模型集成到我们的应用程序中,并创造一个引人入胜的用户体验。
步骤 2 – 使用 transformers 构建全上下文的 ASR 演示
创建语音识别演示的第一步是构建一个全上下文的 ASR 演示。在这个演示中,用户将在 ASR 模型处理之前,先说完整个音频,模型生成转录文本。得益于 Gradio 直观的界面,构建这个演示变得非常简单:
import gradio as gr
from transformers import pipeline
import numpy as np
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
def transcribe(audio):
sr, y = audio
y = y.astype(np.float32)
y /= np.max(np.abs(y))
return transcriber({"sampling_rate": sr, "raw": y})["text"]
demo = gr.Interface(
transcribe,
gr.Audio(sources=["microphone"]),
"text",
)
demo.launch(debug=True)
在前面的代码片段中,我们首先创建了一个封装我们先前初始化的pipeline对象的函数。这个函数是我们演示的核心,负责处理音频输入并生成转录文本。
然后,我们利用 Gradio 内置的Audio组件来捕获用户的音频输入。该组件将被配置为接受来自用户麦克风的输入,并返回录制音频的文件路径。我们将使用一个简单的Textbox组件来显示转录文本。
transcribe函数是我们演示的核心,它接收一个名为audio的参数。这个参数代表用户录制的音频数据,以numpy数组的形式存储。然而,pipeline对象期望音频数据为float32格式。为了确保兼容性,我们首先将音频数据转换为float32格式,然后通过其最大绝对值进行归一化。最后,我们将处理后的音频数据传递给pipeline对象,以获得转录文本。
步骤 3 – 增强演示,添加实时流式传输功能
要创建一个流式 ASR 演示,我们需要在 Python Gradio 脚本中进行以下更改:
-
在
Audio组件中设置streaming=True,以启用从用户麦克风连续捕获音频。 -
在
Interface组件中设置live=True,以确保界面在接收到新音频数据时能够动态更新。 -
在接口中添加
state变量,以存储记录的音频和前一个转录。
这些修改已经在脚本中应用:
import gradio as gr
from transformers import pipeline
import numpy as np
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
def transcribe(state, new_chunk):
if state is None:
stream = np.array([], dtype=np.float32)
previous_text = ""
else:
stream, previous_text = state
sr, y = new_chunk
duration = len(y) / sr
y = y.astype(np.float32)
y /= np.max(np.abs(y))
overlap = int(sr * 0.5) # Half a second overlap
if len(stream) > 0:
stream = np.concatenate([stream[-overlap:], y])
else:
stream = y
# Transcribe the current chunk
new_text = transcriber({"sampling_rate": sr, "raw": stream})["text"]
# Update the previous text based on the overlap
if len(previous_text) > 0:
overlap_text = previous_text[-int(len(previous_text) * 0.1):] # Last 10% of previous text
combined_text = previous_text[:-len(overlap_text)] + new_text
else:
combined_text = new_text
return (stream, combined_text), combined_text
demo = gr.Interface(
transcribe,
["state", gr.Audio(sources=["microphone"], streaming=True)],
["state", "text"],
live=True,
)
demo.launch(debug=True)
在流式演示中,我们使用state变量来跟踪音频历史和前一个转录。每当收到一个新的小音频块时,都会调用transcribe函数,需要将新的音频块与之前记录的音频一起处理。
为了提高转录的准确性和连贯性,我们引入了基于新音频块持续时间的动态窗口大小,并在连续的窗口之间设置轻微的重叠。以下是transcribe函数的工作原理:
-
如果
state为None,初始化一个空的numpy数组(stream)来存储音频,和一个空字符串(previous_text)来存储前一个转录。 -
从
new_chunk中提取采样率(sr)和音频数据(y)。 -
计算新的音频块的持续时间并规范化音频数据。
-
在连续的窗口之间引入半秒的重叠,以确保转录的连续性。
-
将新的音频块与现有流连接,考虑到重叠部分。
-
使用
transcriber对象转录整个流。 -
更新
previous_text,通过去除前一个转录的重叠部分,并将其与新的转录合并。 -
返回更新后的
stream和combined_text值作为状态,以及combined_text值作为转录输出。
通过使用动态窗口大小并在连续窗口之间引入重叠,我们可以提高流式转录的准确性和连贯性。小重叠有助于保持转录的连续性,并减少重叠或缺失单词的发生。
当然,这是一个简单的演示。它的设计目的是展示 Whisper 的实时功能并没有看起来那么遥不可及。我鼓励你增强和实验这个演示,并玩得开心!
摘要
在本章中,我们开始了对 OpenAI 的 Whisper 高级语音能力的激动人心的探索。我们深入研究了提升 Whisper 性能的强大技术,如量化,并揭示了其在实时语音识别中的潜力。
我们从研究量化的力量开始,量化可以减少模型的大小和计算需求,同时保持准确性。我们学会了如何使用 CTranslate2 和 OpenVINO 等框架将量化应用于 Whisper,实现了在资源受限设备上的高效部署。通过使用 CTranslate2 和 Distil-Whisper 与 OpenVINO 量化 Whisper 的实践经验,我们深入了解了如何优化模型以适应不同的部署场景。
此外,我们利用 Whisper 解决了实时语音识别的挑战和机遇。我们深入了解了当前的限制,如处理时间和延迟,并探索了使实时转录成为现实的持续研究努力。利用 Whisper 和 Gradio 构建流式 ASR 演示的实验方法,展示了实时语音识别未来可能性的一瞥。
在整个章节中,我们获得了优化 Whisper 性能的高级技术的扎实理解,并且认识到了实时语音识别的潜力和挑战。通过实际操作的编码示例和实用见解,我们掌握了应用这些技术到我们的项目中的知识和技能,推动了 Whisper 的可能性边界。
随着本章的结束,我们展望第八章,使用 WhisperX 和 NVIDIA 的 NeMo 进行语音辨析。虽然 Whisper 已被证明是一个强大的转录工具,但还有另一个关键的语音分析方面可以显著增强其效用:说话者辨析。通过增强 Whisper 的能力来识别和归因不同说话者的语音片段,我们为分析多说话者对话打开了新的可能性领域。请加入我在下一章,让我们探讨如何将 Whisper 与前沿的辨析技术结合,解锁这些功能。
第八章:使用 WhisperX 和 NVIDIA 的 NeMo 进行语音分段
欢迎来到第八章,在这里我们将探索语音分段的世界。尽管 Whisper 已被证明是一个强大的语音转录工具,但语音分析中还有另一个至关重要的方面——说话人分段,这可以显著增强其效用。通过增强 Whisper 的能力,识别并将语音片段归属于不同的说话人,我们为分析多说话人对话开辟了新的可能性。本章将探讨如何将 Whisper 与最先进的分段技术结合,以解锁这些能力。
我们将从探索说话人分段系统的演变开始,了解早期方法的局限性,以及变压器模型带来的变革性影响。通过实际的操作示例,我们将预处理音频数据,使用 Whisper 转录语音,并微调转录与原始音频之间的对齐。
在本章中,我们将涵盖以下主要主题:
-
增强 Whisper 的说话人分段能力
-
执行实际的语音分段
本章结束时,您将了解如何将 Whisper 与先进的技术(如语音活动检测、说话人嵌入提取和聚类)集成,从而增强其功能,并实现最先进的分段性能。您还将学习如何利用 NVIDIA 强大的多尺度分段解码器(MSDD)模型,该模型考虑了说话人嵌入的多个时间分辨率,以提供卓越的准确性。通过掌握本章中介绍的技术,您将能够应对复杂的多说话人音频场景,推动 OpenAI Whisper 的可能性极限。
准备好深入探索说话人分段的激动人心的世界,并从多说话人对话中获得新的见解吧!让我们一起开始这段变革之旅!
技术要求
为了利用 OpenAI 的 Whisper 实现高级应用,本章使用 Python 和 Google Colab,便于使用和访问。Python 环境设置包括用于转录任务的 Whisper 库。
关键要求:
-
Google Colab 笔记本:笔记本设置为使用最低要求的内存和容量运行我们的 Python 代码。如果可用,请选择T4 GPU运行类型以获得更好的性能。
-
Google Colab 笔记本:笔记本设置为使用最低要求的内存和容量运行我们的 Python 代码。如果可用,请将运行时类型更改为GPU以获得更好的性能。
-
Python 环境:每个笔记本包含指令,用于加载所需的 Python 库,包括 Whisper 和 Gradio。
-
Hugging Face 帐户:某些笔记本需要 Hugging Face 帐户和登录 API 密钥。Colab 笔记本中包含有关此主题的信息。
-
麦克风和扬声器:一些笔记本实现了一个带有语音录制和音频播放功能的 Gradio 应用程序。连接到计算机的麦克风和扬声器可以帮助您体验互动语音功能。另一种选择是在运行时打开 Gradio 提供的 URL 链接,在您的手机上使用手机麦克风录制您的声音。
-
GitHub 仓库访问:所有 Python 代码,包括示例,都可以在本章的 GitHub 仓库中找到(
github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter08)。这些 Colab 笔记本已准备好运行,提供了一种实用且动手的学习方法。
通过满足这些技术要求,您将为在不同情境中探索 Whisper 做好准备,同时享受 Google Colab 带来的流畅体验以及 GitHub 上提供的全面资源。
使用说话人分离增强 Whisper
说话人分离是将音频流按说话人的身份划分为不同的段落,是多说话人语音处理中的一个强大功能。它解决了谁在什么时候说话?的问题。在给定的音频片段中,增强 ASR 系统的功能性和可用性至关重要。说话人分离的起源可以追溯到 1990 年代,当时为基于聚类的分离范式奠定了基础。这些早期的研究主要集中在广播新闻和通信应用,旨在提高 ASR 性能。早期研究中使用的特征大多是手工设计的,其中Mel 频率倒谱系数(MFCCs)是常见的选择。
随着时间的推移,说话人分离领域取得了显著的进展,特别是在深度学习技术的出现之后。现代分离系统通常利用神经网络和大规模 GPU 计算来提高准确性和效率。分离技术的发展包括早期方法中使用高斯混合模型(GMMs)和隐马尔可夫模型(HMMs),以及近年来采用神经嵌入(如x-向量和d-向量,我们将在本章稍后的说话人嵌入介绍部分中详细介绍)和聚类方法。
对该领域最重要的贡献之一是端到端神经分离方法的发展,这些方法通过将分离流程中的不同步骤合并,简化了分离过程。这些方法旨在处理多说话人标注和分离中的挑战,例如处理嘈杂的声学环境、不同的音色和口音差异。
开源项目也为说话人分离能力的演变做出了贡献,工具如 ALIZE、pyannote.audio、pyAudioAnalysis、SHoUT 和 LIUM SpkDiarization 为研究人员和开发人员提供了资源,以便在他们的应用程序中实现和实验说话人分离。大多数早期工具现在已经不再活跃或被遗弃,只有 pyannote.audio(Pyannote)仍在使用。
早期的说话人分离系统虽然在解决音频录音中谁在何时说话的问题上具有开创性,但也面临着若干局限性,这些局限性影响了它们的准确性和效率。在下一节中,我们将更详细地探讨早期说话人分离解决方案的根本性障碍。
理解说话人分离的局限性和约束
早期说话人分离技术中的许多不足和不准确性源于当时的技术约束、人类语音的复杂性以及应用于音频处理的机器学习技术尚处于初步阶段。理解这些局限性为我们提供了对说话人分离能力演变的宝贵见解,并帮助我们认识到随着时间推移所取得的重大进展:
-
计算限制:早期的说话人分离系统受限于当时可用的计算能力。处理大规模音频数据集需要大量的计算资源,这些资源在当时并不像今天这样普遍和强大。这一限制影响了可以在合理时间内运行的算法的复杂度,从而限制了早期说话人分离系统的准确性。
-
特征提取和建模的局限性:早期的说话人分离系统中使用的特征提取技术,如 MFCCs,相较于现代系统中使用的复杂嵌入技术,要简单得多。这些早期的特征可能无法有效捕捉不同说话人声音的细微差别,从而导致说话人区分不够准确。
-
依赖 GMM 和 HMM 进行说话人建模:尽管这些模型为说话人分离提供了基础,但它们在处理不同说话人和环境下人类语音的变化性和复杂性时存在局限性。
-
处理说话者变化点:早期分离系统面临的一个重大挑战是准确检测说话者变化点。这些系统尤其在处理短语音段和接近说话者变化点的语音段时遇到了困难。随着语音段时长的减少以及与变化点的接近,系统的表现会有所下降。例如,在单一远程麦克风(SDM)和多重远程麦克风(MDM)的条件下,所有评估的系统中超过 33%和 40%的错误发生在变化点前后 0.5 秒内。SDM 指的是在离说话者一定距离处放置一个麦克风,用来捕捉所有参与者的音频。而 MDM 则是在录音环境中不同位置放置多个麦克风,提供额外的空间信息,从而可以提升分离性能。这些设置下的错误百分比突显了早期分离系统在准确检测说话者变化时,尤其是在变化点附近,所面临的挑战。
-
可扩展性和灵活性:早期的分离系统通常是针对特定应用设计的,如广播新闻或会议录音,可能无法快速适应其他类型的音频内容。这种缺乏灵活性限制了分离技术的广泛应用。此外,这些系统在处理大规模或实时分离任务时的可扩展性也是一个重大挑战。
-
错误分析和改进方向:对早期分离系统的深入错误分析表明,改善说话者变化点附近的处理可以显著提升整体性能。为解决这些限制,探索了替代最小持续时间约束以及利用最显著和第二大对数似然得分之间的差异进行无监督聚类等改进措施。
尽管早期的说话者分离方法取得了开创性进展,但它们仍面临各种限制,这些限制本可以提高它们的准确性和效率。这些限制来源于技术约束、人类语音的复杂性以及机器学习技术的初期阶段。然而,引入基于变压器的模型彻底改变了这一领域,解决了许多挑战,为更准确高效的解决方案铺平了道路。
将变压器引入语音分离
变换器在推动最先进的语音分离技术方面起到了关键作用。它们擅长处理语音的序列性和上下文性,这对于在音频流中区分说话人至关重要。变换器中的自注意力机制使得模型能够权衡输入数据中每个部分的重要性,这对于识别说话人切换点并将语音段归属到正确的说话人至关重要。
如前所述,传统的语音分离方法通常依赖于高斯混合模型(GMMs)和隐马尔可夫模型(HMMs)来建模说话人的特征。这些方法需要改进,以应对人类语音的变化性和复杂性。相比之下,基于变换器的语音分离系统可以同时处理整个数据序列,从而更有效地捕捉语音段之间的上下文和关系。
变换器还启用了嵌入表示,如x-向量和d-向量,它们提供了更细致的说话人特征表示。这有助于提高语音分离的性能,特别是在具有挑战性的声学环境或有重叠语音的场景中。
超越早期语音分离方法的局限性,我们必须引入一种颠覆性的框架,将变换器(transformers)引入语音分离——NVIDIA 的神经模块(NeMo)。NeMo 是一个开源工具包,用于构建、训练和微调 GPU 加速的语音和自然语言处理(NLP)模型。它提供了一组预构建的模块和模型,可以快速组合以创建复杂的 AI 应用程序,如自动语音识别(ASR)、自然语言理解和文本到语音合成。NeMo 通过其基于变换器的管道为语音分离提供了更直接的方法,开启了说话人识别和分离的新可能性。
引入 NVIDIA 的 NeMo 框架
与传统方法相比,基于变换器的语音分离系统提供了更优的性能,并更适应自然语音的复杂性。NVIDIA 的 NeMo 工具包支持训练和微调说话人语音分离模型。NeMo 利用基于变换器的模型处理各种语音任务,包括语音分离。该工具包提供了一个管道,其中包括语音活动检测(VAD)、说话人嵌入提取和聚类模块,这些模块是语音分离系统的关键组成部分。NeMo 的语音分离方法涉及训练能够捕捉未见过说话人特征的模型,并将音频段分配到正确的说话人索引。
从更全面的角度来看,NVIDIA 的 NeMo 提供的功能远超基于变换器的说话人分离。NeMo 是一个端到端的、云原生的框架,用于在各种平台上构建、定制和部署生成性 AI 模型,包括大型语言模型(LLMs)。它为整个生成性 AI 模型开发生命周期提供了全面的解决方案,从数据处理、模型训练到推理。NeMo 特别以其在对话 AI 方面的能力而著称,涵盖了自动语音识别(ASR)、自然语言处理(NLP)和文本转语音合成。
NeMo 以其处理大规模模型的能力脱颖而出,支持训练具有数万亿参数的模型。诸如张量并行、流水线并行和序列并行等先进的并行化技术为此提供了支持,使得模型可以在成千上万的 GPU 上高效扩展。该框架建立在 PyTorch 和 PyTorch Lightning 之上,为研究人员和开发人员提供了一个熟悉的环境,在对话 AI 领域进行创新。
NeMo 的一个关键特点是其模块化架构,在这种架构中,模型由具有强类型输入和输出的神经模块组成。这种设计促进了重用性,并简化了新对话 AI 模型的创建,允许研究人员利用现有代码和预训练模型。
NeMo 作为开源软件可供使用,鼓励社区的贡献,并促进了广泛的采用和定制。它还与 NVIDIA 的 AI 平台集成,包括 NVIDIA Triton 推理服务器,以便在生产环境中部署模型。NVIDIA NeMo 提供了一个强大而灵活的框架,用于开发最先进的对话 AI 模型,提供的工具和资源可以简化将生成性 AI 应用从概念到部署的全过程。
现在我们已经分别探讨了 Whisper 和 NeMo 的能力,接下来我们来考虑将这两种强大工具集成的潜力。将 Whisper 的转录能力与 NeMo 的先进说话人分离功能结合,可以从音频数据中解锁更多的洞见。
集成 Whisper 与 NeMo
尽管 Whisper 主要以其转录能力而闻名,但它也可以适应说话人分离任务。然而,Whisper 并不原生支持说话人分离。为了实现 Whisper 的说话人分离,需要借助如 Pyannote 这样的说话人分离工具包,结合 Whisper 的转录结果来识别说话人。
将 NVIDIA 的 NeMo 与 OpenAI 的 Whisper 结合进行说话人分离,涉及到一个创新的流程,利用两个系统的优势来增强分离效果。这种集成在推理和结果解读方面尤其值得注意。
该管道首先由 Whisper 处理音频以生成高精度的转录。Whisper 的主要角色是转录音频,提供详细的口语内容文本输出。然而,Whisper 本身不支持说话人分离(diarization)——识别音频中谁在什么时候说话。
为了引入分离,管道集成了 NVIDIA 的 NeMo,特别是它的说话人分离模块。NeMo 的分离系统旨在处理音频录音,通过说话人标签进行分段。它通过多个步骤实现这一目标,包括语音活动检测(VAD)、说话人嵌入提取和聚类。说话人嵌入捕捉独特的声音特征,然后通过聚类区分音频中的不同说话人。
Whisper 和 NeMo 在分离中的集成使你能够将 Whisper 的转录与 NeMo 识别的说话人标签对齐。这意味着输出不仅包括说了什么(来自 Whisper 的转录),还识别了每一部分由哪位说话人说(来自 NeMo 的分离)。结果是对音频内容有更全面的理解,既提供文本转录,又提供说话人的归属。
这种集成在理解对话动态至关重要的场景中非常有用,例如会议、访谈和法律程序。通过为转录添加一层特定于说话人的上下文,它增强了转录的实用性,使得更容易跟随对话并准确归属发言。
Whisper 和 NeMo 的说话人分离集成将 Whisper 的先进转录能力与 NeMo 强大的分离框架结合在一起。这种协同作用通过提供详细的转录和准确的说话人标签,增强了音频内容的可解释性,从而为口语互动提供更丰富的分析。
在深入探讨 Whisper 和 NeMo 的集成之前,了解现代语音处理系统中的一个基本概念——说话人嵌入至关重要。这些说话人特征的向量表示对于实现准确的说话人分离至关重要。
说话人嵌入简介
说话人嵌入(Speaker embeddings)是从语音信号中提取的向量表示,能够以紧凑的形式 encapsulate 说话人声音的特征。这些嵌入被设计为具有辨别性,意味着它们能够有效地区分说话人,同时对语音内容、通道和环境噪音的变化具有鲁棒性。目标是从可变长度的语音话语中获取固定长度的向量,捕捉说话人声音的独特特征。
说话人嵌入是现代语音处理系统的基础组件,支持从说话人验证到分离等多种应用。它们能够将说话人声音的丰富信息压缩成固定长度的向量,这使得它们在需要识别、区分或追踪不同说话人的音频记录系统中具有不可替代的价值。
从更技术的角度来看,有几种类型的说话人嵌入,每种都有其提取方法和特征:
-
i-vectors:这些嵌入在低维空间中捕捉说话人和通道的变异性。它们源自 GMM 框架,并表示给定说话人的发音与一组语音类别之间的平均发音的差异。 -
d-vectors:这些向量通过训练一个说话人区分的深度神经网络(DNN)并从最后的隐藏层提取帧级向量得到。这些向量随后在整个话语中进行平均,产生d-vector,代表说话人的身份。 -
x-vectors:这种类型的嵌入涉及帧级和段级特征(话语)处理。X-vectors 通过一个 DNN 提取,该 DNN 处理一系列声学特征并对它们进行聚合,使用统计池化层生成固定长度的向量。 -
s-vectors:也称为序列向量或摘要向量,s-vectors 来源于递归神经网络架构,如 RNN 或 LSTM。它们旨在捕捉顺序信息,可以在相当程度上编码口语词汇和单词顺序。
提取说话人嵌入通常涉及训练一个神经网络模型,通过优化编码器并使用鼓励区分学习的损失函数来实现。训练完成后,提取段级网络中隐藏层的前激活值作为说话人嵌入。该网络在一个包含大量说话人的数据集上进行训练,以确保嵌入能够很好地泛化到未见过的说话人。
在说话人分离的背景下,说话人嵌入根据说话人的身份将语音段进行聚类。嵌入提供了一种测量段之间相似性的方法,并将这些段与可能来自同一说话人的段群体进行分组。这是分离过程中的关键步骤,因为它允许你在音频流中准确地将语音归属到正确的说话人。
正如我们所见,增强了 Pyannote 的 Whisper 和 NVIDIA 的 NeMo 都提供了强大的分离能力。然而,理解这些方法之间的关键区别至关重要,这样才能在选择分离解决方案时做出明智的决定。
区分 NVIDIA 的 NeMo 能力
分话功能的集成对 ASR 系统的影响受到变换器模型(transformer models)出现的显著推动,特别是在 OpenAI 的 Whisper 和 NVIDIA 的 NeMo 框架的背景下。这些进展提升了 ASR 系统的准确性,并引入了处理分话任务的新方法。我们将深入探讨使用 Pyannote 的 Whisper 分话与使用 NVIDIA NeMo 的分话之间的相似性与差异,重点关注语音活动检测、说话人变化检测和重叠语音检测。了解这两种分话方法之间的差异,对于在选择适合自己特定使用案例的解决方案时做出明智决策至关重要。通过研究每个系统如何处理分话过程中的关键环节,如语音活动检测、说话人变化检测和重叠语音检测,您可以更好地评估哪种方法与您的准确性、效率和集成需求最为契合:
| 分话功能 | Whisper 与 Pyannote | NVIDIA NeMo |
|---|---|---|
| 检测 语音活动 | Whisper 本身并不执行语音活动检测(VAD)作为其分话任务的一部分。然而,当与 Pyannote 结合使用时,来自 Pyannote 工具包的外部 VAD 模型可以在应用分话之前将音频分割为语音和非语音区间。这种方法需要将 Whisper 的语音识别(ASR)能力与 Pyannote 的 VAD 模型相结合,基于深度学习技术和微调,实现精确的语音/非语音分割。 | NeMo 的分话流程包括一个专门的 VAD 模块,该模块是可训练和优化的,作为分话系统的一部分。此 VAD 模型旨在检测语音的存在或缺失,并生成语音活动的时间戳。将 VAD 集成到 NeMo 的分话流程中,可以实现更加简化的过程,直接将 VAD 结果传递到后续的分话步骤中。 |
| 检测 说话人变化 | Whisper 与 Pyannote 集成以执行分话任务时,依赖于 Pyannote 的说话人变化检测能力。Pyannote 使用神经网络模型来识别音频中发生说话人变化的点。这个过程对于将音频分割成归属于各个说话人的同质段落至关重要。Pyannote 中的说话人变化检测是一个独立模块,与其分话流程一起工作。 | NeMo 的说话人变化检测方法隐式地在其分话流程中处理,包括用于提取和聚类说话人嵌入的模块。虽然 NeMo 没有明确提到独立的说话人变化检测模块,但通过分析说话人嵌入及其在音频中的时间分布,识别说话人变化已集成到整体分话工作流中。 |
| 检测 重叠语音 | 重叠语音检测是 Pyannote 补充 Whisper 功能的另一个领域。Pyannote 的工具包包括设计用于检测和处理重叠语音的模型,这是说话人分离中一个具有挑战性的方面。这个功能对于准确地分离多个说话人同时发言的对话至关重要。 | 与说话人变化检测类似,NeMo 对重叠语音的处理被集成到其分离管道中,而不是通过单独的模块来解决。该系统处理重叠语音的能力来源于其复杂的说话人嵌入和聚类技术,即使在挑战性的重叠情境下,也能识别和分离说话人。 |
| 将说话人嵌入集成到 分离管道 | Whisper 与 Pyannote 的结合依赖于外部模块来完成这些任务,提供了灵活性和模块化。而 NeMo 的分离管道直接集成了这些功能,提供了一个简化而连贯的工作流程。这些进展凸显了变换器模型对语音处理的变革性影响,为更精确高效的分离系统铺平了道路。 | NVIDIA 的 NeMo 工具包提供了一种更集成的说话人分离方法。它提供了一个完整的分离管道,包含 VAD、说话人嵌入提取和聚类。NeMo 的说话人嵌入是通过专门训练的模型提取的,这些嵌入随后在同一框架中用于执行分离所需的聚类。 |
| 聚类和分配 说话人嵌入 | 在提取了说话人嵌入后,Pyannote 使用各种聚类算法,如层次聚类,来对嵌入进行分组并将其分配给相应的说话人。这个聚类过程对于确定哪些音频段属于哪个说话人至关重要。 | NeMo 也使用聚类算法对说话人嵌入进行分组。然而,NeMo 采用了一种多尺度、自调节的光谱聚类方法,据称比 Pyannote 的版本更具抗干扰性。这种方法包括使用不同窗口长度对音频文件进行分段,并计算多个尺度的嵌入,随后将这些嵌入进行聚类,以标记每个段落的说话人。 |
表 8.1 – 不同的分离方法如何处理关键的分离特征
虽然 Whisper 结合 Pyannote 和 NVIDIA 的 NeMo 都使用说话人嵌入作为其分离流程的核心部分,但它们的处理方法有显著的不同。Whisper 需要一个外部工具包(pyannote.audio)来执行说话人分离,而 NeMo 则提供了一个集成的解决方案,包括说话人嵌入提取和聚类模块。NeMo 的多尺度聚类方法是一个独特的特点,使其与与 Whisper 结合使用的 Pyannote 实现有所不同。这些差异反映了语音分离研究领域中多样化的方法和创新。
混合 Whisper 和 PyAnnote – WhisperX
WhisperX (replicate.com/dinozoiddev/whisperx) 提供了快速的自动语音识别(比 OpenAI 的Whisper large-v2快 70 倍),并且具备词级时间戳和说话人分离功能,这些是 Whisper 本身不原生支持的特性。WhisperX 在 Whisper 的基础优势上进行扩展,解决了其一些局限性,特别是在时间戳精度和说话人分离方面。尽管 Whisper 提供的是发言级别的时间戳,WhisperX 通过提供词级时间戳来推动这一进步,这对于需要精确文本和音频同步的应用(如字幕和详细的音频分析)至关重要。这一功能通过结合多种技术实现,包括 VAD(语音活动检测)、将音频预分段为可管理的块,以及使用外部音素模型进行强制对齐,从而提供准确的词级时间戳。
WhisperX 的实现支持 Whisper 支持的所有语言的转录,目前英语音频的对齐功能已经可用。它已升级为融合最新的 Whisper 模型和由 Pyannote 支持的分离技术,以进一步提升其性能。在撰写本文时,WhisperX 集成了whisper-large-v3,并且通过 Pyannote 增强了说话人分离(更新至 speaker-diarization-3.1)和分段技术(更新至 segmentation-3.0)。WhisperX 在词汇分割的精度和召回率方面展现出了显著改进,同时在词错误率(WER)上有所减少,并且在采用批量转录和 VAD 预处理时,转录速度有了显著提升。
总结来说,WhisperX 是 OpenAI 的 Whisper 的重要进化,提供了通过词级时间戳和说话人分离增强的功能。这些进展使 WhisperX 成为一个强大的工具,适用于需要详细且准确的语音转录和分析的应用。
有了这个坚实的理论基础,是时候将我们的知识付诸实践了。接下来的实践部分将探索一个实际的实现,结合 WhisperX、NeMo 和其他支持的 Python 库,对现实世界的音频数据进行语音分离。
执行实践中的语音分离
从语音分离的理论背景过渡到实际实现,让我们深入了解结合 WhisperX、NeMo 以及其他支持 Python 库的实践应用,所有这些都可以在我们信赖的 Google Colaboratory 中完成。我鼓励你访问本书的 GitHub 仓库,找到LOAIW_ch08_diarizing_speech_with_WhisperX_and_NVIDIA_NeMo.ipynb笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter08/LOAIW_ch08_diarizing_speech_with_WhisperX_and_NVIDIA_NeMo.ipynb),并自己运行 Python 代码;可以随意修改参数并观察结果。该笔记本详细介绍了如何将 Whisper 的转录功能与 NeMo 的语音分离框架集成,提供了一个强大的解决方案来分析音频记录中的语音。
该笔记本被结构化为多个关键部分,每个部分专注于语音分离过程中的特定方面。
设置环境
笔记本的第一部分介绍了几个 Python 库和工具的安装,这些工具对于语音分离过程至关重要:
!pip install git+https://github.com/m-bain/whisperX.git@78dcfaab51005aa703ee21375f81ed31bc248560
!pip install --no-build-isolation nemo_toolkit[asr]==1.22.0
!pip install --no-deps git+https://github.com/facebookresearch/demucs#egg=demucs
!pip install dora-search "lameenc>=1.2" openunmix
!pip install deepmultilingualpunctuation
!pip install wget pydub
让我们回顾一下每个工具,以理解它们在语音分离中的作用:
-
whisperX:OpenAI Whisper 模型的扩展,旨在增强功能。特别地,WhisperX 安装了 faster-whisper(github.com/SYSTRAN/faster-whisper),这是一个使用 CTranslate2(github.com/OpenNMT/CTranslate2/)重新实现的 OpenAI Whisper 模型。该实现比 OpenAI 的 Whisper 快最多四倍,且在保持相同精度的同时,内存占用更少。通过在 CPU 和 GPU 上使用 8 位量化,可以进一步提高效率。 -
nemo_toolkit[asr]:NVIDIA 的 NeMo 工具包,用于自动语音识别(ASR),为说话人分离提供基础。 -
demucs:一个用于音乐源分离的库,能够通过将语音与背景音乐隔离来进行音频文件的预处理。 -
dora-search、lameenc和openunmix:用于音频处理的工具和库,提升音频数据的质量和兼容性,以便于语音分离任务。 -
deepmultilingualpunctuation:一个用于为转录文本添加标点符号的库,改善了生成文本的可读性和结构。 -
wget 和 pydub:用于下载和操作音频文件的工具,简化了在 Python 环境中处理音频数据的过程。
这些库共同构成了处理音频文件、转录语音以及执行说话人分离的基础。每个工具都发挥着特定的作用,从准备音频数据到生成准确的转录内容,再到识别音频中的不同说话人。
简化语音分离工作流的辅助函数
该笔记本定义了几个辅助函数,以简化使用 Whisper 和 NeMo 进行话者分离的过程。这些函数在管理音频数据、将转录与说话者身份对齐以及优化工作流程方面起着关键作用。以下是每个函数的简要描述:
-
create_config(): 初始化并返回配置对象,设置话者分离过程所需的基本参数:def create_config(output_dir): DOMAIN_TYPE = "telephonic" # Can be meeting, telephonic, or general based on domain type of the audio file CONFIG_FILE_NAME = f"diar_infer_{DOMAIN_TYPE}.yaml" CONFIG_URL = f"https://raw.githubusercontent.com/NVIDIA/NeMo/main/examples/speaker_tasks/diarization/conf/inference/{CONFIG_FILE_NAME}" MODEL_CONFIG = os.path.join(output_dir, CONFIG_FILE_NAME) if not os.path.exists(MODEL_CONFIG): MODEL_CONFIG = wget.download(CONFIG_URL, output_dir) config = OmegaConf.load(MODEL_CONFIG) data_dir = os.path.join(output_dir, "data") os.makedirs(data_dir, exist_ok=True) meta = { "audio_filepath": os.path.join(output_dir, "mono_file.wav"), "offset": 0, "duration": None, "label": "infer", "text": "-", "rttm_filepath": None, "uem_filepath": None, } with open(os.path.join(data_dir, "input_manifest.json"), "w") as fp: json.dump(meta, fp) fp.write("\n") pretrained_vad = "vad_multilingual_marblenet" pretrained_speaker_model = "titanet_large" config.num_workers = 0 # Workaround for multiprocessing hanging with ipython issue config.diarizer.manifest_filepath = os.path.join(data_dir, "input_manifest.json") config.diarizer.out_dir = ( output_dir # Directory to store intermediate files and prediction outputs ) config.diarizer.speaker_embeddings.model_path = pretrained_speaker_model config.diarizer.oracle_vad = ( False # compute VAD provided with model_path to vad config ) config.diarizer.clustering.parameters.oracle_num_speakers = False # Here, we use our in-house pretrained NeMo VAD model config.diarizer.vad.model_path = pretrained_vad config.diarizer.vad.parameters.onset = 0.8 config.diarizer.vad.parameters.offset = 0.6 config.diarizer.vad.parameters.pad_offset = -0.05 config.diarizer.msdd_model.model_path = ( "diar_msdd_telephonic" # Telephonic speaker diarization model ) return config -
get_word_ts_anchor(): 确定单词的时间戳锚点,确保说话单词与其音频时间戳之间的准确对齐:def get_word_ts_anchor(s, e, option="start"): if option == "end": return e elif option == "mid": return (s + e) / 2 return s -
get_words_speaker_mapping(): 根据话者分离结果,将转录中的每个单词映射到相应的说话者,确保每个单词归属于正确的说话者:def get_words_speaker_mapping(wrd_ts, spk_ts, word_anchor_option="start"): s, e, sp = spk_ts[0] wrd_pos, turn_idx = 0, 0 wrd_spk_mapping = [] for wrd_dict in wrd_ts: ws, we, wrd = ( int(wrd_dict["start"] * 1000), int(wrd_dict["end"] * 1000), wrd_dict["word"], ) wrd_pos = get_word_ts_anchor(ws, we, word_anchor_option) while wrd_pos > float(e): turn_idx += 1 turn_idx = min(turn_idx, len(spk_ts) - 1) s, e, sp = spk_ts[turn_idx] if turn_idx == len(spk_ts) - 1: e = get_word_ts_anchor(ws, we, option="end") wrd_spk_mapping.append( {"word": wrd, "start_time": ws, "end_time": we, "speaker": sp} ) return wrd_spk_mapping -
get_first_word_idx_of_sentence(): 找到句子中第一个单词的索引,对于在说话者归属和对齐的上下文中处理句子至关重要:def get_first_word_idx_of_sentence(word_idx, word_list, speaker_list, max_words): is_word_sentence_end = ( lambda x: x >= 0 and word_list[x][-1] in sentence_ending_punctuations ) left_idx = word_idx while ( left_idx > 0 and word_idx - left_idx < max_words and speaker_list[left_idx - 1] == speaker_list[left_idx] and not is_word_sentence_end(left_idx - 1) ): left_idx -= 1 return left_idx if left_idx == 0 or is_word_sentence_end(left_idx - 1) else -1 -
get_last_word_idx_of_sentence(): 找到句子中最后一个单词的索引,有助于在转录文本中划定句子边界:def get_last_word_idx_of_sentence(word_idx, word_list, max_words): is_word_sentence_end = ( lambda x: x >= 0 and word_list[x][-1] in sentence_ending_punctuations ) right_idx = word_idx while ( right_idx < len(word_list) and right_idx - word_idx < max_words and not is_word_sentence_end(right_idx) ): right_idx += 1 return ( right_idx if right_idx == len(word_list) - 1 or is_word_sentence_end(right_idx) else -1 ) -
get_realigned_ws_mapping_with_punctuation(): 考虑标点符号调整单词到说话者的映射,提高在复杂对话场景中的说话者归属准确性:def get_realigned_ws_mapping_with_punctuation( word_speaker_mapping, max_words_in_sentence=50 ): is_word_sentence_end = ( lambda x: x >= 0 and word_speaker_mapping[x]["word"][-1] in sentence_ending_punctuations ) wsp_len = len(word_speaker_mapping) words_list, speaker_list = [], [] for k, line_dict in enumerate(word_speaker_mapping): word, speaker = line_dict["word"], line_dict["speaker"] words_list.append(word) speaker_list.append(speaker) k = 0 while k < len(word_speaker_mapping): line_dict = word_speaker_mapping[k] if ( k < wsp_len - 1 and speaker_list[k] != speaker_list[k + 1] and not is_word_sentence_end(k) ): left_idx = get_first_word_idx_of_sentence( k, words_list, speaker_list, max_words_in_sentence ) right_idx = ( get_last_word_idx_of_sentence( k, words_list, max_words_in_sentence - k + left_idx - 1 ) if left_idx > -1 else -1 ) if min(left_idx, right_idx) == -1: k += 1 continue spk_labels = speaker_list[left_idx : right_idx + 1] mod_speaker = max(set(spk_labels), key=spk_labels.count) if spk_labels.count(mod_speaker) < len(spk_labels) // 2: k += 1 continue speaker_list[left_idx : right_idx + 1] = [mod_speaker] * ( right_idx - left_idx + 1 ) k = right_idx k += 1 k, realigned_list = 0, [] while k < len(word_speaker_mapping): line_dict = word_speaker_mapping[k].copy() line_dict["speaker"] = speaker_list[k] realigned_list.append(line_dict) k += 1 return realigned_list -
get_sentences_speaker_mapping(): 生成整个句子与说话者的映射,提供说话者在音频中贡献的高层次视图:def get_sentences_speaker_mapping(word_speaker_mapping, spk_ts): sentence_checker = nltk.tokenize.PunktSentenceTokenizer().text_contains_sentbreak s, e, spk = spk_ts[0] prev_spk = spk snts = [] snt = {"speaker": f"Speaker {spk}", "start_time": s, "end_time": e, "text": ""} for wrd_dict in word_speaker_mapping: wrd, spk = wrd_dict["word"], wrd_dict["speaker"] s, e = wrd_dict["start_time"], wrd_dict["end_time"] if spk != prev_spk or sentence_checker(snt["text"] + " " + wrd): snts.append(snt) snt = { "speaker": f"Speaker {spk}", "start_time": s, "end_time": e, "text": "", } else: snt["end_time"] = e snt["text"] += wrd + " " prev_spk = spk snts.append(snt) return snts -
get_speaker_aware_transcript(): 生成考虑到说话者身份的转录,将文本内容和说话者信息整合为一致的格式:def get_speaker_aware_transcript(sentences_speaker_mapping, f): previous_speaker = sentences_speaker_mapping[0]["speaker"] f.write(f"{previous_speaker}: ") for sentence_dict in sentences_speaker_mapping: speaker = sentence_dict["speaker"] sentence = sentence_dict["text"] # If this speaker doesn't match the previous one, start a new paragraph if speaker != previous_speaker: f.write(f"\n\n{speaker}: ") previous_speaker = speaker # No matter what, write the current sentence f.write(sentence + " ") -
format_timestamp(): 将时间戳转换为人类可读的格式,便于为转录注释准确的时间信息:def format_timestamp( milliseconds: float, always_include_hours: bool = False, decimal_marker: str = "." ): assert milliseconds >= 0, "non-negative timestamp expected" hours = milliseconds // 3_600_000 milliseconds -= hours * 3_600_000 minutes = milliseconds // 60_000 milliseconds -= minutes * 60_000 seconds = milliseconds // 1_000 milliseconds -= seconds * 1_000 hours_marker = f"{hours:02d}:" if always_include_hours or hours > 0 else "" return ( f"{hours_marker}{minutes:02d}:{seconds:02d}{decimal_marker}{milliseconds:03d}" ) -
write_srt(): 以SubRip Text(SRT)格式输出话者分离结果,适用于字幕或详细分析,包括说话者标签和时间戳:def write_srt(transcript, file): """ Write a transcript to a file in SRT format. """ for i, segment in enumerate(transcript, start=1): # write srt lines print( f"{i}\n" f"{format_timestamp(segment['start_time'], always_include_hours=True, decimal_marker=',')} --> " f"{format_timestamp(segment['end_time'], always_include_hours=True, decimal_marker=',')}\n" f"{segment['speaker']}: {segment['text'].strip().replace('-->', '->')}\n", file=file, flush=True, ) -
find_numeral_symbol_tokens(): 在转录文本中识别表示数字符号的标记,帮助处理文本中的数字数据:def find_numeral_symbol_tokens(tokenizer): numeral_symbol_tokens = [ -1, ] for token, token_id in tokenizer.get_vocab().items(): has_numeral_symbol = any(c in "0123456789%$£" for c in token) if has_numeral_symbol: numeral_symbol_tokens.append(token_id) return numeral_symbol_tokens -
_get_next_start_timestamp(): 计算下一个单词的开始时间戳,确保转录中时间戳序列的连续性:def _get_next_start_timestamp(word_timestamps, current_word_index, final_timestamp): # if current word is the last word if current_word_index == len(word_timestamps) - 1: return word_timestamps[current_word_index]["start"] next_word_index = current_word_index + 1 while current_word_index < len(word_timestamps) - 1: if word_timestamps[next_word_index].get("start") is None: # if next word doesn't have a start timestamp # merge it with the current word and delete it word_timestamps[current_word_index]["word"] += ( " " + word_timestamps[next_word_index]["word"] ) word_timestamps[next_word_index]["word"] = None next_word_index += 1 if next_word_index == len(word_timestamps): return final_timestamp else: return word_timestamps[next_word_index]["start"] -
filter_missing_timestamps(): 过滤并修正转录数据中缺失或不完整的时间戳,保持时间信息的完整性:def filter_missing_timestamps( word_timestamps, initial_timestamp=0, final_timestamp=None ): # handle the first and last word if word_timestamps[0].get("start") is None: word_timestamps[0]["start"] = ( initial_timestamp if initial_timestamp is not None else 0 ) word_timestamps[0]["end"] = _get_next_start_timestamp( word_timestamps, 0, final_timestamp ) result = [ word_timestamps[0], ] for i, ws in enumerate(word_timestamps[1:], start=1): # if ws doesn't have a start and end # use the previous end as start and next start as end if ws.get("start") is None and ws.get("word") is not None: ws["start"] = word_timestamps[i - 1]["end"] ws["end"] = _get_next_start_timestamp(word_timestamps, i, final_timestamp) if ws["word"] is not None: result.append(ws) return result -
cleanup(): 清理在话者分离过程中创建的临时文件或目录,确保工作环境整洁:def cleanup(path: str): """path could either be relative or absolute.""" # check if file or directory exists if os.path.isfile(path) or os.path.islink(path): # remove file os.remove(path) elif os.path.isdir(path): # remove directory and all its content shutil.rmtree(path) else: raise ValueError("Path {} is not a file or dir.".format(path)) -
process_language_arg(): 处理语言参数,确保与模型兼容,促进不同语言间的准确转录:def process_language_arg(language: str, model_name: str): """ Process the language argument to make sure it's valid and convert language names to language codes. """ if language is not None: language = language.lower() if language not in LANGUAGES: if language in TO_LANGUAGE_CODE: language = TO_LANGUAGE_CODE[language] else: raise ValueError(f"Unsupported language: {language}") if model_name.endswith(".en") and language != "en": if language is not None: logging.warning( f"{model_name} is an English-only model but received '{language}'; using English instead." ) language = "en" return language -
transcribe(): 利用 Whisper 将音频转录为文本,为话者分离过程提供基础文本数据:def transcribe( audio_file: str, language: str, model_name: str, compute_dtype: str, suppress_numerals: bool, device: str, ): from faster_whisper import WhisperModel from helpers import find_numeral_symbol_tokens, wav2vec2_langs # Faster Whisper non-batched # Run on GPU with FP16 whisper_model = WhisperModel(model_name, device=device, compute_type=compute_dtype) # or run on GPU with INT8 # model = WhisperModel(model_size, device="cuda", compute_type="int8_float16") # or run on CPU with INT8 # model = WhisperModel(model_size, device="cpu", compute_type="int8") if suppress_numerals: numeral_symbol_tokens = find_numeral_symbol_tokens(whisper_model.hf_tokenizer) else: numeral_symbol_tokens = None if language is not None and language in wav2vec2_langs: word_timestamps = False else: word_timestamps = True segments, info = whisper_model.transcribe( audio_file, language=language, beam_size=5, word_timestamps=word_timestamps, # TODO: disable this if the language is supported by wav2vec2 suppress_tokens=numeral_symbol_tokens, vad_filter=True, ) whisper_results = [] for segment in segments: whisper_results.append(segment._asdict()) # clear gpu vram del whisper_model torch.cuda.empty_cache() return whisper_results, language -
transcribe_batched():提供批处理能力以转录音频文件,从而优化转录过程的效率和可扩展性:def transcribe_batched( audio_file: str, language: str, batch_size: int, model_name: str, compute_dtype: str, suppress_numerals: bool, device: str, ): import whisperx # Faster Whisper batched whisper_model = whisperx.load_model( model_name, device, compute_type=compute_dtype, asr_options={"suppress_numerals": suppress_numerals}, ) audio = whisperx.load_audio(audio_file) result = whisper_model.transcribe(audio, language=language, batch_size=batch_size) del whisper_model torch.cuda.empty_cache() return result["segments"], result["language"]
这些功能共同构成了笔记本的说话人分离工作流程基础,能够无缝集成 Whisper 的转录能力与 NeMo 的高级说话人分离功能。
使用 Demucs 将音乐与语音分离
在探索笔记本时,让我们关注预处理步骤,这对于在进行说话人分离之前提升语音清晰度至关重要。本节介绍了Demucs,一个用于将音乐源人声与复杂音轨分离的深度学习模型。
将音乐与语音分离非常关键,尤其是在处理包含背景音乐或其他非语音元素的录音时。通过提取人声成分,分离系统可以更有效地分析并将语音归属给正确的说话人,因为其语音信号的频谱和时间特征变得更加明显,不会被音乐干扰:
if enable_stemming:
# Isolate vocals from the rest of the audio
return_code = os.system(
f'python3 -m demucs.separate -n htdemucs --two-stems=vocals "{audio_path}" -o "temp_outputs"'
)
if return_code != 0:
logging.warning("Source splitting failed, using original audio file.")
vocal_target = audio_path
else:
vocal_target = os.path.join(
"temp_outputs",
"htdemucs",
os.path.splitext(os.path.basename(audio_path))[0],
"vocals.wav",
)
else:
vocal_target = audio_path
Demucs 通过利用一个神经网络来区分混合音频中的不同音源来工作。当应用于音频文件时,它可以将人声轨道与伴奏乐器分开,从而使得后续工具(如 Whisper 和 NeMo)能够在没有背景音乐干扰的情况下处理语音。
这个分离步骤对说话人分离的准确性以及任何需要清晰语音输入的后续任务(如转录和语音识别)非常有帮助。通过将 Demucs 作为预处理管道的一部分,笔记本确保输入到分离系统的音频得到了优化,从而实现最佳性能。
使用 WhisperX 进行音频转录
下一步是利用 WhisperX 来转录音频内容。转录过程包括将音频文件通过 Whisper 处理,生成一组文本段落,每个段落都有时间戳,指示该段落被说出的时间:
compute_type = "float16"
# or run on GPU with INT8
# compute_type = "int8_float16"
# or run on CPU with INT8
# compute_type = "int8"
if batch_size != 0:
whisper_results, language = transcribe_batched(
vocal_target,
language,
batch_size,
whisper_model_name,
compute_type,
suppress_numerals,
device,
)
else:
whisper_results, language = transcribe(
vocal_target,
language,
whisper_model_name,
compute_type,
suppress_numerals,
device,
)
这一基础步骤提供了进行说话人分离和进一步分析所需的文本内容。我希望你注意到,transcribe()和transcribe_batch()这两个函数在笔记本中已经定义过了。
使用 Wav2Vec2 对转录文本与原始音频进行对齐
在转录之后,笔记本介绍了如何使用Wav2Vec2进行强制对齐,这是一个将转录文本与原始音频进行对齐的过程。Wav2Vec2 是一个大型神经网络模型,擅长学习有助于语音识别和对齐任务的语音表示。通过使用 Wav2Vec2,我们演示了如何微调转录段落与音频信号的对齐,确保文本与所说的话语准确同步:
if language in wav2vec2_langs:
device = "cuda"
alignment_model, metadata = whisperx.load_align_model(
language_code=language, device=device
)
result_aligned = whisperx.align(
whisper_results, alignment_model, metadata, vocal_target, device
)
word_timestamps = filter_missing_timestamps(
result_aligned["word_segments"],
initial_timestamp=whisper_results[0].get("start"),
final_timestamp=whisper_results[-1].get("end"),
)
# clear gpu vram
del alignment_model
torch.cuda.empty_cache()
else:
assert batch_size == 0, ( # TODO: add a better check for word timestamps existence
f"Unsupported language: {language}, use --batch_size to 0"
" to generate word timestamps using whisper directly and fix this error."
)
word_timestamps = []
for segment in whisper_results:
for word in segment["words"]:
word_timestamps.append({"word": word[2], "start": word[0], "end": word[1]})
这一对齐对于分离至关重要,因为它允许根据说话人的变化进行更精确的音频分割。Whisper 和 Wav2Vec2 的结合输出提供了一个完全对齐的转录,这对于说话人分离、情感分析和语言识别等任务非常有帮助。本节强调,如果某个特定语言没有可用的 Wav2Vec2 模型,则将使用 Whisper 生成的单词时间戳,展示了该方法的灵活性。
通过将 Whisper 的转录能力与 Wav2Vec2 的对齐精度结合,我们为准确的说话人分离奠定了基础,提高了分离过程的整体质量和可靠性。
使用 NeMo 的 MSDD 模型进行说话人分离
在笔记本的核心部分,重点转向了复杂的说话人分离过程,利用了 NVIDIA NeMo MSDD 的先进能力。该部分非常关键,因为它解决了在音频信号中区分不同说话人的问题,这对于将语音片段准确归属到个人说话人至关重要:
# Initialize NeMo MSDD diarization model
msdd_model = NeuralDiarizer(cfg=create_config(temp_path)).to("cuda")
msdd_model.diarize()
del msdd_model
torch.cuda.empty_cache()
NeMo MSDD 模型处于这一过程的最前沿,采用了一种复杂的分离方法,考虑了说话人嵌入的多时间分辨率。这种多尺度策略提高了模型在挑战性音频环境中(如重叠语音或背景噪音)区分说话人的能力。
根据时间戳将说话人映射到句子
在成功地将语音与音乐分离、使用 Whisper 转录音频并通过 NeMo MSDD 模型进行说话人分离后,下一个挑战是将转录中的每个句子准确地映射到相应的说话人。这涉及分析转录中每个单词或片段的时间戳以及在分离过程中分配的说话人标签:
speaker_ts = []
with open(os.path.join(temp_path, "pred_rttms", "mono_file.rttm"), "r") as f:
lines = f.readlines()
for line in lines:
line_list = line.split(" ")
s = int(float(line_list[5]) * 1000)
e = s + int(float(line_list[8]) * 1000)
speaker_ts.append([s, e, int(line_list[11].split("_")[-1])])
wsm = get_words_speaker_mapping(word_timestamps, speaker_ts, "start")
前面的代码确保了转录中的每个句子都正确地归属于某个说话人,考虑了口语片段的开始和结束时间。这一细致的映射对于理解对话动态(例如谁在何时说了什么)至关重要。它使得对多说话人对话、会议、访谈和音频内容的分析更加细致。
通过基于标点符号的重新对齐提升说话人归属
以下代码片段演示了标点符号如何决定每个句子的主要说话人。它使用一个预训练的标点符号模型kredor/punctuate-all,为转录的单词预测标点符号。然后,代码处理这些单词及其预测的标点符号,处理一些特殊情况,例如首字母缩略词(如 USA),以避免错误的标点符号。这种方法确保即使在其他说话人的背景评论或简短插话的情况下,每个句子的说话人归属也能保持一致。这在转录未指示说话人变化的情况下特别有用,例如当一个说话人的发言被另一个人的话语打断或重叠时。通过分析每个句子中每个单词的说话人标签分布,代码能够为整个句子分配一个一致的说话人标签,从而增强对话分段输出的连贯性:
if language in punct_model_langs:
# restoring punctuation in the transcript to help realign the sentences
punct_model = PunctuationModel(model="kredor/punctuate-all")
words_list = list(map(lambda x: x["word"], wsm))
labled_words = punct_model.predict(words_list)
ending_puncts = ".?!"
model_puncts = ".,;:!?"
# We don't want to punctuate U.S.A. with a period. Right?
is_acronym = lambda x: re.fullmatch(r"\b(?:[a-zA-Z]\.){2,}", x)
for word_dict, labeled_tuple in zip(wsm, labled_words):
word = word_dict["word"]
if (
word
and labeled_tuple[1] in ending_puncts
and (word[-1] not in model_puncts or is_acronym(word))
):
word += labeled_tuple[1]
if word.endswith(".."):
word = word.rstrip(".")
word_dict["word"] = word
else:
logging.warning(
f"Punctuation restoration is not available for {language} language. Using the original punctuation."
)
wsm = get_realigned_ws_mapping_with_punctuation(wsm)
ssm = get_sentences_speaker_mapping(wsm, speaker_ts)
这种方法还解决了在主要说话人进行独白时,背景评论或简短插话发生的情况。代码有效地将主要的讲话内容归属于主说话人,而忽略其他人的零星评论。这使得语音片段与相应说话人的映射更加准确可靠,确保分段过程反映了对话的实际结构。
完成分段过程
在最后一部分,代码执行必要的清理任务,导出分段结果以供进一步使用,并将说话人 ID 替换为对应的名字。主要步骤包括以下内容:
-
get_speaker_aware_transcript函数生成一个包含文本内容和说话人信息的转录本。该转录本随后被保存为与输入音频文件同名的文件,但扩展名为.txt:with open(f"{os.path.splitext(audio_path)[0]}.txt", "w", encoding="utf-8-sig") as f: get_speaker_aware_transcript(ssm, f) -
write_srt function用于将分段结果导出为 SRT 格式。此格式通常用于字幕,并包括每个发言的说话人标签和精确的时间戳。SRT 文件将以与输入音频文件相同的名称保存,但扩展名为.srt:with open(f"{os.path.splitext(audio_path)[0]}.srt", "w", encoding="utf-8-sig") as srt: write_srt(ssm, srt) -
清理临时文件:清理功能删除在分段过程中创建的任何临时文件或目录。这一步确保了一个干净、井然有序的工作环境,释放了存储空间并保持系统效率:
cleanup(temp_path) -
将
Speaker 0、Speaker 1和Speaker 2替换为实际说话人的名字:# Open the file with open(f"{os.path.splitext(audio_path)[0]}.txt", 'r') as f: text = f.read() # Replace the speaker IDs with names text = text.replace('Speaker 0','Ewa Jasiewicz') text = text.replace('Speaker 1','Chris Faulkner') text = text.replace('Speaker 2','Matt Frei') # Write the file to disk with open(audio_path[:-4] + '-with-speakers-names.txt', 'w') as f: f.write(text)
通过完成这些最终步骤,语音分离过程得以完成,结果可以用于进一步分析、后处理或与其他工具和工作流程的集成。导出的包含说话者信息的转录、SRT 文件和映射了说话者名称的转录提供了对音频录音内容和结构的宝贵洞见,为广泛应用提供了可能,如内容分析、说话者识别和字幕生成。
在深入研究该笔记本后,我们发现了一个关于使用前沿 AI 工具进行语音分离的宝贵宝藏。这本笔记本是一本实践指南,详细指导我们如何从复杂的音频文件中分离和转录语音。
第一个教训是如何设置正确的环境。该笔记本强调了安装特定依赖项的必要性,如 Whisper 和 NeMo,它们对于任务的执行至关重要。这一步是基础,为所有后续操作奠定了基础。
随着深入学习,我们了解了辅助函数的实用性。这些函数是默默奉献的英雄,它们简化了工作流程,从处理音频文件到处理时间戳和清理资源。它们体现了编写简洁、可重用代码的原则,大大降低了项目的复杂性。
该笔记本还介绍了使用 Demucs 将音乐从语音中分离的技术。这个步骤展示了预处理在提高分离准确性方面的强大作用。通过隔离人声,我们专注于语音的频谱和时间特征,这对于识别不同的说话者至关重要。
另一个关键收获是集成多个模型以获得更好的结果。该笔记本展示了如何使用 Whisper 进行转录,使用 Wav2Vec2 将转录与原始音频对齐。模型之间的协同作用是一个出色的例子,展示了如何结合不同的 AI 工具来实现更强大的解决方案。
将说话者映射到句子并通过标点符号重新对齐语音片段的过程尤其令人启发。它展示了语音分离的复杂性以及对细节的关注,确保每个说话者在转录中都得到准确表达。
从本质上讲,这本笔记本是一个关于 AI 在语音分离应用中的实用技巧的高级教程。它不仅教会了我们涉及的技术步骤,还传授了关于预处理重要性、结合不同 AI 模型的力量,以及细致后处理以确保最终输出完整性的更广泛教训。
总结
在本章中,我们开始了对 OpenAI Whisper 先进语音能力的激动人心的探索。我们深入研究了增强 Whisper 性能的强大技术,例如量化,并发现了它在说话者分离和实时语音识别中的潜力。
我们为 Whisper 增添了说话人分离功能,使其能够识别并将音频录音中的语音片段归属到不同的说话人。通过将 Whisper 与 NVIDIA NeMo 框架整合,我们学会了如何执行精准的说话人分离,为分析多说话人对话开辟了新天地。我们与 WhisperX 和 NVIDIA NeMo 的实操经验展示了将 Whisper 的转录能力与先进的说话人分离技术结合的强大潜力。
在本章中,我们深入理解了优化 Whisper 性能和通过说话人分离扩展其功能的高级技巧。通过动手编码示例和实用的见解,我们掌握了应用这些技巧的知识和技能,推动了 Whisper 的可能性边界。
当我们结束本章时,我们将展望第九章,利用 Whisper 进行个性化语音合成。在那一章中,我们将获得预处理音频数据、微调语音模型以及使用个人语音合成模型生成逼真语音的知识和技能。动手编码示例和实用的见解将使你能够将这些技巧应用到你的项目中,推动个性化语音合成技术的边界。
跟随我继续与 Whisper 同行,准备迎接语音合成技术这一迅速发展的领域中的激动人心的可能性。
第九章:利用 Whisper 进行个性化语音合成
欢迎来到第九章,在这一章中,我们将深入探讨个性化语音合成(PVS)。这一领域涵盖了许多应用和技术,旨在根据个人偏好或需求创建合成语音。PVS 是一个多功能的过程,可以根据不同的目的进行定制,包括辅助技术、虚拟助手开发和数字内容创作。在这个背景下,OpenAI 的 Whisper 工具通过在预处理和注册过程中提供准确的语音数据转录,来实现语音合成。
在开始之前,我们需要区分语音克隆与 PVS。语音克隆涉及创建自然人的语音数字复制品。虽然这一技术有其有效的应用场景,但也带来了重大伦理问题。然而,PVS 专注于根据特定特征创造独特的声音,而不是直接复制某个人的声音。这一区别在讨论语音合成技术的伦理使用时至关重要。在本章中,我们将指导您如何利用 Whisper 的强大功能创建 PVS 模型,确保您掌握如何负责任地使用这项技术。
我们将首先探索语音合成和文本转语音(TTS)的基础知识。您将深入了解神经网络、音频处理和语音合成在这一领域中的作用。在此基础上,我们将指导您如何将音频文件转换为LJSpeech格式,这是一种在 TTS 任务中常用的标准化数据集结构。
接下来,我们将向您介绍深度学习艺术学校(DLAS)工具包,这是一个强大的框架,用于微调 PVS 模型。在这里,您的学习旅程将真正开始。您将了解如何设置训练环境、准备数据集和配置模型架构。通过利用 Whisper 准确的转录结果,您可以将音频片段与相应的文本对齐,创建一个适合用于训练 PVS 模型的数据集。本教程不仅是一个指南,更是您掌握使用 Whisper 进行 PVS 艺术创作的入门通道。准备好迎接启发与激励吧!
通过实际示例和代码片段,您将获得微调预训练 PVS 模型的实战经验,使用您的 LJSpeech 数据集。您将学习如何定制训练过程、选择适当的超参数并评估模型的性能。
最后,我们将测试您微调后的 PVS 模型,合成真实且富有表现力的语音。您将学习如何通过向模型提供文本输入来生成自然的语音,使 PVS 语音栩栩如生。
在本章中,我们将涵盖以下主要内容:
-
理解 PVS 中的 TTS
-
将音频文件转换为 LJSpeech 格式
-
使用 DLAS 工具包微调 PVS 模型
-
使用微调后的 PVS 模型合成语音
到本章结束时,你将全面了解如何利用 Whisper 实现 PVS。你将具备预处理音频数据、微调语音模型并使用 PVS 框架生成真实语音的知识和技能。无论你是语音技术领域的研究人员、开发者还是爱好者,本章将为你提供宝贵的见解和实用技巧,帮助你释放 OpenAI Whisper 在 PVS 中的潜力。
技术要求
为了利用 OpenAI 的 Whisper 实现高级应用,本章使用 Python 和 Google Colab 以便于使用和访问。Python 环境的设置包括用于转录任务的 Whisper 库。
关键要求:
-
Google Colab 笔记本:这些笔记本已设置为以最低所需内存和能力运行我们的 Python 代码。如果有 T4 GPU 运行类型可用,选择它可以获得更好的性能。
-
Python 环境:每个笔记本都包含加载所需 Python 库的指令。
-
Hugging Face 账户:某些笔记本需要 Hugging Face 账户和登录 API 密钥。Colab 笔记本中包含关于此主题的信息。
-
Audacity:Audacity 是一个免费的开源数字音频编辑和录音应用程序,支持 Windows、macOS、Linux 和其他类 Unix 操作系统。如果你想合成自己的声音,它是一个非常好的选择。
-
麦克风和扬声器:一些笔记本实现了语音录音和音频播放功能。连接到计算机的麦克风和扬声器可能会帮助你体验互动语音功能。
-
GitHub 仓库访问:所有 Python 代码,包括示例,均可在本章的 GitHub 仓库中找到(
github.com/PacktPublishing/Learn-OpenAI-Whisper/tree/main/Chapter09)。这些 Colab 笔记本已经准备好运行,提供了一种实用的动手学习方法。
通过满足这些技术要求,你将能够在不同的环境中探索 Whisper,同时享受 Google Colab 提供的简化体验和 GitHub 上的丰富资源。
了解语音合成中的文本到语音
TTS 是语音合成过程中的关键组成部分,它可以将书面文本转化为语音。了解 TTS 的基本原理对于理解语音合成的工作原理以及如何在各种场景中应用它至关重要。图 9.1 展示了 TTS 在语音合成中的工作原理的高层次概述,并没有深入探讨技术细节:

图 9.1 – TTS 语音合成流程
TTS 语音合成流程中有五个组件:
-
文本预处理:
-
输入文本首先会进行标准化和预处理。
-
数字、缩写和特殊字符会被展开成完整的单词。
-
文本被划分为单独的句子、单词和音素(独立的音频单位)。
-
-
文本到频谱图:
-
规范化的文本被转化为一系列语言特征,并编码成向量表示。
-
一个频谱图生成模型,通常是一个深度学习模型,接收这个编码的文本并生成频谱图。
-
频谱图直观地表示了语音声音的频率和强度随时间的变化。
-
-
从频谱图到波形:
然后,频谱图被输入到声码器模型中。声码器是一个生成模型,经过训练能够将频谱图转化为可听的波形。它根据频谱图中的频率信息重建语音信号。
-
语音合成:
为了合成特定人物的声音,TTS 模型会在该人物的语音数据集上进行微调。这使得模型能够学习该人物声音的独特特征、语气和韵律。通过足够的训练数据,生成的语音将模仿目标声音。
-
合成:
最终,生成的波形被输出为可听的合成语音。结果是一个合成的声音,能够朗读原始输入文本。
现代 TTS 系统能够生成非常自然的语音,具备适当的语调和表现力。TTS 流程,通过文本处理、声学建模和语音合成的复杂互动,构成了 PVS 转型技术的基础。在我们探索语音合成的细节时,理解如何利用 TTS 系统创造个性化语音至关重要。
一种强大的 TTS 实现是 TorToiSe-TTS-Fast,它是一个高性能的 TTS 系统,利用神经网络的力量生成真实且富有表现力的语音。接下来的部分将深入探讨 TorToiSe-TTS-Fast 的功能,并展示它如何以惊人的准确性和自然感合成声音。
介绍 TorToiSe-TTS-Fast
在 第五章 中,我们使用了 gTTS Python 库,它是 Google 翻译 TTS API 的接口。gTTS 允许你使用 Google 的 TTS 引擎将文本转化为语音。这一次,我们将探索 TorToiSe-TTS-Fast 项目,这是一个高性能的 TTS 系统,利用神经网络合成真实语音,而无需微调。接下来,我们将学习如何初始化 TextToSpeech 模型,它是 TTS 系统的核心组件。我们将深入了解 TextToSpeech 类及其在将文本转化为语音中的作用。
TorToiSe-TTS-Fast 项目的一个令人兴奋的特点是能够使用给定声音的不同音频片段生成语音。该项目提供了一系列预打包的声音,这些声音作为音频片段组织在单独的文件夹中。这些音频片段用于确定声音合成输出的许多属性,如声音的音高和音调、说话速度,甚至说话缺陷,如口吃或结巴。我们将深入选择该预存在的声音样本集中的一个声音。图 9.2展示了 TorToiSe-TTS-Fast 语音处理:

图 9.2 – TorToiSe-TTS-Fast 语音处理流水线
通过遵循图 9.2的步骤,您可以将额外的声音集成到 TorToiSe 中,增强其多功能性:
-
收集包含所需语音的音频样本。YouTube 上的访谈(可以使用
youtube-dl或pytubePython 库下载,就像我们在第六章中所做的那样)、有声读物和播客都是很好的信息源。我推荐Audacity工具作为录制您的声音和处理音频文件的可行选择。 -
将收集的音频分割成大约每个 10 秒的片段。至少需要 3 个片段,但建议使用更多片段以获得更好的结果。在测试过程中,我尝试了多达 5 个片段。
-
将音频片段转换为浮点编码和 22,050 Hz 的 WAV 格式。
-
稍后在本章中运行
LOAIW_ch09_1_Synthesizing_voices_with_tortoise_tts_fast.ipynb笔记本后,您将看到一个名为/tortoise/voices/的目录结构,其中包含音频片段样本。这是 TorToiSe 用来存储和检索音频样本的默认文件夹。如果您创建自己的样本,请在该/tortoise/voices/目录中创建一个文件夹并将文件保存在那里。例如,我创建了/tortoise/voices/josue文件夹来存储我的音频文件。 -
将处理过的音频片段转移到新创建的子目录中。
-
要利用新的语音,请执行
tortoise工具,并使用--voice标志,后面跟上您子目录的名称。
在探索 TorToiSe-TTS-Fast 流水线之后,可以明显感觉到高质量的音频数据是创造令人信服和自然音色的合成语音的基础。准备这些音频数据涉及创建新的录音或处理现有音频文件,以确保它们适合语音合成。这就是 Audacity 发挥作用的地方,作为音频创建、编辑和细化的强大工具。当然,我鼓励您使用其他您已经在音频处理中使用的工具;Audacity 和创建音频文件是可选的。
Audacity 是一个多功能工具,用于创建、编辑和处理音频文件,是语音合成流程中的关键步骤。它允许你录制语音样本、剪辑和分割音频片段、调整音频属性,如音调和速度,并导出多种兼容语音合成工具的格式。利用 Audacity 的功能,你可以准备适合语音合成要求的高质量音频数据。
使用 Audacity 进行音频处理
Audacity 的核心是一个多轨音频编辑器和录音机,支持许多操作系统,包括 Windows、macOS、GNU/Linux 和其他类 Unix 系统。它的开源特性确保它对所有用户免费,并培养了一个充满活力的开发者和音频爱好者社区,大家持续贡献其开发和改进。这种协作使 Audacity 拥有了各种功能,从基本的录音和编辑到更高级的特性,如噪声消除、频谱分析和支持多种音频格式。如果你偏好其他音频编辑软件,也可以选择它,使用 Audacity 是可选的。如果你决定安装,它这里有一步步的安装指南。
Audacity 的安装过程非常简单,无论你的操作系统是什么。详细的安装说明可以在 Audacity 网站上找到 (support.audacityteam.org/basics/downloading-and-installing-audacity)。在这里,我们将介绍将 Audacity 安装并运行在你的机器上的基本步骤。
安装 Audacity for Windows
按照以下步骤操作:
-
下载安装程序:访问 Audacity 官方网站 (
www.audacityteam.org/),点击 Windows 版本的下载链接。网站会自动检测你的操作系统,但如果需要,你也可以手动选择版本。 -
Downloads文件夹中)并双击以启动安装。你可能会遇到一个安全提示,询问是否允许安装程序更改你的系统;点击是继续。 -
按照安装向导操作:安装程序会引导你完成几个步骤。你将选择首选语言,同意许可协议,选择安装目录,并决定是否执行附加任务,如创建桌面快捷方式。
-
完成安装:配置好你的偏好设置后,点击安装开始安装。安装完成后,你可以直接从安装程序启动 Audacity,或者在开始菜单中找到它。
安装 Audacity for macOS
按照以下步骤操作:
-
下载 DMG 文件:访问 Audacity 官网并下载 macOS 版本。网站应自动提供与你系统匹配的版本。
-
将软件拖入
Applications文件夹进行安装。你可能需要使用管理员密码进行身份验证。 -
Applications文件夹。macOS 可能会提示您确认是否信任该应用程序,特别是在第一次运行时。
在 Linux 上安装 Audacity
Linux 用户可以从 Audacity 网站下载 AppImage,或者使用其发行版的包管理器安装 Audacity。对于 AppImage,请按照以下步骤操作:
-
使 AppImage 文件可执行:下载后,右键单击文件,导航至属性 | 权限,并勾选使文件可执行的选项。
-
运行 Audacity:双击 AppImage 文件以启动 Audacity。
或者,使用命令如sudo apt install audacity(适用于基于 Debian 的发行版)或sudo yum install audacity(适用于 Fedora/RHEL)通过终端安装 Audacity。
使用 TorToiSe-TTS-Fast 运行笔记本
在更详细了解 Audacity 作为音频创建、编辑和管理工具后,让我们动手使用 TorToiSe-TTS-Fast 进行操作。请找到并打开名为LOAIW_ch09_1_Synthesizing_voices_with_tortoise_tts_fast.ipynb的 Colab 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter09/LOAIW_ch09_1_Synthesizing_voices_with_tortoise_tts_fast.ipynb)。该笔记本基于 TorToiSe-TTS-Fast(github.com/152334H/tortoise-tts-fast)TTS 项目,该项目在不修改基础模型的情况下大幅提升了TorToiSe(github.com/neonbjb/tortoise-tts)的性能。
使用该笔记本,我们将通过初始化TextToSpeech模型和选择语音来从给定的文本中生成语音。此外,我们还将通过使用随机或自定义语音来探索 TorToiSe-TTS-Fast 项目的灵活性。我们可以通过上传和预处理 WAV 文件来为语音合成创建个性化的语音。
最后,我们将探索结合多种语音生成具有融合特征的语音的迷人能力。通过加载不同语音的样本和条件潜变量,我们可以创建独特而有趣的语音组合。
在本节结束时,您将对语音合成中的 TTS 有一个坚实的理解。您将掌握设置环境、初始化TextToSpeech模型、选择语音、生成语音以及使用 TorToiSe-TTS-Fast 项目创建自定义和组合语音的知识和实践技能。这个理解将为进一步探索语音合成的潜力及其在各个领域的应用打下基础。
让我们打开笔记本并运行单元,以更好地理解 TorToiSe-TTS-Fast 项目中的语音合成流程:
-
环境设置:在这里,我们将安装并实例化几个库,每个库在项目设置中扮演着不同的角色:
!git clone https://github.com/152334H/tortoise-tts-fast %cd tortoise-tts-fast !pip3 install -r requirements.txt --no-deps !pip3 install -e . !pip3 install git+https://github.com/152334H/BigVGAN.git !pip install transformers==4.29.2 !pip install voicefixer==0.1.2 %cd tortoise-tts-fast from huggingface_hub import notebook_login notebook_login() from huggingface_hub import whoami whoami()让我们简要回顾一下每个库的作用:
-
torch:这是 PyTorch 库,一个广泛使用的开源机器学习库,主要用于计算机视觉和自然语言处理应用。在本项目中,PyTorch 提供了构建和训练神经网络的基础框架,这些神经网络支撑了 TorToiSe-TTS-Fast 的语音合成功能。 -
torchaudio:作为 PyTorch 的扩展,torchaudio提供了在 PyTorch 框架内轻松访问音频处理工具的能力。它用于加载和保存音频文件,并对音频数据进行转换和增强,这些都是语音合成中的关键任务。 -
huggingface_hub:这是 Hugging Face 提供的库,允许用户轻松地将模型和其他文件下载或上传到 Hugging Face Hub,其中可能包含TextToSpeech类所需的预训练模型或组件。huggingface_hub库还提供了通过notebook_login()进行 Hub 认证的功能,并通过whoami()管理用户信息,方便访问 Hub 上存储的用于语音合成的模型和资源。 -
transformers (版本 4.29.2):这是 Hugging Face 提供的transformers库,提供了成千上万的预训练模型,涵盖各种自然语言处理任务,包括 TTS。此库支持 TorToiSe-TTS-Fast 项目中的 NLP 和 TTS 功能,提供访问最先进模型和工具的能力。 -
voicefixer (版本 0.1.2):该工具旨在修复和增强人声录音。voicefixer在语音合成系统处理前改善语音样本的质量,确保合成语音的更高保真度。 -
BigVGAN:TTS 模型使用BigVGAN库,在语音合成过程中发挥作用,增强生成语音的真实感或质量。
这些库每个都为 TorToiSe-TTS-Fast 项目的整体功能做出贡献,提供了机器学习、音频处理、模型管理和语音增强的基础工具和框架。这些工具使得人声合成的高效与实用成为可能。
-
-
用于合成语音的
TextToSpeech模型。本节中的步骤旨在初始化 TTS 模型,使其能够处理文本输入并生成对应的语音输出,使用所选的声音:from tortoise.api import TextToSpeech from tortoise.utils.audio import load_audio, load_voice, load_voices # This will download all the models Tortoise uses from the HuggingFace hub. tts = TextToSpeech()以下是前面代码中概述的步骤:
-
TextToSpeech``TextToSpeech类来自tortoise.api模块。该类是 TorToiSe-TTS-Fast 项目提供的 TTS 功能的主要接口。 -
TextToSpeech:导入该类后,通过简单调用类构造函数(不带任何参数)创建一个TextToSpeech实例。这个实例被分配给tts变量。 -
TextToSpeech,所需的模型会自动从 Hugging Face Hub 下载。此步骤确保所有用于语音合成的必要组件都已本地化。 -
TextToSpeech类封装了将文本转换为语音所需的功能。初始化它是为语音合成任务做好准备的关键步骤。一旦模型初始化完成,它可以在后续步骤中用于使用各种语音从文本生成语音。
-
-
选择语音:此部分对于通过允许你选择各种预先存在的语音样本或上传的语音片段来个性化语音合成过程至关重要。
import os from ipywidgets import Dropdown voices_dir = "tortoise/voices" # Get a list of all directories in the voices directory voice_names = os.listdir(voices_dir) voice_folder = Dropdown( options=sorted(voice_names), description='Select a voice:', value='tom', disabled=False, style={'description_width': 'initial'}, ) voice_folder import os from ipywidgets import Dropdown voices_dir = f"tortoise/voices/{voice_folder.value}" # Get a list of all directories in the voices directory voice_files = os.listdir(voices_dir) voice = Dropdown( options=sorted(voice_files), description='Select a voice:', # value='tom', disabled=False, style={'description_width': 'initial'}, ) Voice #Pick one of the voices from the output above IPython.display.Audio(filename=f'tortoise/voices/{voice_folder.value}/{voice.value}')选择特定语音进行合成的步骤如下:
-
os模块用于与操作系统交互,并列出tortoise/voices目录下所有可用的语音文件夹。此步骤对于识别哪些语音可供合成至关重要。 -
Dropdown类来自ipywidgets库。这个小部件允许你从可用的文件夹列表中选择一个语音文件夹。Dropdown小部件配置了由语音文件夹列表填充的选项、描述提示("Select a voice:")以及其他设置,确保其可用性。 -
使用
os.listdir函数,以及Dropdown小部件再次向你展示这些选项。 -
IPython.display.Audio类直接在 Colab 笔记本中播放选定的语音文件。此功能提供即时的听觉反馈,使你能够确认所选语音是否为期望的合成语音。
这些步骤共同提供了一种用户友好且互动性强的方法,帮助你选择合成语音。它们确保你能够轻松浏览可用选项,并根据你的偏好或项目需求做出明智的选择。
-
-
生成带有选定语音的语音:此笔记本部分根据你之前指定的语音从文本生成语音:
text = " Words, once silent, now dance on digital breath, speaking volumes through the magic of text-to-speech." preset = "ultra_fast" voice = voice_folder.value voice_samples, conditioning_latents = load_voice(voice) gen = tts.tts_with_preset(text, voice_samples=voice_samples, conditioning_latents=conditioning_latents, preset=preset) torchaudio.save(generated_filename, gen.squeeze(0).cpu(), 24000) IPython.display.Audio(generated_filename)本节的步骤旨在将你的输入文本转换为所选语音风格的口语。以下是代码中概述的步骤:
-
text。该文本将被合成成语音。 -
"ultra_fast"、"fast"、"standard"和"high_quality"。这些选项决定了生成速度与音频质量之间的权衡。 -
load_voice函数来自tortoise.utils.audio,用于加载选定的语音。此函数返回两个项:voice_samples和conditioning_latents。这些项将调整 TTS 模型,以生成符合所选语音风格的语音。 -
调用
tts对象(TextToSpeech类的实例)中的tts_with_preset方法,并传入文本、语音样本、条件潜变量和预设。这一方法根据给定参数合成语音。 -
使用
torchaudio.save函数。然后通过IPython.display.Audio播放文件,允许你听到合成的语音。
这些步骤使你能够使用所选语音的特定特征创建文本的语音版本,实质上使用 PVS 模型进行语音合成。
-
-
将
voice_samples和conditioning_latents设置为None,这将使用随机语音生成语音:gen = tts.tts_with_preset(text, voice_samples=None, conditioning_latents=None, preset=preset) torchaudio.save(' synthetized_voice_sample.wav', gen.squeeze(0).cpu(), 24000) IPython.display.Audio('synthetized_voice_sample.wav') -
使用自定义语音:以下代码允许用户上传他们的 WAV 文件(时长 6-10 秒)以创建自定义语音:
CUSTOM_VOICE_NAME = "custom" import os from google.colab import files custom_voice_folder = f"tortoise/voices/{CUSTOM_VOICE_NAME}" os.makedirs(custom_voice_folder) for i, file_data in enumerate(files.upload().values()): with open(os.path.join(custom_voice_folder, f'{i}.wav'), 'wb') as f: f.write(file_data) # Generate speech with the custom voice. voice_samples, conditioning_latents = load_voice(CUSTOM_VOICE_NAME) gen = tts.tts_with_preset(text, voice_samples=voice_samples, conditioning_latents=conditioning_latents, preset=preset) torchaudio.save(f'generated-{CUSTOM_VOICE_NAME}.wav', gen.squeeze(0).cpu(), 24000) IPython.display.Audio(f'generated-{CUSTOM_VOICE_NAME}.wav')它使用
os.makedirs创建一个自定义语音文件夹,并将上传的文件保存在该文件夹中。然后加载自定义语音并用它来生成语音,类似于 步骤 4 和 步骤 5。 -
load_voices函数加载多个语音(在本例中为'pat'和'william')。tts_with_preset方法结合语音样本和条件潜变量,生成具有两种语音特征的语音:voice_samples, conditioning_latents = load_voices(['freeman', 'deniro']) gen = tts.tts_with_preset("Words, once silent, now dance on digital breath, speaking volumes through the magic of text-to-speech.", voice_samples=voice_samples, conditioning_latents=conditioning_latents, preset=preset) torchaudio.save('freeman_deniro.wav', gen.squeeze(0).cpu(), 24000) IPython.display.Audio('freeman_deniro.wav')
在对语音合成中的 TTS 基础知识有了初步了解,并探索了 TorToiSe-TTS-Fast 项目的强大功能后,我们将把注意力集中在为语音合成过程准备数据的关键步骤上:将音频文件转换为 LJSpeech 格式。
PVS 步骤 1 – 将音频文件转换为 LJSpeech 格式
本节及随附的笔记本 LOAIW_ch09_2_Processing_audio_to_LJ_format_with_Whisper_OZEN.ipynb 代表了本章中 PVS 三步过程的初步步骤。此步骤以目标语音的音频样本为输入,并将其处理成 LJSpeech 数据集格式。该笔记本演示了如何使用 OZEN 工具包和 OpenAI 的 Whisper 来提取语音、转录并根据 LJSpeech 结构整理数据。最终得到的 LJSpeech 格式数据集,由分段的音频文件和相应的转录组成,作为第二步 PVS 步骤 2 – 使用 DLAS 工具包微调离散变分自编码器 的输入,在这一过程中,PVS 模型将使用该数据集进行微调。
LJSpeech 格式的数据集在 TTS 模型中至关重要,因为它为组织音频文件及其相应的转录提供了标准化结构。通过遵循 LJSpeech 格式,研究人员和开发者可以确保与各种 TTS 工具兼容,并促进训练。
LJSpeech 格式的数据集指的是按照LJSpeech 数据集(keithito.com/LJ-Speech-Dataset/)的结构和组织方式安排音频文件及其对应转录的特定结构。LJSpeech 数据集是一个公共领域的语音数据集,包含 13,100 个由单一发言人朗读七本非虚构书籍中的段落的短音频片段,每个片段都有相应的转录文本。这些音频片段的长度不一,总时长约为 24 小时。在为 TTS 模型训练准备 LJSpeech 格式的数据集时,建议使用以下结构:
-
音频片段应分割成单独的文件,并为每个文件提供相应的转录内容。
-
音频应使用 WAV 文件格式,以避免压缩伪影。
-
音频片段及其转录内容会被保存在名为
wavs的文件夹中。 -
一个元数据文本文件将每个音频片段映射到其转录内容。该文件应具有通过特殊字符(通常是管道符号
|)分隔的列,以区分音频文件名、转录文本和标准化转录文本。 -
元数据文件中使用的分隔符不应出现在转录文本中。
-
如果标准化转录不可用,则可以在两个列中使用相同的转录内容,后续流程中再进行标准化。
LJSpeech 格式数据集的文件夹结构如下所示:
/MyDataset
---├── train.txt
---├── valid.txt
---├── /wavs
---------├── 0.wav
---------├── 1.wav
...
文本文件中的条目将按如下格式进行组织:
wavs/0.wav|This is Josue Batista.
wavs/1.wav|I am the author of the book Learn OpenAI Whisper, Transform Your Understanding of Generative AI
wavs/2.wav|through robust and accurate speech processing solutions.
...
LJSpeech 格式被广泛使用,因为它受多种 TTS 工具的支持,例如 TorToiSe,它为 LJSpeech 数据集提供了相关工具。以这种方式格式化数据集,可以立即开始模型训练,而无需额外的格式化步骤。
现在我们了解了 LJSpeech 格式及其应用原因,接下来让我们将音频文件转换为这种格式。这样做将确保我们的数据集与各种 TTS 工具兼容,并为训练 PVS 模型做好准备。
一旦你有了想要合成的语音录音,下一步就是使用 OZEN 工具包预处理音频文件。该工具包简化了提取语音、使用 Whisper 转录并将结果保存为 LJSpeech 格式的过程。它可以处理单个音频文件或整个音频文件夹。
利用 OZEN 工具包和 Whisper,我们可以高效地将音频数据转换为 LJSpeech 格式。该工具包可以自动分割音频文件,生成相应的 WAV 文件,并创建必要的元数据文件(train.txt 和 valid.txt),将音频文件与它们的转录内容一一对应。
将音频文件转换为 LJSpeech 格式是语音合成流程中的一项关键技能,因为它确保了数据兼容性并促进了训练过程。掌握此技术将为你解决后续步骤,如微调 PVS 模型和语音合成,做好准备。
请查找并打开名为LOAIW_ch09_2_Processing_audio_to_LJ_format_with_Whisper_OZEN.ipynb的 Colab 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter09/LOAIW_ch09_2_Processing_audio_to_LJ_format_with_Whisper_OZEN.ipynb)。该笔记本基于 OZEN Toolkit 项目(github.com/devilismyfriend/ozen-toolkit)。给定一个文件夹或单个音频文件,它将提取语音,使用 Whisper 进行转录,并以 LJ 格式保存(分段音频文件以 WAV 格式存放在wavs文件夹中,转录内容存放在train和valid文件夹中)。让我们逐步解析代码,并提供代码示例:
-
克隆 OZEN Toolkit 仓库:以下命令从 GitHub 克隆 OZEN Toolkit 仓库,其中包含处理音频文件所需的脚本和工具:
!git clone https://github.com/devilismyfriend/ozen-toolkit -
安装所需的库:以下命令将安装音频处理、语音识别和文本格式化所需的库。安装完依赖项后,建议重启会话,以确保已安装的包正确初始化:
!pip install transformers !pip install huggingface !pip install pydub !pip install yt-dlp !pip install pyannote.audio !pip install colorama !pip install termcolor ozen-toolkit directory:%cd ozen-toolkit
-
下载示例音频文件:如果你没有合成用的音频文件,可以使用此命令从指定的 URL 下载一个示例音频文件进行演示:
/content/ozen-toolkit to store the uploaded files and saves them in that directory:import os
from google.colab import files
custom_voice_folder = "./myaudiofile"
os.makedirs(custom_voice_folder, exist_ok=True) # 如果目录不存在,则创建
for filename, file_data in files.upload().items():
使用
with open(os.path.join(custom_voice_folder, filename), 'wb') as f:f.write(file_data)
%ls -l "$PWD"/{,.}
-
使用
configparser库处理"config.ini"文件。它定义了各种设置,如 Hugging Face API 密钥、Whisper 模型、设备、分段和分割模型、验证比例以及分段参数:import configparser config = configparser.ConfigParser() config['DEFAULT'] = { 'hf_token': '<Your HF API key>', 'whisper_model': 'openai/whisper-medium', 'device': 'cuda', 'diaization_model': 'pyannote/speaker-diarization', 'segmentation_model': 'pyannote/segmentation', 'valid_ratio': '0.2', 'seg_onset': '0.7', 'seg_offset': '0.55', 'seg_min_duration': '2.0', 'seg_min_duration_off': '0.0' } with open('config.ini', 'w') as configfile: config.write(configfile) -
使用
ozen.py脚本并将示例音频文件作为参数(或上传的文件):ozen.py requires Hugging Face’s pyannote/segmentation model. This is a gated model; you MUST request access before attempting to run the next cell. Thankfully, getting access is relatively straightforward and fast. Here are the steps:1. You must already have a Hugging Face account; if you do not have one, see the instructions in the notebook for *Chapter 3*: `LOAIW_ch03_working_with_audio_data_via_Hugging_Face.ipynb` ([`github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter03/LOAIW_ch03_working_with_audio_data_via_Hugging_Face.ipynb`](https://github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter03/LOAIW_ch03_working_with_audio_data_via_Hugging_Face.ipynb))2. Visit [`hf.co/pyannote/segmentation`](https://hf.co/pyannote/segmentation) to accept the user conditions:

图 9.3 – Hugging Face 上的 pyannote/segmentation 门控模型
- 在确保已访问 pyannote/segmentation 模型后运行该单元格。
ozen.py脚本处理音频文件,提取语音,使用 Whisper 进行转录,并以 LJSpeech 格式保存输出。该脚本将 DJ 格式文件保存在名为ozen-toolkit/output/<音频文件名+时间戳>/的文件夹中。以下是预期文件结构的示例:
ozen-toolkit/output/
---├── Learn_OAI_Whisper_Sample_Audio01.mp3_2024_03_16-16_36/
------------------├── valid.txt
------------------├── train.txt
------------------├── wavs/
--------------------------├── 0.wav
--------------------------├── 1.wav
--------------------------├── 2.wav
-
挂载 Google Drive:以下代码行将你的 Google Drive 挂载到 Colab 环境中,允许访问 Google Drive 以保存检查点和加载数据集:
from google.colab import drive drive.mount('/content/gdrive') -
将
ozen-toolkit/output目录保存到 Google Drive。运行单元格后,使用网页浏览器打开 Google Drive,如 图 9.4 所示;你会看到一个名为output的目录,其中包含 DJ 格式的数据集文件:%cp -r /content/ozen-toolkit/output/ /content/gdrive/MyDrive/ozen-toolkit/output/以下是输出结果:

图 9.4 – 从 ozen.py 脚本中识别 DJ 格式文件的位置
运行单元格后,使用网页浏览器打开 Google Drive;你会看到一个名为 output 的目录,其中包含 DJ 格式的数据集文件:

图 9.5 – Google Colab 中 DJ 格式输出文件夹示例
LOAIW_ch09_2_Processing_audio_to_LJ_format_with_Whisper_OZEN.ipynb 笔记本中的 Python 代码演示了如何设置环境、安装依赖项、配置 OZEN 工具包、使用 Whisper 处理音频文件并将输出保存为 LJSpeech 格式。它提供了一个简化的工作流程,用于为进一步分析或下游任务准备音频数据。
现在我们的音频数据已转换为 LJSpeech 格式,我们已经做好了准备,进入语音合成过程的下一个关键阶段:使用强大的 DLAS 工具包微调 PVS 模型。LOAIW_ch09_3_Fine-tuning_PVS_models_with_DLAS.ipynb 笔记本将在下一节详细介绍这个过程。通过利用 DLAS 工具包的全面功能和结构化的 LJSpeech 数据集,我们可以创建一个个性化的语音模型,精准且自然地捕捉目标语音的独特特征。
PVS 步骤 2 – 使用 DLAS 工具包微调 PVS 模型
微调 PVS 模型是创建个性化语音、捕捉语音独特特征的关键步骤。为了获得高质量的结果,必须使用一个强大的框架,利用最先进的技术,并提供灵活性来定制训练过程。DLAS 工具包成为微调 PVS 模型的综合解决方案,提供了多种功能和能力。
在开始微调过程之前,确保必要的组件和资源到位至关重要。这包括设置合适的训练环境,比如 Google Colab,它提供了强大的 GPU 和足够的 RAM 来处理 PVS 模型的计算需求。检查 NVIDIA GPU 的可用性和兼容性对于确保训练期间的最佳性能至关重要。
数据集准备阶段是微调 PVS 模型的另一个重要方面。DLAS 工具包要求具有特定仓库结构和依赖关系的数据集,必须在继续之前克隆和安装。此外,预训练模型检查点,如离散变分自编码器(dVAE),在学习语音数据的离散潜在表示中发挥关键作用。验证这些检查点的完整性对加速微调过程和获得更好结果至关重要。
基于数据集大小选择适当的超参数对于微调 PVS 模型至关重要。DLAS 工具包为超参数提供智能建议,如批量大小、学习率衰减步数和验证频率,所有这些建议都考虑了数据集的特定特征。理解这些超参数如何计算以及它们对训练过程的影响对于实现最佳结果至关重要。
定制化是使用 DLAS 工具包微调 PVS 模型的另一个关键方面。研究人员和开发人员通常对训练设置有特定的需求和偏好,例如实验名称、数据集名称以及开启或关闭某些功能。DLAS 工具包提供了修改这些设置的灵活性,允许根据具体需求和目标进行定制化微调过程。
DLAS 工具包利用 YAML 配置文件来确保微调过程根据所需规范进行配置。该文件作为训练过程的蓝图,指定了各种参数和设置。工具包使用复杂的 sed 命令将定制的训练设置应用于 YAML 文件,确保微调过程按特定要求进行,并实现实验的可重现性(sed 代表流编辑器,是一种强大的命令行实用程序,用于使用简单、紧凑的编程语言解析和转换文本)。
配置文件准备就绪后,可以通过运行 DLAS 工具包提供的 train.py 脚本启动训练过程。此脚本利用 GPU 的强大计算能力有效地微调 PVS 模型,利用优化算法和损失函数指导学习过程。监控训练进度并使用适当的指标评估模型的性能对于确保微调 PVS 模型的质量至关重要。
最后,保存和导出经过微调的 PVS 模型对于将来的使用和部署至关重要。DLAS 工具包提供了便捷的方法来存储训练模型的检查点和实验文件,确保数据的持久性,并促进研究协作。对微调模型的适当管理和组织对于无缝集成到各种应用程序中至关重要,如虚拟助手、有声读物朗读和个性化语音界面。
研究人员和开发人员可以通过理解细化 PVS 模型时所涉及的组件、过程和注意事项,利用 DLAS 工具包创建个性化的语音,捕捉其中的细微差别和特点。定制训练过程、选择合适的超参数以及利用预训练的检查点,使用户能够实现高质量的结果,并探索语音合成中的令人兴奋的可能性。
请查找并打开名为 LOAIW_ch09_3_Fine-tuning_PVS_models_with_DLAS.ipynb 的 Colab 笔记本 (github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter09/LOAIW_ch09_3_Fine-tuning_PVS_models_with_DLAS.ipynb)。
本笔记本使用 DLAS 工具包对 PVS 模型进行微调。它基于 TorToiSe fine-tuning with DLAS 项目,由 James Betker 开发 (github.com/152334H/DL-Art-School)。我克隆并修改了代码,使其能在 Google Colab 上运行,并利用 NVIDIA GPU 进行训练。
让我们逐步浏览 LOAIW_ch09_3_Fine-tuning_PVS_models_with_DLAS.ipynb 笔记本中的步骤:
-
nvidia-smi命令。如果连接了 GPU,它会打印出 GPU 的信息:gpu_info = !nvidia-smi gpu_info = '\n'.join(gpu_info) if gpu_info.find('failed') >= 0: print('Not connected to a GPU') else: print(gpu_info) -
psutil库。如果它使用的是高内存的运行时,它会打印出一条消息:from psutil import virtual_memory ram_gb = virtual_memory().total / 1e9 print('Your runtime has {:.1f} gigabytes of available RAM\n'.format(ram_gb)) if ram_gb < 20: print('Not using a high-RAM runtime') else: print('You are using a high-RAM runtime!') -
挂载 Google Drive:以下代码将您的 Google Drive 挂载,以便保存训练的检查点并加载数据集:
from google.colab import drive drive.mount('/content/gdrive') -
安装依赖项:它克隆了 DLAS 仓库,下载了预训练的模型检查点,并安装了所需的依赖项:
!git clone https://github.com/josuebatista/DL-Art-School.git %cd DL-Art-School !wget https://huggingface.co/Gatozu35/tortoise-tts/resolve/main/dvae.pth -O experiments/dvae.pth !wget https://huggingface.co/jbetker/tortoise-tts-v2/resolve/main/.models/autoregressive.pth -O experiments/autoregressive.pth Dataset_Training_Path and ValidationDataset_Training_Path, click on Google Colab’s Files option and search Google Drive for the directory where the DJ-format datasets were stored in the previous notebook. *Figure 9**.6* shows an example of where the DJ-format dataset is found. Keep in mind that *Figure 9**.6* is just an example. Do not search for that literal name. Instead, you must search for the directory name you set while creating the DJ-formatted files:

图 9.6 – 在前一个笔记本创建的输出目录中搜索 DJ 格式数据集的示例
以下是执行超参数计算的完整脚本。代码列出后将提供其工作原理的解释:
from pathlib import Path
from math import ceil
DEFAULT_TRAIN_BS = 64
DEFAULT_VAL_BS = 32
Dataset_Training_Path = "/content/gdrive/MyDrive/Generative_AI/Deep_Fakes_Voice/output/Learn_OAI_Whisper_Sample_Audio01.mp3_2024_03_16-16_36/train.txt" #@param {type:"string"}
ValidationDataset_Training_Path = "/content/gdrive/MyDrive/Generative_AI/Deep_Fakes_Voice/output/Learn_OAI_Whisper_Sample_Audio01.mp3_2024_03_16-
if Dataset_Training_Path == ValidationDataset_Training_Path:
print("WARNING: training dataset path == validation dataset path!!!")
print("\tThis is technically okay but will make all of the validation metrics useless. ")
print("it will also SUBSTANTIALLY slow down the rate of training, because validation datasets are supposed to be much smaller than training ones.")
def txt_file_lines(p: str) -> int:
return len(Path(p).read_text().strip().split('\n'))
training_samples = txt_file_lines(Dataset_Training_Path)
val_samples = txt_file_lines(ValidationDataset_Training_Path)
if training_samples < 128: print("WARNING: very small dataset! the smallest dataset tested thus far had ~200 samples.")
if val_samples < 20: print("WARNING: very small validation dataset! val batch size will be scaled down to account")
def div_spillover(n: int, bs: int) -> int: # returns new batch size
epoch_steps,remain = divmod(n,bs)
if epoch_steps*2 > bs: return bs # don't bother optimising this stuff if epoch_steps are high
if not remain: return bs # unlikely but still
if remain*2 < bs: # "easier" to get rid of remainder -- should increase bs
target_bs = n//epoch_steps
else: # easier to increase epoch_steps by 1 -- decrease bs
target_bs = n//(epoch_steps+1)
assert n%target_bs < epoch_steps+2 # should be very few extra
return target_bs
if training_samples < DEFAULT_TRAIN_BS:
print("WARNING: dataset is smaller than a single batch. This will almost certainly perform poorly. Trying anyway")
train_bs = training_samples
else:
train_bs = div_spillover(training_samples, DEFAULT_TRAIN_BS)
if val_samples < DEFAULT_VAL_BS:
val_bs = val_samples
else:
val_bs = div_spillover(val_samples, DEFAULT_VAL_BS)
steps_per_epoch = training_samples//train_bs
lr_decay_epochs = [20, 40, 56, 72]
lr_decay_steps = [steps_per_epoch * e for e in lr_decay_epochs]
print_freq = min(100, max(20, steps_per_epoch))
val_freq = save_checkpoint_freq = print_freq * 3
print("===CALCULATED SETTINGS===")
print(f'{train_bs=} {val_bs=}')
print(f'{val_freq=} {lr_decay_steps=}')
print(f'{print_freq=} {save_checkpoint_freq=}')
让我们分解这一部分的目的和步骤:
-
代码导入了必要的库:
pathlib中的Path用于处理文件和目录,ceil是内建math模块中的一个函数,用于将数字向上舍入到最接近的整数。 -
它定义了默认的训练和验证批量大小值:
DEFAULT_TRAIN_BS = 64 和 DEFAULT_VAL_BS =32。 -
您需要提供训练和验证数据集的路径:
Dataset_Training_Path和ValidationDataset_Training_Path。 -
代码检查训练和验证数据集路径是否相同。如果相同,它将打印出警告信息,指出验证指标将无用,并且训练速度将显著变慢。
-
代码定义了一个辅助函数
txt_file_lines,它以文件路径作为输入,并返回文件中的行数。 -
它通过调用
txt_file_lines并传入相应的数据集路径来计算训练和验证样本。 -
如果数据集的大小较小,代码会打印警告信息:训练样本小于 128,验证样本小于 20。
-
它定义了一个辅助函数
div_spillover,该函数以样本数量(n)和批次大小(bs)作为输入,并返回调整后的批次大小,以最小化每个 epoch 中剩余样本的数量。 -
代码根据训练样本的数量计算训练批次大小(
train_bs)。如果训练样本数量小于DEFAULT_TRAIN_BS,则将train_bs设置为训练样本数量并打印警告信息。否则,它会调用div_spillover,并使用训练样本数量和DEFAULT_TRAIN_BS来计算调整后的批次大小。 -
类似地,它根据验证样本的数量计算验证批次大小(
val_bs)。如果验证样本数量小于DEFAULT_VAL_BS,则将val_bs设置为验证样本数量。否则,它会调用div_spillover,并使用验证样本数量和DEFAULT_VAL_BS来计算调整后的批次大小。 -
代码通过将训练样本数量除以训练批次大小来计算每个 epoch 的步数(
steps_per_epoch)。 -
它通过
lr_decay_epochs = [20, 40,56, 72]定义学习率衰减应该发生的 epochs。 -
代码通过将
steps_per_epoch与lr_decay_epochs中的每个值相乘来计算学习率衰减的相应步数(lr_decay_steps)。 -
它根据每个 epoch 的步数计算打印训练进度的频率(
print_freq),最小为 20,最大为 100。 -
代码将验证频率和保存检查点的频率(
val_freq和save_checkpoint_freq)设置为print_freq值的三倍。 -
最后,代码打印计算出的设置:
train_bs、val_bs、val_freq、lr_decay_steps、print_freq和save_checkpoint_freq。 -
来自 DLAS 训练器的创建者,
print_freq、val_freq和save_checkpoint_freq的值应该根据数据集的大小进行调整。Python 代码给出了推荐值:val_freq == save_checkpoint_freq == print_freq*3;print_freq == min(epoch_steps,100)。再次强调,这些是建议值;我鼓励你尝试不同的值并比较结果,以找到最佳的超参数设置。
通过计算这些超参数,代码旨在提供可以用于训练 PVS 模型的合理默认值。然而,如果需要,我们可以在后续的部分覆盖这些计算出的值。
-
训练设置:这一部分允许我们根据需求和可用资源自定义训练设置。它提供了灵活性,可以命名实验、指定数据集名称、开启或关闭某些功能,并覆盖计算得出的设置。代码中还包括了注释和警告,指导你根据系统的存储和计算能力做出合适的选择:
Experiment_Name = "Learn_OAI_Whisper_20240316" Dataset_Training_Name= "TestDataset" ValidationDataset_Name = "TestValidation" SaveTrainingStates = False Keep_Last_N_Checkpoints = 0 Fp16 = False Use8bit = True TrainingRate = "1e-5" TortoiseCompat = False TrainBS = "" ValBS = "" ValFreq = "" LRDecaySteps = "" PrintFreq = "" SaveCheckpointFreq = "" def take(orig, override): if override == "": return orig return type(orig)(override) train_bs = take(train_bs, TrainBS) val_bs = take(val_bs, ValBS) val_freq = take(val_freq, ValFreq) lr_decay_steps = eval(LRDecaySteps) if LRDecaySteps else lr_decay_steps print_freq = take(print_freq, PrintFreq) save_checkpoint_freq = take(save_checkpoint_freq, SaveCheckpointFreq) assert len(lr_decay_steps) == 4 gen_lr_steps = ', '.join(str(v) for v in lr_decay_steps)让我们来分解这一部分的目的和步骤:
-
你可以指定以下训练设置:
-
Experiment_Name: 用于命名实验的字符串。 -
Dataset_Training_Name: 用于命名训练数据集的字符串。 -
ValidationDataset_Name: 用于命名验证数据集的字符串。 -
SaveTrainingStates: 一个布尔值,用于指示是否保存训练状态。 -
Keep_Last_N_Checkpoints: 一个整数滑块,用于指定要保留的检查点数量。将其设置为 0 表示保留所有保存的模型。
-
-
代码提供了注释和警告:
-
它提到,如果保持所有保存的模型(将
Keep_Last_N_Checkpoints设置为 0),可能会导致存储不足的问题。 -
没有训练状态时,
Fp16: 一个布尔值,用于开启或关闭 16 位浮点精度。 -
Use8bit: 一个布尔值,用于开启或关闭 8 位精度。 -
TrainingRate: 用于指定学习率的字符串。 -
TortoiseCompat: 一个布尔值,用于开启或关闭与 TorToiSe 模型的兼容性。建议在训练过程中开启它以引入破坏性更改,然后禁用它以重现旧的模型。
-
-
计算得出的设置覆盖:
-
你可以通过指定
TrainBS、ValBS、ValFreq、LRDecaySteps、PrintFreq和SaveCheckpointFreq的值来手动覆盖前一单元格中计算得出的设置。 -
如果为空,则使用前一单元格中计算得出的默认值。
-
-
代码定义了一个
take函数,用于覆盖计算得出的设置。如果覆盖值为空字符串,它将返回原始值;否则,返回覆盖后的值。 -
代码将覆盖后的值或默认值分配给相应的变量:
train_bs、val_bs、val_freq、lr_decay_steps、print_freq和save_checkpoint_freq。 -
最后,代码提示你在编辑设置后运行该单元格。
-
-
sed命令:%cd /content/DL-Art-School # !wget https://raw.githubusercontent.com/152334H/DL-Art-School/master/experiments/EXAMPLE_gpt.yml -O experiments/EXAMPLE_gpt.yml !wget https://raw.githubusercontent.com/josuebatista/DL-Art-School/master/experiments/EXAMPLE_gpt.yml -O experiments/EXAMPLE_gpt.yml import os %cd /content/DL-Art-School !sed -i 's/batch_size: 128/batch_size: '"$train_bs"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/batch_size: 64/batch_size: '"$val_bs"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/val_freq: 500/val_freq: '"$val_freq"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/500, 1000, 1400, 1800/'"$gen_lr_steps"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/print_freq: 100/print_freq: '"$print_freq"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/save_checkpoint_freq: 500/save_checkpoint_freq: '"$save_checkpoint_freq"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's+CHANGEME_validation_dataset_name+'"$ValidationDataset_Name"'+g' ./experiments/EXAMPLE_gpt.yml !sed -i 's+CHANGEME_path_to_validation_dataset+'"$ValidationDataset_Training_Path"'+g' ./experiments/EXAMPLE_gpt.yml if(Fp16==True): os.system("sed -i 's+fp16: false+fp16: true+g' ./experiments/EXAMPLE_gpt.yml") !sed -i 's/use_8bit: true/use_8bit: '"$Use8bit"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/disable_state_saving: true/disable_state_saving: '"$SaveTrainingStates"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/tortoise_compat: True/tortoise_compat: '"$TortoiseCompat"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/number_of_checkpoints_to_save: 0/number_of_checkpoints_to_save: '"$Keep_Last_N_Checkpoints"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/CHANGEME_training_dataset_name/'"$Dataset_Training_Name"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's/CHANGEME_your_experiment_name/'"$Experiment_Name"'/g' ./experiments/EXAMPLE_gpt.yml !sed -i 's+CHANGEME_path_to_training_dataset+'"$Dataset_Training_Path"'+g' ./experiments/EXAMPLE_gpt.yml if (not TrainingRate=="1e-5"): os.system("sed -i 's+!!float 1e-5 # CHANGEME:+!!float '" + TrainingRate + "' #+g' ./experiments/EXAMPLE_gpt.yml")让我们来分解这一部分的目的和步骤:
-
代码使用
%cd魔法命令将当前目录更改为/content/DL-Art-School。 -
它使用
wget命令从 GitHub 仓库152334H/DL-Art-School下载一个名为EXAMPLE_gpt.yml的全新 YAML 配置文件,并将其保存在experiments目录中。 -
代码接着使用一系列
sed命令,根据用户定义的设置修改EXAMPLE_gpt.yml文件中的值:-
它用分别存储在
$train_bs和$val_bs变量中的值替代训练和验证的batch_size值。 -
它将
val_freq值更新为存储在$val_freq中的值。 -
它用
$gen_lr_steps中存储的值替换学习率衰减步骤。 -
它用
$print_freq和$save_checkpoint_freq中存储的相应值更新print_freq和save_checkpoint_freq的值。
-
-
该代码将 YAML 文件中的占位符替换为用户定义的值。
-
最后,如果
TrainingRate不等于默认值1e-5,代码会使用sed将 YAML 文件中的CHANGEME:占位符替换为用户定义的TrainingRate值。
通过修改 YAML 文件中的用户指定值,训练过程可以根据您的需求进行定制。这确保了训练过程是基于您的偏好和数据集规格配置的。
-
-
使用配置好的 YAML 文件的
train.py脚本。如果您对结果满意并看到以下输出,按下该单元格的停止按钮:INFO:base:Saving models and training states图 9.7 显示了输出示例和 Google Colab 文件界面中
60_gtp.pht检查点的样子:

图 9.7 – 60 轮训练时检查点文件的示例
如果您的训练过程保存了很多模型,可能会超过 Google Colab 运行时的存储限制。为防止这种情况,请尝试在训练过程中通过文件资源管理器面板删除 /content/DL-Art-School/experiments/$Experiment_Name/(models|training_state)/ 中的旧检查点。训练崩溃后恢复训练需要编辑配置文件,因此尽量避免这种情况发生:
%cd /content/DL-Art-School/codes
!python3 train.py -opt ../experiments/EXAMPLE_gpt.yml
-
将
experiments文件夹上传到 Google Drive 以确保数据持久性:Experiment_Name variable:

图 9.8 – Google Drive 中包含 DLAS 检查点文件的文件夹示例
您将在 <Experiment_Name>/models 文件夹中找到模型检查点——也就是带有 .pth 扩展名的文件:

图 9.9 – DLAS 检查点文件示例。在接下来的步骤中,您将需要一个检查点文件来合成经过微调的 PVS 模型。
这就结束了我们对使用 DLAS 工具包微调 PVS 的概述。那个 .pth 文件就是我们刚刚用 DLAS 创建的微调 PVS 模型。在接下来的步骤中,我们将使用该文件通过 TorToiSe-TTS-Fast 合成语音。
微调 PVS 模型 – 超参数与数据集大小
在微调 PVS 模型时,考虑超参数与数据集大小之间的关系至关重要。Google Colab 训练笔记本会根据提供的数据集大小自动建议合适的超参数,以确保最佳性能和结果。
需要记住的一个关键点是每个 epoch 的步数(epoch_steps)是根据dataset_size // batch_size计算得出的。训练器会丢弃部分批次,因此选择一个能够整除数据集的批次大小非常重要。
如果您的数据集相对较小(50-500 个样本),请考虑调整以下超参数:
- 减小批次大小:为了最小化丢弃样本,选择一个能够整除数据集大小的批次大小。
gen_lr_steps应小于epoch_steps * 10。实验表明,如果在第 20 个 epoch 没有衰减,损失可能会增加。
根据数据集的大小调整print_freq、val_freq和save_checkpoint_freq。推荐的设置是val_freq == save_checkpoint_freq == print_freq*3;print_freq == min(epoch_steps,100)。
通过根据数据集大小精确调节这些超参数,您可以优化微调过程,并在 PVS 模型中获得更好的结果。
成功使用 DLAS 工具包微调我们的 PVS 模型后,我们现在准备通过合成语音来测试我们的个性化语音,以捕捉目标语音的精髓。在下一部分中,我们将探索使用微调后的模型生成真实且富有表现力的语音,将合成的语音赋予生命,并开启各种令人兴奋的应用潜力。
PVS 步骤 3 – 使用微调后的 PVS 模型合成语音
使用微调后的 PVS 模型合成语音是语音合成过程的高潮,此时个性化的语音被赋予生命。它是微调模型进行测试的阶段,生成真实且自然的语音。能够使用微调后的 PVS 模型合成语音,打开了各种应用场景,从创建虚拟助手、电子书旁白到个性化语音界面。
在开始语音合成之旅时,有几个关键组件和考虑因素需要注意。首先,必须具备适合的计算环境,能够处理语音合成的计算需求。这通常涉及到利用 GPU 的强大计算能力,特别是 NVIDIA GPU,这可以显著加速合成过程。检查 GPU 的可用性和兼容性对于确保语音生成的顺利和高效至关重要。
除了硬件要求外,语音合成过程还依赖于强大的软件堆栈。TorToiSe-TTS-Fast 项目是一个高性能的 TTS 系统,成为了一个强大的工具。为了使用 TorToiSe-TTS-Fast,必须克隆项目仓库并安装所需的依赖项,确保所有必要的库和包都已准备就绪。
加载经过微调的 PVS 模型是语音合成过程中的关键步骤。在微调阶段,我们将模型存储在Google Drive中作为检查点文件或序列化模型对象。微调模型的存储位置和格式可能会根据您在微调过程中使用的具体位置有所不同。
在加载完经过微调的 PVS 模型后,下一步是准备将要合成成语音的文本输入。根据所需的输出,文本输入可以是一个单句、一个段落或一份脚本。确保文本输入格式正确,并且没有任何可能影响合成语音质量的错误或不一致性是至关重要的。
语音合成过程包括将文本输入馈送到经过微调的 PVS 模型,并生成相应的音频输出。在这个过程中,模型运用其学到的知识将文本转化为模仿我们作为基础使用的声音的语音。合成过程可能涉及多种技术,如神经声码器,以生成高质量的音频波形。
根据具体要求和偏好,在语音合成过程中可以调整各种参数和设置。这些参数可能包括说话速率、音调、音量和生成语音的情感语气。微调这些参数可以更好地控制最终输出,并有助于实现合成语音的期望表现力和自然度。
一旦语音合成过程完成,生成的音频可以保存为适合播放的文件格式,如 WAV 或 MP3。这使我们能够轻松地将合成语音集成到各种应用和平台中。在选择输出文件格式时,需要考虑期望的音频质量和兼容性——即,"ultra_fast"、"fast"(默认)、"standard"或"high_quality"。
最后,评估合成语音的质量和自然性是过程中的关键步骤。这可以包括主观评估,例如由人工评估人员进行的听力测试,以及衡量生成语音各个方面的客观指标,如清晰度、自然性和与目标声音的相似度。根据评估结果进行迭代优化和微调,可以帮助提高合成语音的整体质量。
研究人员和开发者通过了解合成语音所涉及的组件、考虑事项和步骤,可以释放个性化语音生成的潜力。创造出能够捕捉声音本质的逼真且富有表现力的语音,为多个领域带来了激动人心的可能性,从娱乐和教育到无障碍技术及更多。通过正确的工具、技巧和对细节的关注,使用微调 PVS 模型的语音合成过程可以成为语音和音频处理领域中一项强大而具有变革性的技术。
请找到并打开名为 LOAIW_ch09_4_Synthesizing_speech_using_fine-tuned_PVS_models.ipynb 的 Colab 笔记本(github.com/PacktPublishing/Learn-OpenAI-Whisper/blob/main/Chapter09/LOAIW_ch09_4_Synthesizing_speech_using_fine-tuned_PVS_models.ipynb)。
本笔记本演示了如何检查 GPU 和 RAM,安装必要的库,加载微调的 PVS 模型,使用该模型合成语音,并播放生成的音频。代码依赖于 tortoise-TTS-Fast 项目来实现高性能的语音合成。接下来我们将逐步讲解 LOAIW_ch09_4_Synthetizing_speech_using_fine-tuned_PVS_models.ipynb 文件中的代码,包括解释和代码示例:
-
nvidia-smi命令。它会打印 GPU 信息,如果连接了 GPU,则显示相关信息;否则,会提示没有连接 GPU:gpu_info = !nvidia-smi gpu_info = '\n'.join(gpu_info) if gpu_info.find('failed') >= 0: print('Not connected to a GPU') else: print(gpu_info) -
psutil库。它会打印可用的 RAM 数量(单位为 GB),并指示是否使用高内存运行时:from psutil import virtual_memory ram_gb = virtual_memory().total / 1e9 print('Your runtime has {:.1f} gigabytes of available RAM\n'.format(ram_gb)) if ram_gb < 20: print('Not using a high-RAM runtime') else: print('You are using a high-RAM runtime!') -
从 GitHub 获取
tortoise-tts-fast仓库并使用pip3安装所需的依赖项:!git clone **https://github.com/152334H/tortoise-tts-fast** %cd tortoise-tts-fast !pip3 install -r requirements.txt --no-deps transformers, voicefixer, and BigVGAN, using pip3:!pip3 install transformers==4.29.2
!pip3 uninstall voicefixer
!pip3 install voicefixer==0.1.2
!pip3 install git+https://github.com/152334H/BigVGAN.git
-
挂载 Google Drive:我们必须挂载 Google Drive 以加载之前创建的微调 PVS 模型:
from google.colab import drive drive.mount('/content/gdrive') -
gpt_path) 和需要合成的文本(text):gpt_path = '/content/gdrive/MyDrive/<filepath/ filename_gpt.pth' .pth checkpoint file in Google Colab’s Copy Path:

图 9.10 – 在 Google Colab 中通过 DLAS 创建的检查点文件示例
-
使用指定的参数运行
tortoise_tts.py脚本,包括用于推理速度的--preset选项、用于微调模型路径的--ar_checkpoint选项、用于输出文件名的-o选项,以及需要合成的文本:tortoise-tts-fast/scripts/results/ directory. You will find the generated audio from the voice synthesis model in that directory. We use IPython to display and play the synthesized audio file.import IPython
IPython.display.Audio('/content/tortoise-tts-fast/scripts/results/random_00_00.wav')
*Figure 9**.11* shows an example of the directory structure and files created by TorToiSe-TTS-Fast:

图 9.11 – 使用微调的 PVS 模型检查点 .pth 文件通过 TorToiSe-TTS-Fast 创建的音频文件示例
我鼓励你仔细检查并运行本章中的所有笔记本。它们提供了利用微调 PVS 模型进行高质量、高效 TTS 合成的端到端实践理解。这些知识将使你能够创建 PVS 应用,并通过本书中学到的技术与 TorToiSe-TTS-Fast 项目相结合,探索个性化语音生成的潜力。
总结
在本章中,我们探索了使用 OpenAI 的 Whisper 进行 PVS。我们发现了如何利用其强大功能,创建捕捉声音独特特征或完全新声音的定制语音模型,开辟了广泛的激动人心的应用场景。
我们首先探索了语音合成中的 TTS 基础,深入了解了神经网络、音频处理和语音合成的作用。我们学习了如何使用 OZEN 工具包和 Whisper 将音频文件转换为 LJSpeech 格式,这是一种在 TTS 任务中常用的标准化数据集结构。这一实践经验为语音合成过程中的后续步骤奠定了坚实的基础。
接下来,我们深入研究了 DLAS 工具包,这是一个强大的框架,用于微调 PVS 模型。我们学习了如何设置训练环境、准备数据集和配置模型架构。通过利用 Whisper 的精准转录,我们将音频片段与相应的文本对齐,创建了一个适合训练个性化 PVS 模型的数据集。
通过实践示例和代码片段,我们获得了微调预训练 PVS 模型的实战经验,使用了我们的 LJSpeech 数据集。我们发现了如何定制训练过程、选择合适的超参数并评估模型的性能。这一经验使我们具备了创建高质量个性化 PVS 模型的知识和技能。
最后,我们通过合成逼真且富有表现力的语音来测试微调后的 PVS 模型。我们学习了如何通过向模型提供文本输入来生成自然的语音,赋予我们合成的声音生命。创建个性化语音的能力打开了广泛的应用场景,从虚拟助手和有声书解说到个性化语音界面。
随着本章的结束,我们展望了第十章,与 Whisper 共同塑造未来。在这一最终章中,我们将探索 ASR 领域的演变,以及 Whisper 在塑造未来中的作用。我们将深入研究未来趋势、预期功能、伦理考量以及语音技术的整体发展方向,包括先进的语音 TTS 微调技术。这一前瞻性的视角将为我们提供知识和远见,以为 ASR 和语音技术的未来做好准备和适应。
第十章:与 Whisper 一起塑造未来
欢迎来到本书的最后一章,我们将在这一章深入探讨 ASR 的未来及其令人激动的可能性。本章将探索塑造 ASR 领域的进展和趋势,并阐明 OpenAI 开创性的 Whisper 模型可能带来的影响,激发对未来的期待。
我们将从探索提升 Whisper 准确性和鲁棒性的持续努力开始。这包括增加训练数据、领域特定微调和模型架构优化等技术。这些理论努力对 Whisper 在不同语言、口音和声学条件下的性能具有实际意义,我们将在本章中深入探讨。
此外,本章还将强调在开发和部署 ASR 技术中,伦理考量和负责任的人工智能实践的关键作用。我们将探讨确保公平性、缓解偏见、保护用户隐私以及为负责任地使用 Whisper 和其他 ASR 系统建立指导方针的策略。
最后,我们将展望 ASR 的未来以及不断发展的语音技术领域。你将了解新兴架构、训练技术,以及多模态接口和无文本自然语言处理(NLP)在革新我们与语音语言互动方式方面的潜力。
本章将涵盖以下主题:
-
预测 Whisper 的未来趋势、功能和改进
-
考虑 ASR 技术的伦理影响
-
为不断发展的 ASR 和语音技术领域做准备
在本章结束时,作为一名 ASR 专业人士、研究人员和爱好者,你将全面了解 ASR 领域的前沿进展和未来发展方向。这将使你能够利用 Whisper 和其他最先进的模型,构建创新、包容和负责任的语音启用应用程序。准备好塑造 ASR 的未来,并在令人激动的语音技术世界中解锁新的可能性。
预测未来的趋势、功能和改进
本节将探讨提高 OpenAI Whisper 准确性、鲁棒性和性能的持续努力。我们将讨论诸如增加训练数据、利用领域特定微调、优化模型架构以及实施应对偏见和公平性挑战的策略等技术。这些进展提升了 Whisper 的能力,使其成为各种自动语音识别(ASR)应用中更强大的工具。
提高准确性和鲁棒性
OpenAI Whisper 已经展示了在跨多种语言的语音转录和翻译方面的卓越能力。然而,在准确性、鲁棒性和效率方面,总是有改进的空间。本节将探讨可以提升 Whisper 性能的关键领域,包括优化模型架构和推理过程,以提供更加精确和可靠的结果。
优化模型架构和推理
在 Whisper 的编码器-解码器变换器模型的基础上,研究人员正在探索新的架构和技术,这些方法有可能在降低计算成本的同时进一步提升模型性能。
一个显著的架构优化实例是 Hugging Face 的工作,他们通过两项关键技术提升,已将 Whisper 推理代码的速度提高了多达 40%:
首先,他们将原生缩放点积注意力(SDPA)集成到了 Whisper 的架构中。SDPA 是一种基于变换器的神经网络(如 Whisper)处理语音输入的机制。通过优化 Whisper 在原生 SDPA 集成中的计算负载,Hugging Face 使得模型在不牺牲准确性的情况下更加高效地处理语音数据。
其次,Hugging Face 转而使用高度优化的 Torch 后端来计算短时傅里叶变换(STFT),这是语音识别音频信号预处理中的一个关键组件。利用 Torch 后端能够在 GPU 上更快地计算 STFT,从而进一步提升整体速度。
这些优化的影响体现在 Whisper 的large-v3模型的实时因子(RTF)从 10.3 降低到 7.45,而distil-v2模型的 RTF 则从 4.93 提升至 2.08。通过简化计算过程并利用更高效的算法,这些优化提升了 Whisper 的性能,并使其在大规模部署时更加可及且具成本效益。
采用量化技术,即降低模型权重和激活的精度,可以在不影响准确性的前提下进一步提升 Whisper 的效率。通过智能压缩模型参数,量化技术允许更快速的推理时间和更小的内存占用,使得 Whisper 能够在更多设备和平台上部署。
增强标点符号、话者分离和非语音检测
基于 Whisper 基础的更先进模型正在开发中,旨在提供更精确和可靠的标点符号预测。这些模型通过结合上下文理解、语言规则以及诸如词性标注、依赖句法分析和语言建模等技术,旨在生成更加贴近人类句子结构和可读性的转录文本。因此,这些先进的模型能够更好地理解转录文本的句法和语义结构,使得它们能够预测出更准确、符合上下文的标点符号,这对于生成易于理解的转录文本至关重要,并且对后续应用程序十分有用。
此外,正在进行的研究致力于改进 Whisper 的说话人分离能力,使其能够准确识别并区分单个音频记录中的多个说话者。这一进展对转录会议、采访和多人对话特别有价值,因为在这些场合下,将语音归属于正确的说话者对清晰性和语境至关重要。
增强 Whisper 对非语音声音(如笑声、音乐或背景噪音)的检测和处理能力,有助于提高生成转录的整体鲁棒性。通过准确识别和标注这些非语音元素,Whisper 可以提供更全面和细致的音频内容呈现,使转录文本在分析和解读时更具价值。
解决偏差和公平性挑战
在我们努力提高 Whisper 的准确性和鲁棒性的同时,解决可能出现的偏差和公平性问题至关重要。为了确保 Whisper 的性能提升能够惠及所有用户,必须优先收集多样化和具有代表性的训练数据集。
这涉及积极地寻求并包括来自不同人口群体、口音和语言背景的语音数据。通过将多样化的声音和语音模式纳入训练数据,Whisper 可以更准确地识别和转录不同人群的语音。
数据增强、分层抽样和集成方法可以减轻偏差并促进 Whisper 预测的公平性:
-
数据增强通过对现有数据应用各种变换(如音调转换、速度变化或添加背景噪音)来创造额外的训练样本。这有助于增加训练数据的多样性和鲁棒性。
-
分层抽样确保训练数据能代表不同的人口群体和语言变异。通过仔细平衡训练集的构成,Whisper 可以学会在不同子群体中公平地进行表现。
-
集成方法涉及将多个在不同数据子集上训练的模型或使用其他架构结合起来。通过汇总多个模型的预测,集成方法有助于减轻单个模型的偏差,并提高整体准确性和公平性。
通过积极解决这些偏差和公平性问题,我们可以开发出一个高度准确、鲁棒、包容和公平的 ASR 系统。这对于确保 Whisper 的进展能够为所有用户提供利益,不论其背景或语言特征如何,是至关重要的。
虽然 Whisper 在多语言 ASR 方面取得了显著进展,但它在扩展语言支持方面仍有巨大的潜力。提高模型准确转录和翻译更多语言的能力对于让 ASR 技术在全球范围内更加包容和易于访问至关重要。
扩展 OpenAI Whisper 的语言支持
OpenAI Whisper 已经展示了令人印象深刻的多语言能力,支持多种语言的转录和翻译。然而,特别是在低资源和代表性不足的语言方面,仍然有很大的改进和扩展空间。
增加低资源语言的训练数据
影响 Whisper 在某一语言中准确性和表现的主要因素之一是训练数据的可用性。如在研究论文《通过大规模弱监督实现稳健的语音识别》(即Whisper 论文)(cdn.openai.com/papers/whisper.pdf)中所述,模型的表现与训练数据量密切相关。Whisper 约三分之一的训练数据来自非英语语言,其中大多数语言的数据量不到 1,000 小时,而英语的数据量则远高于此。这一差异限制了模型在低资源语言中的潜力。
在过去的一年中,增加低资源语言训练数据的有针对性努力对于解决性能差异并提高 Whisper 在更广泛语言范围内的准确性至关重要。通过积极收集和整理来自这些语言的多样化语音数据,Whisper 可以学习并适应它们独特的语言模式、音素、语法结构、口音和方言。这一训练数据的扩展将提升模型的性能,使其更具鲁棒性、公平性和包容性,确保自动语音识别(ASR)技术的好处能够惠及更广泛的语言社区。
利用迁移学习和自监督预训练
除了增加训练数据外,迁移学习和自监督预训练等先进技术也能显著提升 Whisper 在低资源语言上的表现。迁移学习涉及利用从高资源语言中获得的知识来提高模型对低资源语言的理解。通过识别共享的语言特征和模式,Whisper 可以在有限的监督数据下更高效地学习并适应新语言。
另一方面,自监督预训练使 Whisper 能够从大量未标记的语音数据中学习。通过将模型暴露于多样化的语音样本而无需明确的转录,它可以发现可跨语言转移的内在结构和表示。这种无监督学习方法对于低资源语言尤其宝贵,因为标注数据稀缺,它使 Whisper 能够捕捉语言无关的特征,进而提高其整体语言理解能力。
开发更具包容性和多样性的数据集
为了确保 Whisper 的语言扩展既广泛又不偏不倚、具有强健性,优先发展包容性和多样化的数据集至关重要。这涉及到积极寻找并整合来自不同来源、口音和领域的语音数据。通过训练多样化的语音和语言变体,Whisper 可以学会更准确地识别和转录不同人群和地区方言的语音。
像 Mozilla 的 Common Voice 项目这样的倡议,在通过众包多语言语音数据集实现语音技术普及方面至关重要。通过动员全球语言社区和志愿者,这些努力旨在创建代表人类语音丰富多样性的规模庞大的开源数据集。将这些数据集纳入 Whisper 的训练管道,可以显著提高其语言覆盖面和公平性。
优化多语言模型架构
随着 Whisper 扩展以支持数百种甚至数千种语言,优化其模型架构变得越来越重要。研究人员正在探索各种技术,以提高多语言模型的效率和性能,例如高效的参数架构、特定语言组件和增强的跨语言表示。
一种有前景的方法是使用适配器模块,这些轻量级神经网络可以插入到预训练模型中,专门针对特定语言或任务进行优化。通过在保持核心模型参数不变的情况下微调这些适配器,Whisper 可以在不进行广泛再训练的情况下,更高效地适应新语言。这种模块化方法使得语言扩展更加快速且具有可扩展性。
另一个研究方向是开发特定语言的组件,例如语言嵌入或语言相关的注意力机制。这些组件使 Whisper 能够更有效地捕捉每种语言独特的特征和细微差别,从而提高识别准确性和语言理解能力。
增强语言识别和代码切换
在现实世界的多语言环境中,识别口语语言和处理代码切换(在口语中混合多种语言)是关键挑战。为了使 Whisper 在这些场景中更加实用和有价值,持续的研究旨在增强其语言识别能力,并提高其对代码切换的鲁棒性。
利用语音和韵律特征的先进语言识别技术能够使 Whisper 准确判断一句话的语言,甚至适用于短语音片段。通过结合声学和语言学线索,Whisper 能够更可靠地在语言之间快速切换,确保在多语言对话中的无缝转录和翻译。
此外,为了有效处理语言混合,开发专门的模型和训练策略来处理代码切换语音可以显著提升 Whisper 的表现。通过向模型展示各种代码切换示例,并结合语言特定的约束和转换概率,Whisper 可以更有效地应对多语言语音的复杂性。
扩展语言支持的重要性
扩展 Whisper 的语言支持是一个技术挑战,也是将语音识别技术推广到全球的重要步骤。全球有超过 7000 种语言,其中大部分当前未得到现有语音技术的充分支持,而 Whisper 有潜力弥合这一语言鸿沟。通过支持更多语言,Whisper 可以为多语言人群提供更多的信息、服务和沟通渠道,推动教育、医疗、政府服务和娱乐等领域的关键应用。此外,Whisper 的语言扩展工作可以促进跨语言交流,打破语言障碍,促进不同语言背景的人们之间更自然、更无缝的互动,推动全球文化交流、合作与理解。此外,多语言 Whisper 模型为其他高级语音 AI 任务提供了基础,如语言理解、对话系统和语音对语音翻译,推动自然语言处理领域的创新与进步。
基于扩展版 Whisper 模型的语音接口可以改善受限读写能力人士或更愿意使用母语与技术互动的人的可访问性。这种包容性确保了语音识别技术的好处不仅仅限于高资源语言的使用者,而是能够惠及全球各地的社区。通过在多种语言中提供高质量的语音识别能力,Whisper 促进了更复杂、更具包容性的语音应用的开发,解锁了语音技术在全球用户中的全部潜力。
生成准确且易读的转录文本不仅仅是将语音转换为文本。随着 Whisper 扩展其语言支持并提升处理多样语言结构的能力,准确的标点、大写字母和说话者分段变得更加重要。这些元素在创建能够捕捉不同语言和文化背景下口语细微差别的可读输出中发挥着至关重要的作用。通过增强 Whisper 在这些方面的能力,我们可以确保扩展语言支持的好处得到充分实现,从而为全球更广泛的用户创造高质量、可访问的转录文本。
在 OpenAI Whisper 中实现更好的标点、格式化和说话者分段
OpenAI Whisper 在多种语言的语音转录中展现了出色的能力。虽然当前版本的 Whisper 在标点、说话者分段和非语音检测方面已经表现出一定的能力,但仍需进一步改进,以缩小原始语音识别输出和人类可读转录文本之间的差距。增强这些能力至关重要,原因有几个。首先,它极大地提高了转录文本的可读性和可用性,因为标点符号传达了语音的结构、语调和意图,使得转录文本更容易被人类读者理解和跟踪。其次,准确的说话者分段能够清晰地解释对话中谁说了什么,提供了转录内容的关键上下文。最后,检测并妥善处理非语音元素,如笑声、沉默或背景噪音,有助于更全面、细致的音频表现。本节将探讨为完善 Whisper 在处理这些关键方面的能力而开发的基本技术和方法,提升其准确性和鲁棒性。
增强标点和大写字母
准确的标点和大写字母使得转录文本更易读、易懂,并且对下游任务更有价值。实现这一目标的一种方法是将独立的标点和大写字母模型作为后处理步骤,在 Whisper 生成初步转录之后进行集成。这些模型可以恢复标点符号,如句号、逗号、问号和感叹号,正确地大写专有名词,并且开始句子。
然而,需要注意的是,单纯依赖文本的模型有时可能会产生比直接从音频中提取的标点更不理想的输出。未来的研究旨在开发更加复杂的方法,利用文本和声学线索实现更加准确和具有上下文相关性的标点。
提高时间戳的准确性,以便更好地对齐
Whisper 会输出每个转录语音段的时间戳,表示对应的音频片段。然而,这些时间戳可能会有几秒钟的提前或延迟,这会对说话人分离造成负面影响。像 WhisperX 和 stable-ts 这样的工具正在开发中,旨在通过使用基于音素的模型(如 wav2vec2.0)来强制对齐转录和音频,以解决这个问题。通过实现更精确的单词级时间戳,这些技术能够更准确地将说话人标签映射到转录的语音段上。
增强说话人嵌入和聚类
说话人分离涉及在对话中识别并将语音段分配给各个说话人。在获取精确的时间戳之后,下一步是将每个语音段映射到一个说话人标签。这个过程通常涉及使用像 TitaNet 这样的模型提取说话人嵌入,然后通过聚类将嵌入分组,以便将相同说话人的语音段归为一类。
当前的研究集中于改进说话人嵌入模型和聚类算法,以实现更低的分离错误率。通过利用更强大且更具区分性的说话人表示,Whisper 能够更准确地区分说话人,并为每个语音段分配正确的标签。
处理说话人重叠和打断
多个说话人重叠的语音仍然是分离系统面临的一个重大挑战。当多个说话人同时讲话或互相打断时,很难准确地将语音归属于正确的个体。未来的研究旨在开发先进的方法来检测打断点,并更有效地处理说话人重叠。
一种有前景的方法是采用源分离技术,将每个说话人的音频流隔离开来。通过将重叠的语音分离到不同的通道,Whisper 可以更容易地识别并转录每个说话人的贡献。这项功能将在现实场景中非常有价值,尤其是在对话经常涉及动态轮流发言和打断时。
利用标点符号进行说话人切换检测
Whisper 预测的标点符号可以为优化说话人分离提供有价值的线索。由于说话人变化通常发生在自然停顿或句子边界处,标点符号的出现可以指示潜在的说话人切换点。通过根据标点符号重新对齐分离输出,可以修正轻微的错误,从而得到更连贯、更准确的说话人分割。
首先,准确的说话人分离可以更精确地将语音映射到单个说话人,这对于情感分析、对话摘要和说话人归属的机器翻译等下游任务至关重要。通过正确识别谁说了什么,Whisper 可以提供更丰富、更有上下文的对话表示。
此外,改进的标点符号和格式化有助于将转录文本划分为连贯的句子和段落。这种语义结构增强了各种自然语言处理(NLP)模型的性能,例如用于信息提取、命名实体识别和机器翻译的模型。
最后,具有准确标点符号、大小写和发言者标签的转录文本更容易进行自动化处理和分析。通过减少对人工后期编辑的需求,Whisper 能够节省大量时间和精力,从而在各种应用中更快、更高效地利用语音数据。
随着 OpenAI Whisper 的不断发展,集成高级技术,如标点恢复、时间戳对齐、发言者嵌入和重叠处理,将显著提升其转录文本的质量和可用性。结合这些改进,Whisper 旨在生成能够捕捉对话语音所有细微差别和动态的转录文本,架起原始语音识别输出与可读文档之间的桥梁。
准确的标点符号、格式化和发言者区分不可过分强调。这些元素对于释放语音数据的真正潜力至关重要,能够促进更复杂的分析、摘要和翻译任务。随着 Whisper 在这些领域推动技术边界,它将为各种应用提供支持,从虚拟助手、客户服务到媒体分析和教育内容创作。
在标点建模、发言者区分及相关领域的持续研究和开发工作为 Whisper 的未来和更广泛的自动语音识别(ASR)领域带来了巨大前景。通过走在这些进展的前沿,Whisper 有望彻底改变我们与语音数据互动和利用的方式,使其比以往任何时候都更加易于访问、可操作和有价值。
随着即时语音识别需求在各类应用中的增长,提升 OpenAI Whisper 的速度和实时性能已成为关键的关注点。加速 Whisper 的推理并实现流畅、低延迟的语音转文本转换,将为互动性和时效性要求高的用例开辟新的可能性。
加速 OpenAI Whisper 的性能并实现实时能力
随着即时语音识别需求在各类应用中的增长,提升 OpenAI Whisper 的速度和实时性能已成为关键的关注点。本节将探讨为加速 Whisper 的推理并实现流畅、低延迟的语音转文本转换所开发的基本技术和优化方法。
实现流式推理以进行实时转录
为了实现准确的实时语音识别,Whisper 必须支持流式推理,这是一个至关重要的新兴能力。在流式推理中,模型处理音频片段时不再等待整个音频文件的到达,而是随着音频片段的到来进行处理。这可以在最小的延迟下生成转录,并与说话者的语速同步。优化片段大小、采样率和缓冲区管理,确保实时性能的平稳和不中断。通过仔细平衡这些参数,Whisper 可以在响应速度和准确性之间找到最佳平衡,大大提高其效率和实时能力。
通过压缩技术减少模型大小
加速 Whisper 推理速度的另一种有效策略是使用量化、蒸馏和参数共享来压缩模型大小。量化通过降低模型权重和激活的精度来减少模型的大小,而蒸馏则涉及训练一个更小、更高效的学生模型,模拟较大教师模型的行为。参数共享则旨在识别并利用模型架构中的冗余。通过减少模型的内存占用和计算复杂度,这些压缩技术可以显著加速推理,并使得在资源有限的边缘设备上进行实时应用部署变得更可行。
利用硬件加速
利用专用硬件的强大计算能力,如 GPU、TPU 和专门的 AI 加速器,可以显著加速 Whisper 神经网络的计算。通过为特定硬件架构优化模型,并使用 NVIDIA TensorRT 或 Intel OpenVINO 等框架,可以实现显著的性能提升。这些硬件加速技术通过并行处理、混合精度算术和定制指令集等技术,最大化吞吐量并最小化延迟。将 Whisper 部署在高性能计算基础设施上,可以实现比实时还要快的转录和快速处理大量音频数据。
在挑战性环境中提高准确性和鲁棒性
尽管速度对于实时语音识别至关重要,但它不应以牺牲准确性和鲁棒性为代价。在噪声环境、不同口音和自发性语音等具有挑战性的现实条件下提升 Whisper 的性能,对于可靠的实时操作至关重要。像谱增强这样的技术,在训练过程中向音频频谱引入随机扰动,可以提高模型对噪声的抗干扰能力。语音适应方法,如对少量特定说话人数据进行微调,可以帮助 Whisper 更好地处理个体语音模式的变化。此外,结合上下文语言模型,利用周围的文本来优化预测,可以提升在复杂语言场景中的准确性。
加速 Whisper 的性能并实现实时能力的重要性不言而喻。它为各个领域带来了广泛的变革性应用。在无障碍领域,实时转录使聋人或听力障碍者能够充分参与讲座、会议和现场活动。对于语音助手和聊天机器人等对话式 AI 界面,瞬时语音识别是实现自然、类人交互的关键。实时 ASR 使得时间敏感型应用成为可能,包括直播字幕、紧急响应转录和同声传译,在这些场景中,即便几秒钟的延迟也可能产生破坏性影响。
此外,比实时性能更快的表现带来了显著的计算效率和可扩展性优势。通过减少音频数据在缓冲区中停留的时间,大规模转录任务的整体延迟和处理成本可以显著降低。这对于处理海量音频内容的组织尤为重要,因为它能够加速索引、搜索和分析过程。
展望未来,Whisper 在速度和实时能力上的进展将为无缝、无处不在的语音交互开辟新的时代。随着边缘计算的普及,能够在智能手机、智能音响和物联网传感器等设备上执行实时语音识别,将实现保护隐私的离线语音界面。这种去中心化的自动语音识别(ASR)方法将开启全新的环境计算应用,让语音命令和对话可以在本地处理,无需依赖云端连接。
总之,持续优化 Whisper 架构、压缩模型大小、利用硬件加速,并提升其在复杂环境下的准确性,对于实现实时、低延迟的语音识别至关重要。随着这些进展的实现,Whisper 将成为一个更加强大和多功能的工具,推动在无障碍、对话式 AI、实时翻译和边缘计算等领域的广泛变革应用。语音交互的未来是即时、准确且无处不在的语音识别成为常态,而 OpenAI Whisper 正站在实现这一愿景的前沿。
Whisper 在速度和实时能力上的进展,加上其扩展的语言支持,开辟了无缝多语言通信的激动人心的可能性。随着 Whisper 能够即时转录和翻译多种语言的语音,它能够打破语言障碍,促进更加自然高效的跨语言互动。将 Whisper 与其他 AI 技术,如机器翻译和自然语言理解结合,能够进一步增强其弥合语言差距的能力,并推动更复杂的多语言应用。
加强 Whisper 与其他 AI 系统的集成
随着人工智能的快速发展,将 OpenAI Whisper 与其他前沿 AI 技术结合,正成为未来发展的关键领域之一。通过将 Whisper 最先进的语音识别能力与其他 AI 模型结合,研究人员和开发人员旨在创建更强大、更加多功能且用户友好的应用程序,能够以越来越自然和富有上下文的方式理解和响应人类的语言。
将 Whisper 与大型语言模型结合
将 Whisper 与其他 AI 系统结合的一个最有前景的途径是与大型语言模型的结合,如 GPT-4、Mistral、Claude 和 Llama。这些先进的语言模型已经展现出了卓越的自然语言理解、生成和推理能力,使其成为 Whisper 语音识别功能的理想搭档。
将 Whisper 与这些语言模型结合,使得创建端到端的语音识别-文本转化-动作执行流程成为可能,这些流程能够处理口语输入、理解其含义,并生成适当的响应或动作。例如,Whisper 可以将用户的语音转录,然后将其输入 GPT-3 来总结内容、提取相关行动项、生成连贯的回复,甚至将消息翻译成另一种语言。这种语音识别与语言理解的紧密结合,使得开发更自然和高效的基于语音的界面成为可能,能够真正理解用户意图并提供有帮助的、与上下文相关的帮助。
通过 Whisper 实现多模态 AI 应用
Whisper 与其他 AI 系统结合的另一个令人兴奋的前沿领域是多模态 AI 应用。通过将 Whisper 的语音识别能力与计算机视觉模型(用于图像和视频理解)、机器人传感器融合模型以及其他专业 AI 组件相结合,开发人员能够创建能够同时处理并理解多种输入模式的智能系统。
例如,由 Whisper 和计算机视觉 AI 驱动的虚拟助手,可以理解和响应语音命令,并解释用户的视觉提示和手势,从而实现更直观、沉浸的互动体验。类似地,配备 Whisper 和传感器融合 AI 的自动驾驶汽车,可以处理乘客的语音指令,同时分析来自摄像头和激光雷达的实时视觉和空间数据,以安全高效地导航。
将 Whisper 与多模态 AI 技术集成,为创造能够更类人地感知、理解和与世界互动的智能系统开辟了广阔的可能性。通过利用不同 AI 模型在各种模态中的优势,这些系统能够提供更全面、上下文感知的帮助,从而提升用户体验并在复杂的现实场景中改善决策过程。
通过 Whisper 和对话模型为对话式 AI 提供支持
对话式 AI 是 Whisper 与其他 AI 模型集成的另一个重要领域,具有巨大的潜力。研究人员和开发者可以通过将 Whisper 的精准语音转文本功能与先进的对话管理模型、意图识别系统和自然流畅的文本转语音引擎结合,创造出高度复杂的对话代理,进行流畅、上下文相关且类人的互动。
Whisper 与这些对话式 AI 组件的集成,使得语音助手、聊天机器人和其他对话界面的开发成为可能,这些系统不仅能够高精度地理解并转录用户语音,还能解释其潜在意图,保持连贯的对话上下文,并生成自然、动态适应的回应。这种集成水平使得人机互动更加引人入胜和富有成效,用户可以通过自然语音表达需求、提问和指令,并获得智能的、个性化的帮助作为回馈。
将 Whisper 与其他 AI 系统集成的重要性
将 Whisper 与其他 AI 技术集成,对于实现语音界面的最大潜力至关重要,并为各个领域的广泛变革性应用打开了大门。通过结合多个互补的 AI 模型的优势,开发者能够创造出更强大、自然且用户友好的系统,这些系统能够以越来越复杂且与上下文相关的方式理解、处理和响应人类语音。
Whisper 与其他 AI 模型的紧密集成的一个关键好处是能够实现多模态 AI 应用,这些应用能够处理并结合语音、视觉、语言及其他输入模态,以更加类人的方式理解和与世界互动。这样的多模态智能对于开发能够在复杂的现实环境中有效运作,并为用户提供全面、上下文感知帮助的 AI 系统至关重要。
此外,将 Whisper 与语言模型和机器翻译系统的结合为实时语音到语音的翻译应用铺平了道路,这些应用能够打破语言障碍,促进更加自然的跨语言交流。这些集成系统可以通过无缝地将一种语言的口语转换为另一种语言,促进在日益全球化的世界中更好的理解、合作和文化交流。
将 Whisper 与其他 AI 模型集成的另一个显著优势是提高效率,减少延迟和计算成本。通过优化不同 AI 组件之间的互动和数据流,开发人员可以创建更简化且资源高效的流程,以处理语音输入并生成响应,最大限度地减少延迟,从而使强大的 AI 应用在现实世界部署中更具可行性。
将 OpenAI Whisper 与其他前沿 AI 技术相结合对于开发更先进、自然和可访问的基于语音的界面至关重要。通过将 Whisper 的最先进语音识别能力与语言模型、计算机视觉、对话系统及其他 AI 组件相结合,研究人员和开发人员可以创建理解、处理并以日益复杂和具有上下文相关性的方式回应人类语音的智能系统。随着 Whisper 不断发展并与其他 AI 模型更紧密地融合,它将在塑造人机互动的未来中发挥关键作用,启用一系列能够提升全球人们生产力、可访问性和生活质量的变革性应用。
考虑伦理影响
随着像 OpenAI Whisper 这样的自动语音识别(ASR)技术日益成熟并广泛采用,解决与其开发和部署相关的伦理问题至关重要。本节将深入探讨确保公平性、减少偏见、保护用户隐私和数据安全,以及为其负责任使用制定准则和保护措施等关键问题。通过积极建立负责任的 ASR 部署框架,我们可以在利用这些技术带来益处的同时,减少潜在的风险和负面后果。
确保 ASR 的公平性并减少偏见
像 Whisper 这样的 ASR 系统可能在某些类型的语音上表现出偏差,比如非母语口音、方言、年龄群体和性别。研究表明,这些偏差可能导致更高的错误率和不平等的用户体验,进而导致对服务不足人群的歧视。解决不同人群间的性能差异是确保公平性和减轻 ASR 偏见的主要伦理考虑之一,这对于提供公平的访问和防止歧视至关重要。开发包容性和多样化的训练数据集对于减少这些性能差异至关重要。通过在训练数据中加入多种口音、方言和人群,ASR 模型可以学会更准确地识别和转录不同用户群体的语音。此外,实施数据增强和迁移学习等技术可以帮助提高 ASR 模型在处理多样化语音模式时的鲁棒性。
负责任的数据收集和使用实践
负责任的数据收集和使用实践确保了 ASR 系统的公平性。模型可能会放大训练数据中的偏见,导致性能偏差并延续社会不平等。为了解决这一问题,必须优先考虑数据收集过程中的多样性、包容性和隐私保护。
一个重要的伦理考虑是,在尊重用户同意和数据保护的前提下,获取各类人群的代表性语音数据。这涉及实施透明的数据收集政策,获取参与者的知情同意,并确保敏感语音数据的安全存储和处理。通过遵循负责任的数据实践,ASR 开发者可以构建更具包容性和无偏见的模型,以满足不同用户群体的需求。
促进透明性和责任性
透明性和责任性是开发和部署像 Whisper 这样的 ASR 系统中的关键伦理考虑。清晰的开发过程、训练数据以及 ASR 模型潜在局限性的文档能够帮助做出知情决策,并建立用户的信任。
为了促进透明性,提供有关 ASR 系统的适当使用案例、不同人群的性能特征以及已知偏差的详细信息至关重要。这使得用户和利益相关者能够了解技术的能力和局限性,并就其部署做出明智的决策。
责任机制,如定期审计和公平性评估,对于识别和减轻 ASR 模型中的偏见至关重要。这些评估应包括多方利益相关者,包括 AI 研究人员、伦理学家、政策制定者和受影响的社区,以全面理解系统对不同用户群体的影响。
促进跨学科合作
解决 ASR 中的公平性问题和减轻偏差需要合作和跨学科的方法。与各方利益相关者合作,包括人工智能研究人员、伦理学家、政策制定者以及受影响的社区,有助于发现盲点、理解社会影响并开发包容性解决方案。
关于偏差减轻策略的跨学科研究,如数据增强、模型选择技术和公平性约束,对于这一领域的进展至关重要。通过汇聚计算机科学、语言学、社会学和伦理学等各个领域的专家,我们可以更全面地理解这些挑战,并制定实际解决方案,确保 ASR 系统中的公平性。
确保公平性并减少像 OpenAI Whisper 这样的自动语音识别(ASR)系统中的偏差是一个多方面的挑战,需要解决性能差异、负责任的数据实践、透明度和问责制,以及跨学科的合作。通过优先考虑这些伦理问题,我们可以构建更加包容和公平的 ASR 技术,造福所有用户,同时坚持公平和社会正义的原则。
在开发和部署 ASR 系统时,另一个关键的伦理问题是保护用户隐私和数据安全。随着 Whisper 和其他 ASR 技术的普及,处理敏感语音数据的强有力保护措施和最佳实践变得至关重要。
保护隐私和数据
训练像 Whisper 这样的 ASR 系统需要大量的语音数据,这可能引发关于收集、存储和使用可能敏感音频记录的隐私问题。保护数据隐私、获得知情同意并实施强有力的数据保护措施是至关重要的伦理优先事项。联邦学习被提议作为一种保护隐私的 ASR 模型训练方法。
获得知情同意并确保透明度
在使用如 OpenAI Whisper 等 ASR 系统时,保护隐私和数据的一个关键伦理问题是获得被收集语音数据的个人的知情同意。知情同意包括充分披露数据收集的范围、语音数据的使用目的,以及可访问这些数据的各方。这样的透明度让用户能够做出知情决定,是否同意他们的语音数据被 ASR 系统收集和使用。
为了确保透明度,ASR 系统提供商应在其隐私政策中传达他们的数据实践。这些政策应该易于访问,并且采用通俗易懂的语言,让用户理解他们的语音数据将如何处理。通过在数据实践中保持透明并获得知情同意,ASR 系统提供商可以与用户建立信任,并展示他们致力于维护用户隐私权的承诺。
实施强有力的数据安全措施
保护 ASR 系统收集的语音数据隐私需要实施强大的数据安全措施。语音数据可能是敏感的,可能揭示个人信息、生物识别细节以及个人生活中的私密方面。因此,必须采取措施保护这些数据,防止未授权访问、滥用或泄露。
ASR 系统提供商应采用诸如数据加密、安全存储和访问控制等技术,以确保用户语音数据的机密性和完整性。加密有助于保护数据在传输和存储过程中的安全,使其对未授权方不可读。安全存储包括使用受保护的数据库和服务器,并实施严格的访问控制,确保只有授权人员可以访问数据。
定期进行安全评估和更新数据保护措施对于应对不断变化的威胁并保持符合隐私法规至关重要。这包括进行漏洞扫描、渗透测试和安全审计,以识别和解决系统安全防护中的潜在弱点。通过实施强大的数据安全措施,ASR 系统提供商可以最大程度地减少数据泄露的风险,并保护用户隐私。
遵守数据最小化和目的限制原则
在 ASR 系统中,负责任的数据管理涉及遵守数据最小化和目的限制的原则。
数据最小化意味着只收集和保留为特定、合法目的所需的最低限度语音数据。ASR 系统应设计成仅收集功能所需的数据,避免收集过多或不相关的信息。
目的限制涉及明确定义收集和使用语音数据的目的,并确保在未获得用户同意的情况下,数据不会用于其他目的。这有助于防止语音数据的滥用,并与用户的期望保持一致。ASR 系统提供商应对收集和使用语音数据的具体目的保持透明,并应获得用户同意以将数据用于其他目的。
通过遵守数据最小化和目的限制原则,ASR 系统提供商可以展示其对负责任数据管理的承诺,并保护用户隐私。这种做法有助于建立与用户的信任,并确保遵守数据保护法规。
赋予用户控制其数据的权力
给予用户对其语音数据的控制权对保护 ASR 系统中的隐私至关重要。用户应能够访问、审查、修正或删除其数据。这使用户能够管理其个人信息,并确保他们控制语音数据的使用方式。
ASR 系统提供商应实施机制,允许用户行使其数据权利,例如提供便于访问和管理数据的用户友好界面。用户还应能够随时选择退出数据收集或撤回同意。这使得用户能够做出有关隐私偏好的知情决策,并赋予他们控制语音数据的权力。
尊重用户权利(如 GDPR 下的被遗忘权)是赋权用户的另一个重要方面。ASR 系统提供商应有流程来尊重用户的数据删除请求,并确保在不再需要或用户未请求时,语音数据能够安全地被删除。
通过让用户掌控他们的语音数据并尊重他们的数据权利,ASR 系统提供商可以展示他们对用户隐私的承诺,并与用户群体建立信任。这种做法符合伦理原则和保护个人数据的法律要求。
在 ASR 系统(如 OpenAI Whisper)的背景下保护隐私和数据是一个重要的伦理考虑。获得知情同意、实施强有力的数据安全措施、遵守数据最小化和目的限制原则,以及赋予用户控制其数据的权力,都是保护用户隐私的重要策略。
通过优先考虑这些伦理原则,ASR 系统提供商可以减轻隐私风险,遵守数据保护法规,并促进这些技术的负责任开发和部署。确保用户语音数据的隐私和安全是伦理义务,也是 ASR 系统在各个领域广泛采用和有益使用的关键。
随着 ASR 技术的不断进步和普及,开发者、研究人员和组织必须时刻关注隐私问题,并实施数据保护的最佳实践。通过这样做,我们可以在尊重个人隐私权的同时,利用像 Whisper 这样的 ASR 系统的强大功能,并促进这些技术的负责任使用,以造福社会。
除了应对公平性和隐私问题外,像 Whisper 这样的自动语音识别(ASR)系统的负责任开发和部署需要明确的指导方针和保障措施。建立一个技术伦理使用框架对于防止滥用、保护弱势群体以及确保透明度和问责制至关重要。
建立负责任使用的指导方针和保障措施
通过主动建立负责任的 ASR 部署框架,我们可以在减轻潜在风险和负面后果的同时,充分利用这些技术的好处。
确定适当的使用场景并防止滥用
制定负责任的 ASR 使用指南的主要目标之一是定义适当的使用场景,并防止滥用或恶意应用。清晰的指南应概述可以使用 ASR 系统(如 Whisper)的预期目的,例如转录、语言学习或无障碍服务。这些指南还应明确禁止将 ASR 用于未经授权的录音、监控或生成虚假音频内容。
为了防止滥用,ASR 系统提供商应实施访问控制和身份验证措施,以确保只有授权用户能够使用该技术。这可能需要用户注册、API 密钥身份验证或其他形式的访问管理。此外,提供商应教育用户有关 ASR 技术的伦理界限和负责任的使用,强调获取同意和尊重隐私权的重要性。
实施透明度和问责制措施
透明度和问责制是负责任使用 ASR 的重要组成部分。ASR 系统提供商应对其技术的能力、局限性和潜在偏见保持透明。用户应了解其语音数据如何被收集、处理和保护。这种透明度帮助用户做出是否使用 ASR 系统的知情决策,并让他们理解参与的意义。
为确保问责制,ASR 系统提供商应建立监督机制和定期审计,以验证是否遵守伦理原则和法律要求。这可能涉及第三方评估、公开报告或建立伦理委员会来监督和审查 ASR 实践。问责制措施有助于与用户和利益相关者建立信任,展示对负责任和伦理的 ASR 部署的承诺。
保护弱势群体
负责任使用 ASR 的指南必须优先考虑保护弱势群体,如儿童、老年人和残障人士。应特别考虑从这些群体获得知情同意,因为他们在理解 ASR 技术的影响时可能面临独特的需求或挑战。
ASR 系统应在设计时考虑可访问性和包容性,确保不同能力和背景的个人都能够使用它们。这可能涉及加入诸如语音命令、文本转语音输出或为非母语者提供语言支持等功能。通过优先考虑弱势群体的需求,ASR 指南可以帮助防止伤害、歧视和排斥。
推动伦理创新文化
最后,制定负责任的 ASR 使用指南应伴随推动 ASR 社区内伦理创新文化的努力。这包括鼓励研究人员和开发人员在设计、开发和部署过程中优先考虑伦理问题。
ASR 系统提供商应提供培训和资源,帮助他们的团队应对伦理挑战,并做出负责任的决策。分享最佳实践、案例研究和经验教训可以帮助建立对负责任使用 ASR 的集体理解。通过培养伦理创新的文化,ASR 社区可以积极应对潜在风险,确保技术的开发和使用能造福社会。
为了确保像 OpenAI Whisper 这样的 ASR 系统得到道德和有益的部署,建立使用这些技术的指南和保障措施至关重要。通过定义适当的使用案例、实施透明性和问责措施、保护弱势群体、促进合作并推动伦理创新文化,ASR 社区可以降低风险,实现这些强大工具的最大潜力。随着 ASR 的不断进步并融入我们生活的各个方面,优先考虑负责任的使用将对建立信任、保护权利和推动积极的社会影响至关重要。
为不断发展的 ASR 和语音技术领域做好准备
ASR 领域正在迅速发展,新架构、训练技术和应用以空前的速度涌现。为了在这个动态的环境中处于领先地位,组织必须采用能够使其利用最新进展并为未来突破做好准备的策略。本节将讨论专注于数据质量和多样性、接受新兴架构和训练技术,以及为多模态界面和无文本 NLP 做好准备的重要性。通过投资这些领域,组织可以构建稳健、灵活、未来可持续的 ASR 系统,适应用户和行业需求的变化。
专注于数据质量和多样性
任何成功的 ASR 系统的基础都在于其训练数据的质量和多样性。Whisper 在方言、背景噪音和技术语言方面的卓越鲁棒性,可以归因于其训练使用了包含 680,000 小时多语言、多任务监督数据的庞大数据集。为了实现类似的性能,组织必须优先收集高质量的语音数据,涵盖各种讲者(性别、年龄、种族、社会经济地位)、口音和方言(母语和非母语、地区变异)、领域(对话、朗读、自发、命令和控制)、声学环境(清晰的录音室、嘈杂的环境、远场)以及语言(高资源和低资源语言、语言家族)。这一多样化的数据收集对于开发能够准确转录多种真实场景中语音的 ASR 模型至关重要。例如,Mozilla 的 Common Voice 项目通过让志愿者用他们的母语录制语音样本,众包收集了一个多样化的数据集。同时,Switchboard 和 Fisher 是包含来自美国各地区讲者的对话式电话语音语料库。
确保负责任和道德的数据做法
数据质量和多样性无可厚非,但确保数据收集和使用遵循负责任和道德的做法同样至关重要。Whisper 的开发作为一个警示案例,表明在没有适当同意或署名的情况下使用网页抓取的数据进行训练,可能引发重大道德问题,特别是在处理少数语言和社区时。组织必须制定明确的数据收集指南,尊重知识产权,获取必要的权限,并在整个过程中保持透明度。在处理敏感语言数据时,与相关利益相关者互动并遵循原住民数据主权(IDSov)原则至关重要。这包括以下内容:
-
定义精确的数据需求、质量指标和文档标准
-
实施验证和清理流程以捕捉错误
-
进行人工抽查和听力测试
-
监控质量关键绩效指标(KPI)并及时解决问题
例如,MALACH 语料库中的大屠杀幸存者访谈展示了实施严格质量保证流程的重要性,以确保语音数据集的准确性和完整性。通过结合自动检查、人工抽查和听力测试,MALACH 语料库的创建者展示了他们在处理敏感音频内容时对数据质量和负责任做法的承诺。这一多步骤的质量保证流程有助于识别并修正音频与转录文本对齐中的错误。它展示了组织如何在其自动语音识别(ASR)开发过程中优先考虑数据质量和道德问题。
IDSov
IDSov 在为不断发展的 ASR 和语音技术领域做好准备时至关重要。IDSov 指的是原住民拥有、控制、访问和拥有关于他们、他们的社区、土地和资源的相关数据的权利。以下是关于 IDSov 及其与 ASR 和语音技术相关性的一些关键点:
-
IDSov 提供了一个框架,确保原住民能够受益并控制关于他们的数据如何在 ASR 系统中被收集和使用。随着语音技术越来越多地捕捉和分析语音数据,原住民社区必须拥有关于是否以及如何纳入他们的声音和语言的主权。
-
为 ASR 训练准备语音数据集需要仔细考虑 IDSov 原则,如集体所有权、知情同意和社区驱动的原住民数据资产治理。简单地将原住民语音数据视为开放数据且不加限制,违反了 IDSov。
-
IDSov 还扩展到语音中嵌入的原住民知识治理。ASR 系统必须具备保护文化敏感信息的保障措施,并维护原住民对传统知识的知识产权。
-
为了在 ASR 开发过程中落实 IDSov,必须让原住民作为决策者和共同开发者参与,而不仅仅是数据主体。新兴的方法如 CARE 原则(原住民数据治理原则) 指导我们将原住民的权利和利益置于核心位置。
最终,IDSov 是关于原住民固有的自决和自治权,包括数据自决权。负责任地为 ASR 的未来做准备意味着承诺支持 IDSov,并将关于原住民数据的权力从殖民机构转回原住民社区。
IDSov 在自动语音识别(ASR)和语音技术迅速发展的背景下至关重要。拥抱 IDSov 及其对原住民权利、集体福祉以及社区对数据的控制权的重视,对于开发具有包容性、道德性并符合原住民自决权的 ASR 系统至关重要。ASR 领域必须与原住民社区合作,共同设计数据治理框架,实施 IDSov 原则。
实施全面的数据质量程序
强大的数据质量是成功开发和部署 ASR 系统的先决条件。组织应采用以流程为驱动和数据为驱动的策略来保持高标准。以流程为驱动的策略涉及重新设计和控制数据收集与标注工作流,以最小化错误和不一致性。另一方面,数据驱动策略专注于分析和清理现有数据集,以识别和解决质量问题。通过建立明确的数据质量维度,如完整性、及时性、准确性和一致性,以及自动化的数据分析和监控功能,可以帮助确保语音数据集的完整性和可靠性。
利用数据增强技术
除了收集多样化的语音数据,组织还可以通过利用数据增强技术进一步增强其 ASR 模型的鲁棒性。这些技术通过对现有音频样本应用各种转换来人工扩展数据集。方法包括添加背景噪声、应用音频效果和使用语音合成技术,这些都可以在人为增加训练数据的数量和多样性方面发挥作用。Whisper 的多语言训练方法还表明,即使是未直接针对的多语言语音数据,也能提升整体性能。然而,必须仔细验证增强数据,确保它符合所需的质量和多样性标准。
专注于数据质量和多样性对于构建能够准确转录各种发言人、口音和环境下语音的 ASR 系统至关重要。OpenAI Whisper 的成功凸显了在大规模、多样化数据集上训练的重要性,同时也强调了负责任和伦理的数据实践的必要性。通过优先考虑数据收集、实施全面的质量程序、利用数据增强技术并遵循伦理准则,组织可以开发出强大且可靠的 ASR 解决方案,能够应对现实世界语音的复杂性。
要保持在快速发展的 ASR 领域的前沿,必须拥抱新兴的架构和训练技术。OpenAI Whisper 展示了基于变换器模型和自监督学习的潜力,为 ASR 性能树立了新的标准。
拥抱新兴架构和训练技术
OpenAI Whisper 为 ASR 性能设立了新的标准,展示了新兴架构和训练技术的潜力。Whisper 利用变换器模型,这已成为 ASR 的主流架构,因为它们能够捕捉长距离依赖关系并并行化计算。为了保持竞争力,组织必须紧跟快速发展的领域中的新进展。Conformer 模型就是一种新兴架构的典型例子,它结合了变换器和卷积神经网络(CNN)的优势。Conformer 架构专门为语音识别任务而开发,使用卷积层捕捉局部特征,使用自注意力层建模长距离依赖关系,并通过前馈层进一步处理学习到的表示。通过充分利用 CNN 和变换器的互补优势,Conformer 模型在各种语音识别基准上达到了最先进的性能,超越了基于递归神经网络(RNN)、单独变换器或 CNN 的先前方法。
Conformer 模型的成功突显了探索新型架构设计的重要性,这些设计可以有效捕捉语音信号的独特特征。它通过卷积和自注意力层建模局部和全局依赖的能力,已被证明在语音识别中尤其有优势。随着组织寻求拥抱新兴架构并保持 ASR 技术的前沿,考虑像 Conformer 这样的模型可以在准确性和效率方面提供竞争优势。
让我们探索在 Whisper 和 ASR 系统的背景下拥抱这些创新的三个额外准备策略。
利用自监督预训练
自监督学习是指模型通过对大量未标记数据进行预训练,学习通用表示,这已成为提高 ASR 性能的强大技术。Whisper 的鲁棒性可归因于其在多样化的多语言网络数据上进行预训练。组织可以通过以下方式利用自监督:
-
收集覆盖多个语言、讲者和领域的大规模、多样化的数据集
-
设计鼓励学习有意义语音表示的预训练任务,例如对比预测编码或掩蔽语言建模
-
在目标数据集上使用监督目标(如 CTC 或序列到序列损失)对预训练模型进行微调
Whisper 使用的 Wav2vec 2.0 通过对未标记语音进行掩蔽和重建输入片段进行预训练,从而学习可以良好迁移到下游 ASR 任务的表示。
探索多任务和多语言训练
同时在多个任务和语言上训练 ASR 模型可以提高泛化能力和数据效率。Whisper 的多语言训练使其能够在 99 种语言中进行零-shot 转录。组织可以通过以下方式探索多任务和多语言方法:
-
联合训练语音识别、说话人分离、语言识别及其他相关任务
-
将来自同一语言家族或具有共享语言特征的多种语言的数据结合起来
-
使用与语言无关的输入表示,例如发音特征或音素
-
应用元学习算法,利用少量示例使模型适应新语言
微软的 UniSpeech 模型通过在多个语言的未标记数据上进行预训练,并使用统一的损失函数进行微调,实现在 51 种语言上的竞争性性能。
应用高效的微调技术
虽然 Whisper 展示了令人印象深刻的零-shot 能力,但通过在高质量、特定领域的数据集上对模型进行微调,可以进一步提高其准确性和适应性。通过将 Whisper 暴露于来自特定行业或领域的数据集,如医疗、法律或技术领域,模型可以学习并专注于这些领域中独特的词汇、术语和语言细微差别。这种方法使得模型能够提供更精确、与上下文更相关的转录,成为各种行业应用的强大工具。然而,微调大型模型可能需要昂贵的计算资源。为了解决这个挑战,组织可以采用高效的微调技术,例如以下几种:
-
适配器模块,在冻结的预训练权重之间插入小的可训练层,减少内存占用
-
低秩适应(LoRA),通过学习对预训练权重的低秩更新,实现高效适应
-
前缀微调,在输入序列前添加少量可调节的标记,保持预训练参数固定
-
蒸馏方法,通过将知识从大型预训练模型转移到更小、更高效的学生模型
在目标数据集上微调预训练模型对于适应特定领域和优化性能至关重要。whisper-small 模型通过在微调过程中提炼知识,表现与更大的 whisper-medium 模型相当,从而降低推理成本。
拥抱新兴架构和训练技术的重要性
基于 Transformer 的模型已成为 ASR 的黄金标准,始终优于以前的 HMM 和 RNN 方法。自监督预训练使模型能够从大量未标记的数据中学习,减少了对昂贵的人工转录语料库的需求。多任务和多语言训练则提高了模型对新领域和语言的泛化能力和适应性。
此外,随着 Whisper 等模型的规模和复杂性不断增长,高效的微调技术对于实际部署变得至关重要。没有这些创新,组织可能会在性能和可扩展性方面落后。
采用这些新兴架构和训练技术有助于提高自动语音识别(ASR)的质量。这为实时转录、低资源语言支持和语音到语音翻译等应用开辟了新的可能性。随着各行业对准确、可靠的 ASR 的需求日益增长,投资于这些前沿方法的组织将能更好地满足客户和利益相关者的需求。
随着 ASR 技术的不断发展,预见并为多模态接口和无文本自然语言处理(NLP)的兴起做好准备是至关重要的。这些新兴趋势有可能彻底改变我们与语音语言交互和处理的方式,为更直观、高效的沟通开辟了新的可能性。
为多模态界面和无文本 NLP 做好准备
无文本 NLP 指的是在不依赖中间文本表示的情况下处理和理解口语语言。与其将语音转换成文本并应用传统的 NLP 技术,无文本 NLP 旨在直接学习和处理语音信号。这种方法有可能捕捉到语音中丰富的声学和韵律信息,这些信息通常在基于文本的表示中丢失。通过消除对准确语音转文本转换的需求,无文本 NLP 可以实现更高效且与语言无关的口语内容处理。让我们探讨四种主要的准备策略,以利用无文本 NLP 和多模态界面在不断发展中的潜力和未来突破。
投资可扩展基础设施
一个关键的准备策略是投资可扩展的云基础设施,以处理大型多模态 AI 模型(如 Whisper)的计算需求。像 Azure OpenAI Service 这样的云平台现在提供 Whisper 模型,能够高效处理时间敏感的工作负载。利用托管服务,开发人员可以大规模转录音频,而无需维护复杂的基础设施。随着多模态模型在规模和能力上的增长,依赖可扩展的云基础设施将是将其部署到生产应用中的关键。
收集多样化的训练数据
另一个关键策略是策划大型多样化的数据集,用于训练和微调多模态 AI 模型。OpenAI Whisper 的强大性能源于其训练数据的广度,涵盖了多种语言、口音和技术领域。为了构建能够在实际场景中表现良好的包容性模型,必须收集跨不同人群、方言和学科领域的代表性数据。当将自动语音识别(ASR)扩展到低资源语言或细分垂直领域时,数据多样性尤为关键。像 Common Voice 这样的项目正在通过众包的方式收集多语言音频数据集,以使 ASR 技术变得更加易于获得。对于特定领域的应用,通过音频数据增强和弱监督收集定制训练数据,可以帮助根据个别用例调整模型。投资于可扩展的数据管道以持续提升模型性能,是一个关键的竞争优势。
设计多模态用户体验
为了迎接多模态界面的时代,用户体验(UX)设计需要发生范式转变。设计师不应将语音、文本等模态视为孤立的输入方式,而是要创造出能融合多种互动模式的统一体验。这要求研究不同模态的优缺点,并理解每种模态在不同用户情境中的最适应用。
多模态用户体验(UX)设计原则强调在不同模态之间切换时尽量减少摩擦,并通过感官通道提供反馈。例如,虚拟助手可以在用户讲话时,视觉高亮显示转录中的关键词,然后无缝过渡到文本聊天界面进行澄清或后续跟进。通过与不同用户群体测试新的互动模式,并衡量任务完成度和认知负荷等指标,将有助于随着时间的推移改进这些体验。
探索表示学习技术
无文本 NLP 旨在直接从原始音频信号中学习语言表示,这是一个快速发展的研究领域,对低资源语言具有重要意义。OpenAI 的 Whisper 在这一方向上展示了有希望的成果,证明了其在跨语言转移性能方面的优势,并能够直接将语音翻译成英语,而无需依赖中间的文本表示。
需要更多的工作来研究无监督表示学习技术,这些技术可以从未标注的音频数据中揭示语言结构,从而实现无文本自然语言处理(NLP)的全部潜力。研究人员正在探索对比预测编码、离散单元发现和自监督预训练等方法,以学习捕捉语音和语义信息的压缩语音表示。将这些无文本表示与其他模态(如视觉)结合起来,可能会为有针对性的语言学习和视觉引导的语音处理开辟新的应用。
总结
在本章的最后部分,我们探讨了 ASR 的未来,以及塑造这一领域的激动人心的进展,重点介绍了 OpenAI 开创性的 Whisper 模型。我们考察了正在进行的努力,以提高 Whisper 的性能,包括提升准确性和鲁棒性、扩展语言支持、实现更好的标点和发言人区分,并加速实时能力的表现。此外,我们还深入探讨了开发和部署 ASR 技术时至关重要的伦理考虑和负责任的人工智能实践,确保这些强大的工具在尊重个人权利和促进公平的同时,造福社会。
本章深入探讨了可以提升 Whisper 性能的前沿技术和策略,包括增加训练数据、针对特定领域的微调和优化模型架构。我们研究了通过收集多样化的数据集、应用迁移学习和支持低资源语言等方法,使自动语音识别(ASR)更加包容。我们还探索了用于标点恢复、时间戳对齐和发言人归属的最新方法,以生成更易读且可操作的转录文本。
此外,我们强调了可扩展基础设施、有效的微调技术以及新兴架构(如多模态接口和无文本自然语言处理)在应对不断变化的 ASR 领域中的重要性。通过采用这些应对策略,并优先考虑公平性、隐私和负责任的使用,组织可以充分利用语音技术的巨大潜力,同时构建强大、可靠和包容性的 ASR 系统。
在我们结束这次关于 OpenAI Whisper 和 ASR 世界的旅程时,我想向你,亲爱的读者,表达我诚挚的感激之情。你对学习和探索这项变革性技术的热情,确实令人鼓舞。我希望你在本书中获得的知识和见解能够赋能你,塑造语音应用的未来,开启新的可能性,并积极影响我们在数字世界中与口语语言的互动方式。感谢你与我一同踏上这段激动人心的冒险旅程,祝你在未来的 ASR 及其他相关领域的努力中一切顺利。
下次再见,干杯!

浙公网安备 33010602011771号