模型概述
模型特點
模型能力
使用案例
🚀 Whisper-Large-V3-Distil-French-v0.2
Whisper的蒸餾版本,具有2個解碼器層,針對法語語音轉文本進行了優化,可有效提升推理速度並保持一定準確性。
該模型是Whisper的蒸餾版本,僅有2個解碼器層,專為法語語音轉文本任務優化。與 v0.1 相比,此版本將訓練擴展到30秒的音頻片段,以保持長文本轉錄能力。在蒸餾過程中,使用了 "patient" teacher,即更長的訓練時間和更激進的數據增強策略,從而提高了整體性能。
模型以 openai/whisper-large-v3 作為教師模型,同時保持編碼器架構不變。這使其適合作為推測解碼的草稿模型,只需添加2個額外的解碼器層並僅運行一次編碼器,就可能在保持相同輸出的情況下實現2倍的推理速度。它也可以作為獨立模型,以一定的準確性換取更高的效率,運行速度快5.8倍,且僅使用49%的參數。這篇 論文 還表明,在長文本轉錄過程中,蒸餾模型實際上可能比完整模型產生更少的幻覺內容。
該模型已轉換為多種格式,以確保在包括transformers、openai-whisper、faster-whisper、whisper.cpp、candle、mlx等庫中的廣泛兼容性。
🚀 快速開始
此模型可用於法語語音轉文本任務,支持多種使用方式和格式,能在不同場景下滿足需求。
✨ 主要特性
- 優化長文本轉錄:擴展訓練到30秒音頻片段,保持長文本轉錄能力。
- 高效推理:作為推測解碼草稿模型可提升2倍推理速度;作為獨立模型運行速度快5.8倍,僅使用49%參數。
- 減少幻覺內容:長文本轉錄時可能比完整模型產生更少幻覺內容。
- 廣泛兼容性:轉換為多種格式,適配多個庫。
💻 使用示例
基礎用法
Hugging Face Pipeline
模型可輕鬆與 🤗 Hugging Face pipeline
類結合使用進行音頻轉錄。對於長文本轉錄(超過30秒),它將按照OpenAI論文中描述的方式進行順序解碼。如果需要更快的推理速度,可以使用 chunk_length_s
參數進行 分塊並行解碼,推理速度可提高9倍,但與OpenAI的順序算法相比,性能可能會略有下降。
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
# Load model
model_name_or_path = "bofenghuang/whisper-large-v3-distil-fr-v0.2"
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)
# Init pipeline
pipe = pipeline(
"automatic-speech-recognition",
model=model,
feature_extractor=processor.feature_extractor,
tokenizer=processor.tokenizer,
torch_dtype=torch_dtype,
device=device,
# chunk_length_s=30, # for chunked decoding
max_new_tokens=128,
)
# Example audio
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]
# Run pipeline
result = pipe(sample)
print(result["text"])
高級用法
多種使用方式
除了Hugging Face Pipeline,還可以使用Hugging Face低級別API、推測解碼、OpenAI Whisper、Faster Whisper、Whisper.cpp、Candle、MLX等方式進行轉錄。
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
# Load model
model_name_or_path = "bofenghuang/whisper-large-v3-distil-fr-v0.2"
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)
# Example audio
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]
# Extract feautres
input_features = processor(
sample["array"], sampling_rate=sample["sampling_rate"], return_tensors="pt"
).input_features
# Generate tokens
predicted_ids = model.generate(
input_features.to(dtype=torch_dtype).to(device), max_new_tokens=128
)
# Detokenize to text
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0]
print(transcription)
推測解碼
import torch
from datasets import load_dataset
from transformers import (
AutoModelForCausalLM,
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
# Load model
model_name_or_path = "openai/whisper-large-v3"
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)
# Load draft model
assistant_model_name_or_path = "bofenghuang/whisper-large-v3-distil-fr-v0.2"
assistant_model = AutoModelForCausalLM.from_pretrained(
assistant_model_name_or_path,
torch_dtype=torch_dtype,
low_cpu_mem_usage=True,
)
assistant_model.to(device)
# Init pipeline
pipe = pipeline(
"automatic-speech-recognition",
model=model,
feature_extractor=processor.feature_extractor,
tokenizer=processor.tokenizer,
torch_dtype=torch_dtype,
device=device,
generate_kwargs={"assistant_model": assistant_model},
max_new_tokens=128,
)
# Example audio
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]
# Run pipeline
result = pipe(sample)
print(result["text"])
OpenAI Whisper
import whisper
from datasets import load_dataset
# Load model
model_name_or_path = "./models/whisper-large-v3-distil-fr-v0.2/original_model.pt"
model = whisper.load_model(model_name_or_path)
# Example audio
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]["array"].astype("float32")
# Transcribe
result = model.transcribe(sample, language="fr")
print(result["text"])
Faster Whisper
from datasets import load_dataset
from faster_whisper import WhisperModel
# Load model
model_name_or_path = "./models/whisper-large-v3-distil-fr-v0.2/ctranslate2"
model = WhisperModel(model_name_or_path", device="cuda", compute_type="float16") # Run on GPU with FP16
# Example audio
dataset = load_dataset("bofenghuang/asr-dummy", "fr", split="test")
sample = dataset[0]["audio"]["array"].astype("float32")
segments, info = model.transcribe(sample, beam_size=5, language="fr")
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
Whisper.cpp
./main -m ./models/whisper-large-v3-distil-fr-v0.2/ggml-model-q5_0.bin -l fr -f /path/to/audio/file --print-colors
Candle
cargo run --example whisper --release -- --model large-v3 --model-id bofenghuang/whisper-large-v3-distil-fr-v0.2 --language fr --input /path/to/audio/file
MLX
import whisper
result = whisper.transcribe("/path/to/audio/file", path_or_hf_repo="mlx_models/whisper-large-v3-distil-fr-v0.2", language="fr")
print(result["text"])
📚 詳細文檔
性能評估
模型在短文本和長文本轉錄上都進行了評估,使用分佈內(ID)和分佈外(OOD)數據集來評估準確性、泛化能力和魯棒性。
需要注意的是,這裡顯示的單詞錯誤率(WER)結果是 歸一化後 的結果,包括將文本轉換為小寫並去除符號和標點。
所有公開數據集的評估結果可以在 這裡 找到。
短文本轉錄
斜體 表示分佈內(ID)評估,其中測試集對應於訓練期間看到的數據分佈,通常比分佈外(OOD)評估具有更高的性能。斜體和刪除線 表示可能存在測試集汙染的情況 - 例如,當訓練和評估使用不同版本的Common Voice時,可能會出現數據重疊的可能性。
由於分佈外(OOD)和長文本法語測試集的可用性有限,還使用了 Zaion Lab 的內部測試集進行評估 - 該測試集由人工標註的客服中心對話組成,包含大量背景噪音和特定領域的術語。
長文本轉錄
長文本轉錄評估使用了 🤗 Hugging Face pipeline
,同時使用了 分塊(chunk_length_s=30)和原始順序解碼方法。
訓練細節
構建了一個超過22,000小時標註和半標註法語語音的數據集。通過Whisper-Large-V3對該數據集進行解碼,並過濾掉WER超過20%的片段後,保留了約10,000小時的高質量音頻。
數據集 | 總時長 (h) | 過濾後時長 (h) <20% WER |
---|---|---|
mcv | 800.37 | 687.02 |
mls | 1076.58 | 1043.87 |
voxpopuli | 199.03 | 177.11 |
mtedx | 170.31 | 147.48 |
african_accented_french | 7.69 | 7.69 |
yodas-fr000 | 2395.82 | 1502.82 |
yodas-fr100 | 4978.16 | 1887.36 |
yodas-fr101 | 4966.07 | 1882.39 |
yodas-fr102 | 4992.84 | 1877.40 |
yodas-fr103 | 3161.39 | 1189.32 |
總計 | 22748.26 | 10402.46 |
大多數數據首先被拼接成30秒的片段,主要保留相同的說話者,然後一起進行推理。50%的片段使用時間戳進行訓練,以確保良好的時間戳預測,只有20%的片段使用先前的上下文進行訓練,因為不期望2層解碼器在這項任務上表現出色。
該模型使用激進的數據增強策略進行了160個epoch的較長訓練,評估WER持續下降。一些超參數的選擇更傾向於長文本轉錄而非短文本轉錄。更多詳細信息,請參考 Distil-Whisper 倉庫。
所有模型訓練均在GENCI的 Jean-Zay超級計算機 上進行。特別感謝IDRIS團隊在整個項目中的出色支持。
🔧 技術細節
- 模型架構:以 openai/whisper-large-v3 為教師模型,保持編碼器架構不變,添加2個解碼器層。
- 訓練策略:使用 "patient" teacher 進行蒸餾,採用激進數據增強和長訓練時間。
- 數據處理:構建超22,000小時法語語音數據集,過濾WER超20%片段,保留約10,000小時高質量音頻。
📄 許可證
本項目採用MIT許可證。



