Whisper-Large-V3-French-Distil-Dec8 项目介绍
Whisper-Large-V3-French-Distil-Dec8 是 Whisper-Large-V3-French 模型的系列精简版本。通过将解码器层数从 32 层减少到 16 层、8 层、4 层或 2 层,并使用大规模数据集进行蒸馏,实现了内存使用减少和推理时间缩短,同时保持性能并降低长文本转录时出现幻觉的风险。此外,这些精简模型可以与原始的 Whisper-Large-V3-French 模型无缝结合进行推测解码,从而提升推理速度并保证输出结果的一致性。
性能
我们对模型进行了短文本和长文本的转录测试,使用了域内和域外的数据集,以进行全面分析,评估其准确性、可推广性和鲁棒性。评估结果示例报告了转录后的词错误率(WER),在转换过程中将数字转为文字、去除标点(除了撇号和连字符),并将字符转换为小写。
短文本转录
在缺乏可用的法语域外和长文本测试数据的情况下,我们使用来自 Zaion Lab 的内部测试集进行评估。这些数据集包含由人类标注的呼叫中心对话音频和转录对,其中含有大量的背景噪声和特定领域的术语。
长文本转录
长文本转录利用 Hugging Face 的管道进行了快速评估。音频被分块处理,每块长约 30 秒,这些块并行处理后合并成最终结果。
使用方法
Hugging Face Pipeline
该模型可以通过 Hugging Face 的 pipeline
类方便地用于音频转录,对于长文本转录(>30 秒),可以通过 chunk_length_s
参数将音频分段,并在步长处找到最长公共子序列进行拼接。这种分段的方法提供了比 OpenAI 顺序算法快 9 倍的推理速度。
import torch
from datasets import load_dataset
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_name_or_path = "bofenghuang/whisper-large-v3-french-distil-dec8"
processor = AutoProcessor.from_pretrained(model_name_or_path)
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_name_or_path,
torch_dtype=torch_dtype,
low_cpu_mem_usage=True,
)
model.to(device)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
feature_extractor=processor.feature_extractor,
tokenizer=processor.tokenizer,
torch_dtype=torch_dtype,
device=device,
max_new_tokens=128,
)
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]
result = pipe(sample)
print(result["text"])
Hugging Face 低级 API
使用 Hugging Face 的低级 API 可以对转录过程进行更详细的控制。
import torch
from datasets import load_dataset
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_name_or_path = "bofenghuang/whisper-large-v3-french-distil-dec8"
processor = AutoProcessor.from_pretrained(model_name_or_path)
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_name_or_path,
torch_dtype=torch_dtype,
low_cpu_mem_usage=True,
)
model.to(device)
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]
input_features = processor(
sample["array"], sampling_rate=sample["sampling_rate"], return_tensors="pt"
).input_features
predicted_ids = model.generate(
input_features.to(dtype=torch_dtype).to(device), max_new_tokens=128
)
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0]
print(transcription)
推测解码
推测解码使用了一个精简版的 Whisper 作为草稿模型,与原始模型结合以达到 2 倍的推理速度,同时输出与仅使用 Whisper 模型一致。
OpenAI Whisper, Faster Whisper, Whisper.cpp, Candle, MLX
这些不同格式和库支持使用上述模型进行多种环境下的音频转录。不同方法根据需求选择,提供了在推理速度、平台兼容性和内存使用方面的优化。
训练细节
模型是基于超过 2500 小时法语录音数据集的结合训练的,包括多个数据集如 Common Voice 13.0、Multilingual LibriSpeech、Voxpopuli 等。我们通过数据过滤和质量提升流程,改善了数据集的质量,显著减少了模型的幻觉现象。训练在 GENCI 的 Jean-Zay 超级计算机上完成。
致谢
感谢 OpenAI 开发和开源 Whisper 模型,以及 Hugging Face 和 Genci 对项目的大力支持。