模型简介
模型特点
模型能力
使用案例
🚀 Whisper
Whisper是一个用于自动语音识别(ASR)和语音翻译的预训练模型。该模型在68万小时的标注数据上进行训练,展现出了强大的泛化能力,无需微调即可适用于多种数据集和领域。
Whisper由OpenAI的Alec Radford等人在论文Robust Speech Recognition via Large-Scale Weak Supervision中提出。原始代码仓库可在此处找到。
声明:此模型卡片的部分内容由Hugging Face团队撰写,部分内容直接从原始模型卡片复制粘贴而来。
✨ 主要特性
- 基于Transformer的编码器 - 解码器架构,即 序列到序列 模型。
- 经过68万小时标注语音数据的训练,采用大规模弱监督标注。
- 提供英语单语言和多语言两种版本的模型,多语言模型可同时进行语音识别和语音翻译。
- 有五种不同大小配置的检查点可供选择,满足不同场景需求。
📦 安装指南
文档未提及具体安装步骤,可参考Hugging Face相关文档进行安装。
💻 使用示例
基础用法
此检查点是一个仅支持英语的模型,可用于英语语音识别。若要进行多语言语音识别或语音翻译,可使用多语言检查点。
要转录音频样本,需要将模型与WhisperProcessor
一起使用。WhisperProcessor
用于:
- 预处理音频输入(将其转换为模型所需的对数梅尔频谱图)
- 后处理模型输出(将其从令牌转换为文本)
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import load_dataset
>>> # 加载模型和处理器
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-tiny.en")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-tiny.en")
>>> # 加载虚拟数据集并读取音频文件
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> sample = ds[0]["audio"]
>>> input_features = processor(sample["array"], sampling_rate=sample["sampling_rate"], return_tensors="pt").input_features
>>> # 生成令牌ID
>>> predicted_ids = model.generate(input_features)
>>> # 将令牌ID解码为文本
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=False)
['<|startoftranscript|><|notimestamps|> Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel.<|endoftext|>']
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
[' Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.']
通过设置skip_special_tokens=True
,可以从转录开头移除上下文令牌。
高级用法
评估
此代码片段展示了如何在LibriSpeech test-clean上评估Whisper tiny.en:
>>> from datasets import load_dataset
>>> from transformers import WhisperForConditionalGeneration, WhisperProcessor
>>> import torch
>>> from evaluate import load
>>> librispeech_test_clean = load_dataset("librispeech_asr", "clean", split="test")
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-tiny.en")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-tiny.en").to("cuda")
>>> def map_to_pred(batch):
>>> audio = batch["audio"]
>>> input_features = processor(audio["array"], sampling_rate=audio["sampling_rate"], return_tensors="pt").input_features
>>> batch["reference"] = processor.tokenizer._normalize(batch['text'])
>>>
>>> with torch.no_grad():
>>> predicted_ids = model.generate(input_features.to("cuda"))[0]
>>> transcription = processor.decode(predicted_ids)
>>> batch["prediction"] = processor.tokenizer._normalize(transcription)
>>> return batch
>>> result = librispeech_test_clean.map(map_to_pred)
>>> wer = load("wer")
>>> print(100 * wer.compute(references=result["reference"], predictions=result["prediction"]))
5.655609406528749
长音频转录
Whisper模型本质上设计用于处理时长不超过30秒的音频样本。不过,通过使用分块算法,它可以转录任意长度的音频样本。这可以通过Transformers的pipeline
方法实现。在实例化管道时设置chunk_length_s = 30
即可启用分块。启用分块后,管道可以进行批量推理。还可以通过传递return_timestamps = True
来预测序列级别的时间戳:
>>> import torch
>>> from transformers import pipeline
>>> from datasets import load_dataset
>>> device = "cuda:0" if torch.cuda.is_available() else "cpu"
>>> pipe = pipeline(
>>> "automatic-speech-recognition",
>>> model="openai/whisper-tiny.en",
>>> chunk_length_s=30,
>>> device=device,
>>> )
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> sample = ds[0]["audio"]
>>> prediction = pipe(sample.copy(), batch_size=8)["text"]
" Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel."
>>> # 我们还可以返回预测的时间戳
>>> prediction = pipe(sample.copy(), batch_size=8, return_timestamps=True)["chunks"]
[{'text': ' Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.',
'timestamp': (0.0, 5.44)}]
有关分块算法的更多详细信息,请参考博客文章ASR Chunking。
微调
预训练的Whisper模型在不同数据集和领域中表现出了很强的泛化能力。不过,通过微调,可以进一步提高其在特定语言和任务上的预测能力。博客文章Fine-Tune Whisper with 🤗 Transformers提供了一个逐步指南,介绍如何使用仅5小时的标注数据微调Whisper模型。
📚 详细文档
评估使用
这些模型的主要目标用户是研究当前模型的鲁棒性、泛化能力、性能、偏差和局限性的AI研究人员。不过,Whisper作为一种自动语音识别解决方案,对开发者也可能非常有用,尤其适用于英语语音识别。我们认识到,一旦模型发布,就不可能将其使用限制在“预期”用途范围内,也难以制定合理的准则来界定什么是研究、什么不是研究。
这些模型主要在自动语音识别和语音翻译为英语的任务上进行训练和评估。它们在约10种语言的自动语音识别任务中表现出色。它们可能还具备其他能力,特别是在针对某些任务(如语音活动检测、说话人分类或说话人分割)进行微调后,但在这些领域尚未进行全面评估。我们强烈建议用户在特定上下文和领域中对模型进行全面评估后再进行部署。
特别要提醒的是,请勿在未经个人同意的情况下使用Whisper模型转录其录音,也不要声称使用这些模型进行任何主观分类。我们不建议在高风险领域(如决策场景)中使用该模型,因为准确性的缺陷可能导致结果出现明显偏差。这些模型旨在转录和翻译语音,将其用于分类不仅未经过评估,而且不合适,特别是用于推断人类属性时。
训练数据
这些模型在从互联网收集的68万小时音频及其相应转录文本上进行训练。其中65%(即43.8万小时)是英语音频和匹配的英语转录文本,约18%(即12.6万小时)是非英语音频和英语转录文本,最后17%(即11.7万小时)是非英语音频及其相应转录文本。这些非英语数据涵盖了98种不同的语言。
正如随附论文中所讨论的,我们发现特定语言的转录性能与该语言的训练数据量直接相关。
性能和局限性
我们的研究表明,与许多现有的自动语音识别系统相比,这些模型在应对口音、背景噪音、专业术语方面表现出更强的鲁棒性,并且在多语言到英语的零样本翻译方面也有出色表现;语音识别和翻译的准确性接近当前的先进水平。
然而,由于这些模型是使用大规模噪声数据进行弱监督训练的,其预测结果可能包含音频输入中实际未说出的文本(即幻觉现象)。我们推测,这是因为模型在利用其语言通用知识时,会将预测音频中的下一个单词与转录音频本身的任务相结合。
我们的模型在不同语言上的表现参差不齐,对于资源较少和/或曝光度较低的语言,或者训练数据较少的语言,其准确性较低。模型在特定语言的不同口音和方言上也表现出差异,这可能导致不同性别、种族、年龄或其他人口统计特征的说话者的单词错误率更高。我们的完整评估结果见本次发布的随附论文。
此外,模型的序列到序列架构使其容易生成重复文本,虽然可以通过束搜索和温度调度在一定程度上缓解,但无法完全解决。论文中对这些局限性进行了进一步分析。在资源较少和/或曝光度较低的语言上,这种行为和幻觉现象可能会更严重。
更广泛的影响
我们预计Whisper模型的转录能力可用于改进无障碍工具。虽然Whisper模型本身不能直接用于实时转录,但其速度和规模表明,其他人可以在其基础上构建接近实时语音识别和翻译的应用程序。基于Whisper模型构建的有益应用程序的实际价值表明,这些模型的不同表现可能会产生实际的经济影响。
发布Whisper模型也存在潜在的双重用途问题。虽然我们希望这项技术主要用于有益目的,但让自动语音识别技术更易于获取可能会使更多人能够构建强大的监控技术或扩大现有监控工作的规模,因为其速度和准确性使得对大量音频通信进行经济实惠的自动转录和翻译成为可能。此外,这些模型可能具备直接识别特定个人的能力,这反过来又带来了与双重用途和不同表现相关的安全问题。实际上,我们预计转录成本不会成为扩大监控项目的限制因素。
🔧 技术细节
Whisper是基于Transformer的编码器 - 解码器模型,也称为 序列到序列 模型。它在68万小时的标注语音数据上进行训练,采用大规模弱监督标注。
模型有英语单语言和多语言两种版本。英语单语言模型仅针对语音识别任务进行训练,而多语言模型则针对语音识别和语音翻译任务进行训练。对于语音识别,模型预测与音频相同语言的转录文本;对于语音翻译,模型预测与音频不同语言的转录文本。
Whisper检查点有五种不同配置的模型大小。最小的四种模型在英语单语言或多语言数据上进行训练,最大的检查点仅支持多语言。所有十种预训练检查点都可以在Hugging Face Hub上找到。以下表格总结了这些检查点,并提供了Hub上模型的链接:
大小 | 参数 | 仅英语 | 多语言 |
---|---|---|---|
tiny | 39 M | ✓ | ✓ |
base | 74 M | ✓ | ✓ |
small | 244 M | ✓ | ✓ |
medium | 769 M | ✓ | ✓ |
large | 1550 M | x | ✓ |
large-v2 | 1550 M | x | ✓ |
📄 许可证
本项目采用Apache 2.0许可证。
BibTeX引用
@misc{radford2022whisper,
doi = {10.48550/ARXIV.2212.04356},
url = {https://arxiv.org/abs/2212.04356},
author = {Radford, Alec and Kim, Jong Wook and Xu, Tao and Brockman, Greg and McLeavey, Christine and Sutskever, Ilya},
title = {Robust Speech Recognition via Large-Scale Weak Supervision},
publisher = {arXiv},
year = {2022},
copyright = {arXiv.org perpetual, non-exclusive license}
}



