ASR的King:我又回来了,更小,且更快——openai/whisper-large-v3-turbo

在这里插入图片描述
Whisper 是用于自动语音识别(ASR)和语音翻译的最先进模型,由来自 OpenAI 的 Alec Radford 等人在论文《通过大规模弱监督实现鲁棒语音识别》中提出。 Whisper 在超过 500 万小时的标注数据上进行了训练,证明了其在零点场景下对许多数据集和域进行泛化的强大能力。

Whisper large-v3-turbo 是经过修剪的 Whisper large-v3 的微调版本。 换句话说,它是完全相同的模型,只是解码层数从 32 层减少到 4 层。因此,该模型的速度更快,但质量略有下降。 你可以在 GitHub 上的讨论中找到更多细节。

使用方法

在Hugging Face 🤗 Transformers 中支持 Whisper large-v3-turbo。 要运行模型,首先要安装 Transformers 库。 在本例中,我们还将安装 🤗 Datasets,以便从拥抱脸部集线器加载玩具音频数据集,并安装 🤗 Accelerate ,以缩短模型加载时间:

pip install --upgrade pip
pip install --upgrade transformers datasets[audio] accelerate

该模型可与pipeline class一起用于转录任意长度的音频:

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_datasetdevice = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32model_id = "openai/whisper-large-v3-turbo"model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)processor = AutoProcessor.from_pretrained(model_id)pipe = pipeline("automatic-speech-recognition",model=model,tokenizer=processor.tokenizer,feature_extractor=processor.feature_extractor,torch_dtype=torch_dtype,device=device,
)dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]result = pipe(sample)
print(result["text"])

要转录本地音频文件,只需在调用管道时传递音频文件的路径即可:

result = pipe("audio.mp3")

通过将多个音频文件指定为一个列表并设置 batch_size 参数,可以并行转录多个音频文件:

result = pipe(["audio_1.mp3", "audio_2.mp3"], batch_size=2)

Transformers 兼容 Whisper 的所有解码策略,如温度回退和前一标记条件。 下面的示例演示了如何启用这些启发式方法:

generate_kwargs = {"max_new_tokens": 448,"num_beams": 1,"condition_on_prev_tokens": False,"compression_ratio_threshold": 1.35,  # zlib compression ratio threshold (in token space)"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),"logprob_threshold": -1.0,"no_speech_threshold": 0.6,"return_timestamps": True,
}result = pipe(sample, generate_kwargs=generate_kwargs)

Whisper 能自动预测源音频的语言。 如果事先知道源音频语言,可以将其作为参数传递给管道:

result = pipe(sample, generate_kwargs={"language": "english"})

默认情况下,Whisper 执行源音频语言与目标文本语言相同的语音转录任务。 要执行目标文本为英语的语音翻译,请将任务设置为 “translate”:

result = pipe(sample, generate_kwargs={"task": "translate"})

最后,可以让模型预测时间戳。 要获得句子级别的时间戳,可通过 return_timestamps 参数:

result = pipe(sample, return_timestamps=True)
print(result["chunks"])

而对于单词级的时间戳:

result = pipe(sample, return_timestamps="word")
print(result["chunks"])

上述参数可以单独使用,也可以组合使用。 例如,要执行源音频为法语的语音转录任务,并返回句子级别的时间戳,可以使用以下参数:

result = pipe(sample, return_timestamps=True, generate_kwargs={"language": "french", "task": "translate"})
print(result["chunks"])

要对生成参数进行更多控制,可直接使用模型 + 处理器 API:

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
from datasets import Audio, load_datasetdevice = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32model_id = "openai/whisper-large-v3-turbo"model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
)
model.to(device)processor = AutoProcessor.from_pretrained(model_id)dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(processor.feature_extractor.sampling_rate))
sample = dataset[0]["audio"]inputs = processor(sample["array"],sampling_rate=sample["sampling_rate"],return_tensors="pt",truncation=False,padding="longest",return_attention_mask=True,
)
inputs = inputs.to(device, dtype=torch_dtype)gen_kwargs = {"max_new_tokens": 448,"num_beams": 1,"condition_on_prev_tokens": False,"compression_ratio_threshold": 1.35,  # zlib compression ratio threshold (in token space)"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),"logprob_threshold": -1.0,"no_speech_threshold": 0.6,"return_timestamps": True,
}pred_ids = model.generate(**inputs, **gen_kwargs)
pred_text = processor.batch_decode(pred_ids, skip_special_tokens=True, decode_with_timestamps=False)print(pred_text)

其他速度和内存改进

您可以对 Whisper 进行其他速度和内存改进,以进一步降低推理速度和 VRAM 要求。

Chunked Long-Form

Whisper 的接收区域为 30 秒。 要转录比这更长的音频,需要使用两种长格式算法中的一种:

  1. 顺序:使用 "滑动窗口 "进行缓冲推理,一个接一个地转录 30 秒的片段
  2. 分块:将长音频文件分割成较短的音频文件(片段之间有少量重叠),独立转录每个片段,并在边界处缝合转录结果

