模型简介
模型特点
模型能力
使用案例
语言:
- 英语
- 中文
- 德语
- 西班牙语
- 俄语
- 韩语
- 法语
- 日语
- 葡萄牙语
- 土耳其语
- 波兰语
- 加泰罗尼亚语
- 荷兰语
- 阿拉伯语
- 瑞典语
- 意大利语
- 印尼语
- 印地语
- 芬兰语
- 越南语
- 希伯来语
- 乌克兰语
- 希腊语
- 马来语
- 捷克语
- 罗马尼亚语
- 丹麦语
- 匈牙利语
- 泰米尔语
- 挪威语
- 泰语
- 乌尔都语
- 克罗地亚语
- 保加利亚语
- 立陶宛语
- 拉丁语
- 毛利语
- 马拉雅拉姆语
- 威尔士语
- 斯洛伐克语
- 泰卢固语
- 波斯语
- 拉脱维亚语
- 孟加拉语
- 塞尔维亚语
- 阿塞拜疆语
- 斯洛文尼亚语
- 卡纳达语
- 爱沙尼亚语
- 马其顿语
- 布列塔尼语
- 巴斯克语
- 冰岛语
- 亚美尼亚语
- 尼泊尔语
- 蒙古语
- 波斯尼亚语
- 哈萨克语
- 阿尔巴尼亚语
- 斯瓦希里语
- 加利西亚语
- 马拉地语
- 旁遮普语
- 僧伽罗语
- 高棉语
- 绍纳语
- 约鲁巴语
- 索马里语
- 南非荷兰语
- 奥克语
- 格鲁吉亚语
- 白俄罗斯语
- 塔吉克语
- 信德语
- 古吉拉特语
- 阿姆哈拉语
- 意第绪语
- 老挝语
- 乌兹别克语
- 法罗语
- 海地克里奥尔语
- 普什图语
- 土库曼语
- 新挪威语
- 马耳他语
- 梵语
- 卢森堡语
- 缅甸语
- 藏语
- 他加禄语
- 马尔加什语
- 阿萨姆语
- 鞑靼语
- 夏威夷语
- 林加拉语
- 豪萨语
- 巴什基尔语
- 爪哇语
- 巽他语 标签:
- 音频
- 自动语音识别
- hf-asr排行榜 小部件:
- 示例标题: Librispeech样本1 src: https://cdn-media.huggingface.co/speech_samples/sample1.flac
- 示例标题: Librispeech样本2 src: https://cdn-media.huggingface.co/speech_samples/sample2.flac 模型索引:
- 名称: whisper-small
结果:
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: LibriSpeech (干净)
类型: librispeech_asr
配置: clean
分割: test
参数:
语言: en
指标:
- 名称: 测试WER 类型: wer 值: 3.432213777886737
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: LibriSpeech (其他)
类型: librispeech_asr
配置: other
分割: test
参数:
语言: en
指标:
- 名称: 测试WER 类型: wer 值: 7.628304527060248
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: Common Voice 11.0
类型: mozilla-foundation/common_voice_11_0
配置: hi
分割: test
参数:
语言: hi
指标:
- 名称: 测试WER 类型: wer 值: 87.3
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: Common Voice 13.0
类型: mozilla-foundation/common_voice_13_0
配置: dv
分割: test
参数:
语言: dv
指标:
- 名称: Wer 类型: wer 值: 125.69809089960707 管道标签: automatic-speech-recognition 许可证: apache-2.0 基础模型:
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: LibriSpeech (干净)
类型: librispeech_asr
配置: clean
分割: test
参数:
语言: en
指标:
- openai/whisper-small
Whisper
Whisper是一个预训练的自动语音识别(ASR)和语音翻译模型。通过68万小时的标注数据训练,Whisper模型展现出强大的泛化能力,能够适应多种数据集和领域而无需微调。
Whisper由OpenAI的Alec Radford等人在论文通过大规模弱监督实现鲁棒语音识别中提出。原始代码仓库可在此处找到。
免责声明: 本模型卡的部分内容由Hugging Face团队撰写,部分内容复制自原始模型卡。
模型详情
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 | ✓ |
使用指南
转录音频样本时,模型需与WhisperProcessor
配合使用。
WhisperProcessor
用于:
- 预处理音频输入(转换为模型所需的log-Mel频谱图)
- 后处理模型输出(将标记转换为文本)
模型通过传递适当的"上下文标记"来执行任务(转录或翻译)。这些上下文标记是解码过程开始时提供给解码器的标记序列,顺序如下:
- 转录始终以
<|startoftranscript|>
标记开始 - 第二个标记是语言标记(如英语为
<|en|>
) - 第三个标记是"任务标记",可取两个值: 语音识别用
<|transcribe|>
,语音翻译用<|translate|>
- 如果模型不应预测时间戳,则添加
<|notimestamps|>
标记
因此,典型的上下文标记序列可能如下:
<|startoftranscript|> <|en|> <|transcribe|> <|notimestamps|>
这指示模型以英语进行解码,执行语音识别任务,且不预测时间戳。
这些标记可以是强制或非强制的。如果强制,模型必须在每个位置预测每个标记。这允许控制Whisper模型的输出语言和任务。如果非强制,Whisper模型将自动预测输出语言和任务。
可通过以下方式设置上下文标记:
model.config.forced_decoder_ids = WhisperProcessor.get_decoder_prompt_ids(language="english", task="transcribe")
这将强制模型在语音识别任务下以英语进行预测。
转录
英语到英语
此例中上下文标记为"非强制",模型自动预测输出语言(英语)和任务(转录)。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import load_dataset
>>> # 加载模型和处理器
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
>>> model.config.forced_decoder_ids = None
>>> # 加载虚拟数据集并读取音频文件
>>> 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|><|en|><|transcribe|><|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
可从转录开头移除上下文标记。
法语到法语
以下示例通过适当设置解码器ID演示法语到法语转录。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import Audio, load_dataset
>>> # 加载模型和处理器
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
>>> forced_decoder_ids = processor.get_decoder_prompt_ids(language="french", task="transcribe")
>>> # 加载流式数据集并读取第一个音频样本
>>> ds = load_dataset("common_voice", "fr", split="test", streaming=True)
>>> ds = ds.cast_column("audio", Audio(sampling_rate=16_000))
>>> input_speech = next(iter(ds))["audio"]
>>> input_features = processor(input_speech["array"], sampling_rate=input_speech["sampling_rate"], return_tensors="pt").input_features
>>> # 生成标记ID
>>> predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids)
>>> # 将标记ID解码为文本
>>> transcription = processor.batch_decode(predicted_ids)
['<|startoftranscript|><|fr|><|transcribe|><|notimestamps|> Un vrai travail intéressant va enfin être mené sur ce sujet.<|endoftext|>']
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
[' Un vrai travail intéressant va enfin être mené sur ce sujet.']
翻译
将任务设置为"translate"强制Whisper模型执行语音翻译。
法语到英语
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import Audio, load_dataset
>>> # 加载模型和处理器
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
>>> forced_decoder_ids = processor.get_decoder_prompt_ids(language="french", task="translate")
>>> # 加载流式数据集并读取第一个音频样本
>>> ds = load_dataset("common_voice", "fr", split="test", streaming=True)
>>> ds = ds.cast_column("audio", Audio(sampling_rate=16_000))
>>> input_speech = next(iter(ds))["audio"]
>>> input_features = processor(input_speech["array"], sampling_rate=input_speech["sampling_rate"], return_tensors="pt").input_features
>>> # 生成标记ID
>>> predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids)
>>> # 将标记ID解码为文本
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
[' A very interesting work, we will finally be given on this subject.']
评估
此代码片段展示如何在LibriSpeech test-clean上评估Whisper Small:
>>> 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-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small").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"]))
3.432213777886737
长格式转录
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-small",
>>> 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分块了解分块算法更多细节。
微调
预训练的Whisper模型展现出适应不同数据集和领域的强大能力。但通过微调可进一步提高某些语言和任务的预测能力。博客文章使用🤗 Transformers微调Whisper提供了仅用5小时标注数据微调Whisper模型的逐步指南。
评估用途
这些模型的主要预期用户是研究当前模型鲁棒性、泛化性、能力、偏见和限制的AI研究人员。然而,Whisper作为英语语音识别的ASR解决方案对开发者也非常有用。我们认识到一旦模型发布,不可能将访问限制在仅"预期"用途或围绕什么是研究制定合理指南。
模型主要训练和评估于ASR和翻译成英语的任务。它们在约10种语言中显示出强大的ASR结果。如果针对特定任务(如语音活动检测、说话人分类或说话人日志)进行微调,它们可能表现出额外能力,但尚未在这些领域进行严格评估。我们强烈建议用户在特定上下文和领域中对模型进行严格评估后再部署。
特别是,我们警告不要使用Whisper模型转录未经个人同意录制的录音,或声称将这些模型用于任何主观分类。我们建议不要在高风险领域(如决策环境)使用,其中准确性缺陷可能导致明显结果缺陷。模型旨在转录和翻译语音,将模型用于分类不仅未经评估,而且不合适,特别是推断人类属性时。
训练数据
模型训练于68万小时的音频及对应从互联网收集的转录文本。其中65%(或43.8万小时)代表英语音频和匹配的英语转录文本,约18%(或12.6万小时)代表非英语音频和英语转录文本,最后17%(或11.7万小时)代表非英语音频和对应转录文本。这些非英语数据涵盖98种不同语言。
如随附论文所述,我们看到特定语言的转录性能与我们使用该语言的训练数据量直接相关。
性能与限制
研究表明,与许多现有ASR系统相比,这些模型在口音、背景噪音、技术语言以及从多种语言到英语的零样本翻译方面表现出更强的鲁棒性;语音识别和翻译的准确性接近最先进水平。
然而,由于模型使用大规模噪声数据以弱监督方式训练,预测可能包含音频输入中未实际说出的文本(即幻觉)。我们假设这是因为模型结合了预测音频中下一个单词和转录音频本身的语言通识知识。
模型在不同语言上表现不均,我们观察到低资源和/或低可发现性语言或训练数据较少语言的准确性较低。模型在特定语言的不同口音和方言上也表现出差异性能,可能包括跨不同性别、种族、年龄或其他人口标准说话者的更高词错误率。完整评估结果见本发布随附论文。
此外,模型的序列到序列架构使其容易生成重复文本,可通过束搜索和温度调度在一定程度上缓解但不完美。更多关于这些限制的分析见论文。在低资源和/或低可发现性语言上,这种行为与幻觉可能更严重。
更广泛影响
我们预计Whisper模型的转录能力可用于改进辅助工具。虽然Whisper模型不能直接用于实时转录——其速度和大小表明其他人可能能够在其上构建允许近乎实时语音识别和翻译的应用程序。基于Whisper模型构建的有益应用程序的实际价值表明,这些模型的差异性能可能具有实际经济影响。
发布Whisper也存在潜在的双重用途问题。虽然我们希望该技术主要用于有益目的,但使ASR技术更易获取可能使更多行为者能够构建有能力的监控技术或扩大现有监控工作,因为速度和准确性允许经济实惠地自动转录和翻译大量音频通信。此外,这些模型可能具有开箱即用识别特定个体的能力,这反过来提出了与双重用途和差异性能相关的安全问题。实际上,我们预计转录成本不是扩大监控项目的限制因素。
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}
}



