模型简介
模型特点
模型能力
使用案例
语言:
- 英语
- 中文
- 德语
- 西班牙语
- 俄语
- 韩语
- 法语
- 日语
- 葡萄牙语
- 土耳其语
- 波兰语
- 加泰罗尼亚语
- 荷兰语
- 阿拉伯语
- 瑞典语
- 意大利语
- 印尼语
- 印地语
- 芬兰语
- 越南语
- 希伯来语
- 乌克兰语
- 希腊语
- 马来语
- 捷克语
- 罗马尼亚语
- 丹麦语
- 匈牙利语
- 泰米尔语
- 挪威语
- 泰语
- 乌尔都语
- 克罗地亚语
- 保加利亚语
- 立陶宛语
- 拉丁语
- 毛利语
- 马拉雅拉姆语
- 威尔士语
- 斯洛伐克语
- 泰卢固语
- 波斯语
- 拉脱维亚语
- 孟加拉语
- 塞尔维亚语
- 阿塞拜疆语
- 斯洛文尼亚语
- 卡纳达语
- 爱沙尼亚语
- 马其顿语
- 布列塔尼语
- 巴斯克语
- 冰岛语
- 亚美尼亚语
- 尼泊尔语
- 蒙古语
- 波斯尼亚语
- 哈萨克语
- 阿尔巴尼亚语
- 斯瓦希里语
- 加利西亚语
- 马拉地语
- 旁遮普语
- 僧伽罗语
- 高棉语
- 修纳语
- 约鲁巴语
- 索马里语
- 南非荷兰语
- 奥克语
- 格鲁吉亚语
- 白俄罗斯语
- 塔吉克语
- 信德语
- 古吉拉特语
- 阿姆哈拉语
- 意第绪语
- 老挝语
- 乌兹别克语
- 法罗语
- 海地克里奥尔语
- 普什图语
- 土库曼语
- 挪威尼诺斯克语
- 马耳他语
- 梵语
- 卢森堡语
- 缅甸语
- 藏语
- 他加禄语
- 马尔加什语
- 阿萨姆语
- 鞑靼语
- 夏威夷语
- 林加拉语
- 豪萨语
- 巴什基尔语
- 爪哇语
- 巽他语
标签:
- 音频
- 自动语音识别
- hf-asr排行榜
小部件:
- 示例标题: Librispeech样本1 来源: https://cdn-media.huggingface.co/speech_samples/sample1.flac
- 示例标题: Librispeech样本2 来源: https://cdn-media.huggingface.co/speech_samples/sample2.flac
模型索引:
- 名称: whisper-large
结果:
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: LibriSpeech (干净)
类型: librispeech_asr
配置: clean
分割: test
参数:
语言: en
指标:
- 名称: 测试WER 类型: wer 值: 3.0
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: LibriSpeech (其他)
类型: librispeech_asr
配置: other
分割: test
参数:
语言: en
指标:
- 名称: 测试WER 类型: wer 值: 5.4
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: Common Voice 11.0
类型: mozilla-foundation/common_voice_11_0
配置: hi
分割: test
参数:
语言: hi
指标:
- 名称: 测试WER 类型: wer 值: 54.8
- 任务:
名称: 自动语音识别
类型: automatic-speech-recognition
数据集:
名称: LibriSpeech (干净)
类型: librispeech_asr
配置: clean
分割: test
参数:
语言: en
指标:
管道标签: automatic-speech-recognition 许可证: apache-2.0
Whisper
Whisper是一个预训练的自动语音识别(ASR)和语音翻译模型。经过68万小时标注数据的训练,Whisper模型展现出强大的泛化能力,能够适应多种数据集和领域,无需微调。
Whisper由OpenAI的Alec Radford等人在论文《通过大规模弱监督实现鲁棒语音识别》中提出。原始代码仓库可在此处找到。
更新:论文发布后,Whisper作者宣布了一个 large-v2模型,该模型通过正则化训练了2.5倍更多的周期。这个 large-v2模型在性能上超越了原始大模型,且没有架构变化。因此,建议使用 large-v2模型替代原始大模型。
免责声明:本模型卡的部分内容由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-large")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
>>> 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-large")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
>>> 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-large")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
>>> 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 Large:
>>> 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-large")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large").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.0003583080317572
长格式转录
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-large",
>>> 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和英语语音