顺序长式算法应在以下任一情况下使用:

  1. 转录准确性是最重要的因素,而速度则是次要的考虑因素
  2. 您要转录成批的长音频文件,在这种情况下,顺序转录的延迟与分块转录相当,而准确性则高出 0.5% WER

反之,则应在以下情况下使用分块算法:

  1. 转录速度是最重要的因素
  2. 您正在转录一个长音频文件

默认情况下,Transformers 使用顺序算法。 要启用分块算法,可向管道传递 chunk_length_s 参数。 对于 large-v3,最佳的分块长度为 30 秒。 要激活长音频文件的批处理,可通过参数 batch_size:

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_datasetdevice = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32model_id = "openai/whisper-large-v3-turbo"model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
)
model.to(device)processor = AutoProcessor.from_pretrained(model_id)pipe = pipeline("automatic-speech-recognition",model=model,tokenizer=processor.tokenizer,feature_extractor=processor.feature_extractor,chunk_length_s=30,batch_size=16,  # batch size for inference - set based on your devicetorch_dtype=torch_dtype,device=device,
)dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]result = pipe(sample)
print(result["text"])

Torch 编译

Whisper 前传与 torch.compile 兼容,速度提高了 4.5 倍。

:torch.compile 目前与 Chunked 长式算法或 Flash Attention 2 不兼容⚠️。

import torch
from torch.nn.attention import SDPBackend, sdpa_kernel
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
from tqdm import tqdmtorch.set_float32_matmul_precision("high")device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32model_id = "openai/whisper-large-v3-turbo"model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
).to(device)# Enable static cache and compile the forward pass
model.generation_config.cache_implementation = "static"
model.generation_config.max_new_tokens = 256
model.forward = torch.compile(model.forward, mode="reduce-overhead", fullgraph=True)processor = AutoProcessor.from_pretrained(model_id)pipe = pipeline("automatic-speech-recognition",model=model,tokenizer=processor.tokenizer,feature_extractor=processor.feature_extractor,torch_dtype=torch_dtype,device=device,
)dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]# 2 warmup steps
for _ in tqdm(range(2), desc="Warm-up step"):with sdpa_kernel(SDPBackend.MATH):result = pipe(sample.copy(), generate_kwargs={"min_new_tokens": 256, "max_new_tokens": 256})# fast run
with sdpa_kernel(SDPBackend.MATH):result = pipe(sample.copy())print(result["text"])

Flash Attention 2

如果您的 GPU 支持 Flash-Attention 2,且未使用 torch.compile,我们建议您使用 Flash-Attention 2。 为此,请先安装 Flash Attention:

pip install flash-attn --no-build-isolation

然后将 attn_implementation=“flash_attention_2” 传递给 from_pretrained:

model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="flash_attention_2")

Torch Scale-Product-Attention (SDPA)

如果您的 GPU 不支持 Flash Attention,我们建议您使用 PyTorch scaled dot-product attention (SDPA)。 在 PyTorch 2.1.1 或更高版本中,这种注意力实现默认已被激活。 要检查您的 PyTorch 版本是否兼容,请运行以下 Python 代码片段:

model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="flash_attention_2")

如果上面的返回值为 True,说明你已经安装了一个有效的 PyTorch 版本,并且 SDPA 默认已被激活。 如果返回 False,则需要根据官方说明升级 PyTorch 版本

一旦安装了有效的 PyTorch 版本,SDPA 就会默认激活。 也可以通过指定 attn_implementation="sdpa "来明确设置,如下所示:

model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="sdpa")

有关如何使用 SDPA 的更多信息,请参阅 Transformers SDPA 文档。

模型详情

Whisper 是一种基于变换器的编码器-解码器模型,也称为序列-序列模型。 Whisper 模式有两种: 纯英语模型和多语言模型。 纯英语模型的训练任务是英语语音识别。 多语言模型则同时进行多语言语音识别和语音翻译的训练。 在语音识别方面,模型预测的转录语言与音频语言相同。 对于语音翻译,模型预测转录为与音频不同的语言。

Whisper 检查站有五种不同型号的配置。 最小的四种有纯英语和多语种两种。 最大的检查点只有多语种版本。 所有十个预先训练的检查点都可以在 "拥抱脸部 "集线器(Hugging Face Hub)上找到。 下表汇总了这些检查点,并附有与 Hub 上模型的链接:

SizeParametersEnglish-onlyMultilingual
tiny39 M
base74 M
small244 M
medium769 M
large1550 Mx
large-v21550 Mx
large-v31550 Mx
large-v3-turbo809 Mx

微调

预训练的 Whisper 模型具有很强的泛化能力,可适用于不同的数据集和领域。 不过,对于某些语言和任务,可以通过微调进一步提高其预测能力。 博文 "使用🤗变形器微调 Whisper "提供了一个分步指南,指导您如何使用少至 5 小时的标记数据微调 Whisper 模型。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. Evaluation of Large Language Models for Summarization Tasks in the Medical Domain: A Narrative Review摘要研究…

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers 目录 文章目录 【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers目录0. 引言1. 简介2 相关工作2.1 基于特征的无监督方法2.2 无监督微调方法2.3…

