ONNX 模型库
返回模型

说明文档

模型概述

该 Whisper-base 模型已针对 WebNN 进行了优化。本模型采用 Apache-2.0 许可证授权。关于使用条款,请访问预期用途。如果您遵守许可证和使用条款,您将拥有其中描述的权利。使用本模型即表示您接受这些条款。

Whisper-base-WebNN 旨在与此处的相应示例配合使用,仅用于教育或测试目的。

WebNN 变更

原始模型为 Whisper-base。Whisper-base-WebNN 是 Whisper-base 模型的 ONNX 版本,通过使用静态输入形状并移除未使用的算子来针对 WebNN 进行优化。

Whisper-base 模型卡片

Whisper 是一个用于自动语音识别 (ASR) 和语音翻译的预训练模型。该模型在 68 万小时标注数据上进行训练,Whisper 模型展示了强大的能力,可以泛化到许多数据集和领域,无需进行微调。

Whisper 由 OpenAI 的 Alec Radford 等人在论文 Robust Speech Recognition via Large-Scale Weak Supervision 中提出。原始代码仓库可在此处找到。

免责声明:本模型卡片的内容部分由 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 用于:

  1. 预处理音频输入(将其转换为模型所需的 log-Mel 频谱图)
  2. 后处理模型输出(将标记转换为文本)

通过传递适当的"上下文标记"来告知模型执行哪个任务(转录或翻译)。这些上下文标记是在解码过程开始时传递给解码器的标记序列,顺序如下:

  1. 转录始终以 <|startoftranscript|> 标记开始
  2. 第二个标记是语言标记(例如英语为 <|en|>
  3. 第三个标记是"任务标记"。它可以取两个值之一:<|transcribe|> 用于语音识别,或 <|translate|> 用于语音翻译
  4. 此外,如果模型不应包含时间戳预测,则添加 <|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-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
>>> 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.']

>>> 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-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
>>> 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.']

>>> 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-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
>>> 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 Base:

>>> 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-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base").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.082316555716899

长音频转录

Whisper 模型本质上设计用于处理最长 30 秒的音频样本。然而,通过使用分块算法,它可以用于转录任意长度的音频样本。这可以通过 Transformers 的 pipeline 方法实现。在实例化 pipeline 时设置 chunk_length_s=30 来启用分块。启用分块后,pipeline 可以进行批量推理。它还可以通过传递 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-base",
>>>   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 作为开发者的 ASR 解决方案也相当有用,特别是对于英语语音识别。我们认识到,一旦模型发布,就不可能将访问限制仅限于"预期"用途,也不可能围绕什么是或不是研究制定合理的指导方针。

这些模型主要在 ASR 和语音翻译为英语的任务上进行训练和评估。它们在约 10 种语言中显示出强大的 ASR 结果。它们可能展现出额外的能力,特别是在某些任务(如语音活动检测、说话人分类或说话人分离)上进行微调时,但在这些领域尚未经过稳健的评估。我们强烈建议用户在特定环境和领域部署模型之前,对模型进行稳健的评估。

特别是,我们警告不要使用 Whisper 模型转录未经个人同意录制的录音,或声称将这些模型用于任何类型的主观分类。我们建议不要在高风险领域(如决策环境)中使用,因为准确性缺陷可能导致结果的明显缺陷。这些模型旨在转录和翻译语音,使用模型进行分类不仅没有经过评估,而且是不适当的,特别是用于推断人类属性。

训练数据

这些模型在从互联网收集的 68 万小时音频和相应转录文本上进行训练。其中 65% 的数据(或 43.8 万小时)代表英语音频和匹配的英语转录文本,约 18%(或 12.6 万小时)代表非英语音频和英语转录文本,而最后 17%(或 11.7 万小时)代表非英语音频和相应的转录文本。这些非英语数据代表 98 种不同的语言。

正如 accompanying paper中所讨论的,我们看到在给定语言上的转录性能与我们在该语言中使用的训练数据量直接相关。

性能与局限性

我们的研究表明,与许多现有的 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}
}

webnn/whisper-base-webnn

作者 webnn

automatic-speech-recognition
↓ 0 ♥ 0

创建时间: 2025-07-03 06:59:05+00:00

更新时间: 2025-12-12 01:53:54+00:00

在 Hugging Face 上查看

文件 (19)

.gitattributes
README.md
preprocessor_config.json
processer/resolve/main/preprocessor_config.json
tokenizer.json
tokenizer/resolve/main/.gitkeep
tokenizer/resolve/main/tokenizer.json
tokenizer/resolve/main/tokenizer_config.json
tokenizer_config.json
whisper_base_decoder_static_kvcache_128_lm_fp16_layernorm.onnx ONNX
whisper_base_decoder_static_kvcache_128_lm_fp16_layernorm_4dmask.onnx ONNX
whisper_base_decoder_static_kvcache_128_lm_fp16_layernorm_gelu_4dmask.onnx ONNX
whisper_base_decoder_static_kvcache_128_lm_fp16_layernorm_gelu_4dmask_iobinding.onnx ONNX
whisper_base_decoder_static_non_kvcache_lm_fp16_layernorm.onnx ONNX
whisper_base_decoder_static_non_kvcache_lm_fp16_layernorm_4dmask.onnx ONNX
whisper_base_decoder_static_non_kvcache_lm_fp16_layernorm_gelu_4dmask.onnx ONNX
whisper_base_decoder_static_non_kvcache_lm_fp16_layernorm_gelu_4dmask_iobinding.onnx ONNX
whisper_base_encoder_lm_fp16_layernorm.onnx ONNX
whisper_base_encoder_lm_fp16_layernorm_gelu.onnx ONNX