基于深度学习的多焦点图像融合系统【数据集+深度学习模型+源码+PyQt5界面】

深度学习多焦点聚焦图像融合 文章目录 研究背景代码下载链接一、效果演示1.1 界面设计1.2 图像融合演示11.3 图像融合演示21.4 图像融合演示3 二、技术原理2.1 引言2.2 融合策略2.3 深度特征的提取2.4 融合策略2.4.1 利用深度特征计算模糊度2.4.2 去噪与平滑2.4.3 图像融合 三、…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中,当主键为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 注意:自增长约束通常与主键放在一起使用。 通过给…

【CKA】十七、集群故障排查-node节点kubelet服务异常

17、集群故障排查-node节点kubelet服务异常 1. 考题内容: 2. 答题思路: 1、考试环境就是:kubelet这个服务没有设置开机自启,导致node节点状态异常。 2、只需要切换环境,登录到指定主机,获取root权限后&am…

LeetCode 54 Spiral Matrix 解题思路和python代码

题目: Given an m x n matrix, return all elements of the matrix in spiral order. Example 1: Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: Input: matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] Output: [1,2,3,4,8,1…

73.【C语言】C/C++的内存区域划分

目录 1.内存里的几个区域 2.示意图 3.解释 1.内存里的几个区域 除了耳熟能详的栈区,堆区,静态区,还有内核空间,内存映射段,数据段,代码段 2.示意图 3.解释 栈区(stack area):局部变量,函数参数,返回数据,返回地址 内存映射段:将文件映射到内存 映射的含义: 如果看过李忠…

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…

OpenAI 推出全新 “Canvas” 工具的系统提示词泄露

OpenAI 推出了一款叫做 Canvas 的新工具,用来帮助用户更好地与 ChatGPT 协作写作和编程。 Canvas 允许用户和 ChatGPT 在一个独立的窗口中协作,实时修改内容。这个工具可以帮助改进文本、调整语言、审查和修复代码,甚至转换成不同编程语言。…

大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)

前言 按照我们之前的分享(大模型应用RAG系列3-1从0搭建一个RAG:做好文档切分): RAG系统搭建的基本流程 准备对应的垂域资料文档的读取解析,进行文档切分将分割好的文本灌入检索引擎(向量数据库&#xff…

【单例模式】

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。 一、实现方式 1. 饿汉式 在类加载的时候就创建实例,无论是否使用,实例都会被创建。优点是实现简单,线程安全。缺点是可能造成资源浪费,而程序可能不一定会使用这个实例…

【Linux】自主shell编写

如果学习了常见的Linux命令,exec*函数,环境变量,那你就可以尝试一下写一个简单的shell; 下面跟着我的步骤来吧!!🤩🤩 输入命令行 既然要写一个shell,我们第一步先把这个输入命令行…

Java中数组的应用

Java中数组的应用 数组数组的使用使用方式1-动态初始化数组的定义:数组的引用(使用/访问/获取数组元素):快速入门案例 使用方式2-动态初始化**先声明**数组**再创建**数组使用方式1和2的比较 使用方式3-静态初始化初始化数组快速入…

【AI知识点】残差网络(ResNet,Residual Networks)

残差网络(ResNet,Residual Networks) 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构,在深度学习领域取得了巨大的成功。它通过引入残差连接(Residual Connection) 解决了深层神经网络中…

数学公式编辑器免费版下载,mathtype和latex哪个好用

选择适合自己的公式编辑器需要考虑多个因素。首先,您需要确定编辑器支持的功能和格式是否符合您的需求,例如是否可以插入图片、导出各种文件格式等。其次,您可以考虑编辑器的易用性和界面设计是否符合您的个人喜好。另外,您还可以…

蓝桥杯【物联网】零基础到国奖之路:十八. 扩展模块之光敏和AS312

蓝桥杯【物联网】零基础到国奖之路:十八.扩展模块之光敏和AS312 第一节 硬件解读第二节 CubeMX配置第二节 代码 第一节 硬件解读 光敏和AS312如下图: 光敏电阻接到了扩展模块的5号引脚,5号引脚接了2个电阻,R8和光敏电阻。我们通过ADC读取这…

Excel实现省-市-区/县级联

数据准备 准备省份-城市映射数据,如下: 新建sheet页,命名为:省-市数据源,然后准备数据,如下所示: 准备城市-区|县映射数据,如下: 新建sheet页,命名为&#x…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点:2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

分治算法(2)_快速排序_排序数组

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 分治算法(2)_快速排序_排序数组 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 …

消息称苹果iPhone系列将完全放弃LCD屏幕

近日,据日经亚洲消息,苹果公司将于明年初推出搭载OLED显示屏的 iPhone SE 4,标志其整个iPhone系列已进入从 LCD 过渡到 OLED 技术的最后阶段,2025年及之后销售的所有iPhone机型均将搭载OLED屏幕。 由此,两家日本面板供…