模型概述
模型特點
模型能力
使用案例
🚀 Whisper
Whisper是一款用於自動語音識別(ASR)和語音翻譯的先進模型,由OpenAI的Alec Radford等人在論文Robust Speech Recognition via Large-Scale Weak Supervision中提出。該模型在超過500萬小時的標註數據上進行訓練,在零樣本設置下,對許多數據集和領域都表現出了強大的泛化能力。
Whisper large-v3-turbo是經過微調的剪枝版Whisper large-v3。也就是說,它與原模型基本相同,只是解碼層的數量從32層減少到了4層。因此,該模型的速度更快,但會有輕微的質量下降。你可以在這個GitHub討論中找到更多相關細節。
聲明:此模型卡片的部分內容由🤗 Hugging Face團隊撰寫,部分內容從原始模型卡片複製粘貼而來。
🚀 快速開始
Whisper large-v3-turbo在Hugging Face 🤗 Transformers中得到支持。要運行該模型,首先需要安裝Transformers庫。在這個示例中,我們還將安裝🤗 Datasets以從Hugging Face Hub加載玩具音頻數據集,並安裝🤗 Accelerate以減少模型加載時間:
pip install --upgrade pip
pip install --upgrade transformers datasets[audio] accelerate
可以使用pipeline
類來轉錄任意長度的音頻:
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
result = pipe(sample)
print(result["text"])
要轉錄本地音頻文件,只需在調用pipeline時傳入音頻文件的路徑:
result = pipe("audio.mp3")
可以通過將多個音頻文件指定為列表並設置batch_size
參數來並行轉錄:
result = pipe(["audio_1.mp3", "audio_2.mp3"], batch_size=2)
Transformers與所有Whisper解碼策略兼容,例如溫度回退和基於先前標記的條件。以下示例展示瞭如何啟用這些啟發式方法:
generate_kwargs = {
"max_new_tokens": 448,
"num_beams": 1,
"condition_on_prev_tokens": False,
"compression_ratio_threshold": 1.35, # zlib壓縮比閾值(在標記空間中)
"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
"logprob_threshold": -1.0,
"no_speech_threshold": 0.6,
"return_timestamps": True,
}
result = pipe(sample, generate_kwargs=generate_kwargs)
Whisper會自動預測源音頻的語言。如果事先知道源音頻的語言,可以將其作為參數傳遞給pipeline:
result = pipe(sample, generate_kwargs={"language": "english"})
默認情況下,Whisper執行語音轉錄任務,即源音頻語言與目標文本語言相同。要執行語音翻譯任務,即目標文本為英語,可以將任務設置為"translate"
:
result = pipe(sample, generate_kwargs={"task": "translate"})
最後,可以讓模型預測時間戳。要獲取句子級別的時間戳,可以傳遞return_timestamps
參數:
result = pipe(sample, return_timestamps=True)
print(result["chunks"])
要獲取單詞級別的時間戳:
result = pipe(sample, return_timestamps="word")
print(result["chunks"])
上述參數可以單獨使用,也可以組合使用。例如,要執行源音頻為法語的語音轉錄任務,並返回句子級別的時間戳,可以使用以下代碼:
result = pipe(sample, return_timestamps=True, generate_kwargs={"language": "french", "task": "translate"})
print(result["chunks"])
要更精細地控制生成參數,可以直接使用模型 + 處理器API:
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
from datasets import Audio, load_dataset
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(processor.feature_extractor.sampling_rate))
sample = dataset[0]["audio"]
inputs = processor(
sample["array"],
sampling_rate=sample["sampling_rate"],
return_tensors="pt",
truncation=False,
padding="longest",
return_attention_mask=True,
)
inputs = inputs.to(device, dtype=torch_dtype)
gen_kwargs = {
"max_new_tokens": 448,
"num_beams": 1,
"condition_on_prev_tokens": False,
"compression_ratio_threshold": 1.35, # zlib壓縮比閾值(在標記空間中)
"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
"logprob_threshold": -1.0,
"no_speech_threshold": 0.6,
"return_timestamps": True,
}
pred_ids = model.generate(**inputs, **gen_kwargs)
pred_text = processor.batch_decode(pred_ids, skip_special_tokens=True, decode_with_timestamps=False)
print(pred_text)
✨ 主要特性
支持多語言
支持以下多種語言:
- 英語、中文、德語、西班牙語、俄語、韓語、法語、日語、葡萄牙語、土耳其語、波蘭語、加泰羅尼亞語、荷蘭語、阿拉伯語、瑞典語、意大利語、印尼語、印地語、芬蘭語、越南語、希伯來語、烏克蘭語、希臘語、馬來語、捷克語、羅馬尼亞語、丹麥語、匈牙利語、泰米爾語、挪威語、泰語、烏爾都語、克羅地亞語、保加利亞語、立陶宛語、拉丁語、毛利語、馬拉雅拉姆語、威爾士語、斯洛伐克語、泰盧固語、波斯語、拉脫維亞語、孟加拉語、塞爾維亞語、阿塞拜疆語、斯洛文尼亞語、卡納達語、愛沙尼亞語、馬其頓語、布列塔尼語、巴斯克語、冰島語、亞美尼亞語、尼泊爾語、蒙古語、波斯尼亞語、哈薩克語、阿爾巴尼亞語、斯瓦希里語、加利西亞語、馬拉地語、旁遮普語、僧伽羅語、高棉語、紹納語、約魯巴語、索馬里語、南非荷蘭語、奧克語、格魯吉亞語、白俄羅斯語、塔吉克語、信德語、古吉拉特語、阿姆哈拉語、意第緒語、老撾語、烏茲別克語、法羅語、海地克里奧爾語、普什圖語、土庫曼語、新挪威語、馬耳他語、梵語、盧森堡語、緬甸語、藏語、他加祿語、馬達加斯加語、阿薩姆語、韃靼語、夏威夷語、林加拉語、豪薩語、巴什基爾語、爪哇語、巽他語
高性能與低資源消耗
通過剪枝和優化,在保證一定性能的前提下,大幅減少了解碼層數量,從而提高了推理速度,降低了內存和顯存的使用。
靈活的解碼策略
支持多種解碼策略,如溫度回退和基於先前標記的條件,可根據不同需求進行靈活調整。
自動語言預測與多任務支持
能夠自動預測源音頻的語言,並支持語音轉錄和語音翻譯兩種任務。
時間戳預測功能
可以輸出句子級和單詞級別的時間戳,方便進行後續處理。
📦 安裝指南
要使用Whisper large-v3-turbo模型,你需要安裝必要的庫。以下是安裝步驟:
安裝依賴庫
pip install --upgrade pip
pip install --upgrade transformers datasets[audio] accelerate
可選安裝
如果你想使用Flash Attention 2,需要先安裝Flash Attention:
pip install flash-attn --no-build-isolation
💻 使用示例
基礎用法
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
result = pipe(sample)
print(result["text"])
高級用法
轉錄本地音頻文件
result = pipe("audio.mp3")
並行轉錄多個音頻文件
result = pipe(["audio_1.mp3", "audio_2.mp3"], batch_size=2)
啟用特定解碼策略
generate_kwargs = {
"max_new_tokens": 448,
"num_beams": 1,
"condition_on_prev_tokens": False,
"compression_ratio_threshold": 1.35, # zlib壓縮比閾值(在標記空間中)
"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
"logprob_threshold": -1.0,
"no_speech_threshold": 0.6,
"return_timestamps": True,
}
result = pipe(sample, generate_kwargs=generate_kwargs)
指定源音頻語言和任務
result = pipe(sample, generate_kwargs={"language": "english", "task": "translate"})
獲取時間戳
# 句子級時間戳
result = pipe(sample, return_timestamps=True)
print(result["chunks"])
# 單詞級時間戳
result = pipe(sample, return_timestamps="word")
print(result["chunks"])
直接使用模型 + 處理器API
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
from datasets import Audio, load_dataset
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(processor.feature_extractor.sampling_rate))
sample = dataset[0]["audio"]
inputs = processor(
sample["array"],
sampling_rate=sample["sampling_rate"],
return_tensors="pt",
truncation=False,
padding="longest",
return_attention_mask=True,
)
inputs = inputs.to(device, dtype=torch_dtype)
gen_kwargs = {
"max_new_tokens": 448,
"num_beams": 1,
"condition_on_prev_tokens": False,
"compression_ratio_threshold": 1.35, # zlib壓縮比閾值(在標記空間中)
"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
"logprob_threshold": -1.0,
"no_speech_threshold": 0.6,
"return_timestamps": True,
}
pred_ids = model.generate(**inputs, **gen_kwargs)
pred_text = processor.batch_decode(pred_ids, skip_special_tokens=True, decode_with_timestamps=False)
print(pred_text)
📚 詳細文檔
模型細節
Whisper是一個基於Transformer的編碼器 - 解碼器模型,也被稱為序列到序列模型。Whisper模型有兩種類型:僅支持英語的模型和多語言模型。僅支持英語的模型是在英語語音識別任務上進行訓練的,而多語言模型則同時在多語言語音識別和語音翻譯任務上進行訓練。對於語音識別任務,模型預測的轉錄文本與音頻語言相同;對於語音翻譯任務,模型預測的轉錄文本為英語。
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 | ✓ |
large-v3 | 1550 M | x | ✓ |
large-v3-turbo | 809 M | x | ✓ |
微調
預訓練的Whisper模型在不同的數據集和領域中表現出了很強的泛化能力。然而,通過微調,可以進一步提高其在某些語言和任務上的預測能力。博客文章Fine-Tune Whisper with 🤗 Transformers提供了一個逐步指南,介紹瞭如何使用低至5小時的標註數據來微調Whisper模型。
評估使用
這些模型的主要目標用戶是研究當前模型的魯棒性、泛化能力、性能、偏差和侷限性的AI研究人員。然而,Whisper對於開發者來說,作為一種自動語音識別(ASR)解決方案也可能非常有用,特別是在英語語音識別方面。我們認識到,一旦模型發佈,就不可能將其使用限制在“預期”用途上,也很難制定合理的準則來界定什麼是研究,什麼不是研究。
這些模型主要在自動語音識別和語音翻譯為英語的任務上進行訓練和評估。它們在約10種語言的自動語音識別任務中表現出了很強的性能。它們可能還具有其他能力,特別是在某些任務(如語音活動檢測、說話人分類或說話人分割)上進行微調時,但在這些領域尚未進行全面評估。我們強烈建議用戶在特定的上下文和領域中對模型進行全面評估後再進行部署。
特別是,我們警告不要使用Whisper模型在未經個人同意的情況下轉錄其錄音,或聲稱使用這些模型進行任何形式的主觀分類。我們不建議在高風險領域(如決策場景)中使用該模型,因為準確性的缺陷可能會導致結果出現明顯的偏差。這些模型旨在轉錄和翻譯語音,將其用於分類不僅未經過評估,而且不合適,特別是用於推斷人類屬性時。
訓練數據
未提供相關信息。
性能和侷限性
我們的研究表明,與許多現有的自動語音識別系統相比,這些模型在應對口音、背景噪音、專業語言方面表現出了更強的魯棒性,並且在多種語言到英語的零樣本翻譯方面也有出色表現;在語音識別和翻譯的準確性方面接近當前的先進水平。
然而,由於這些模型是使用大規模的嘈雜數據進行弱監督訓練的,因此預測結果可能包含音頻輸入中實際未說出的文本(即幻覺現象)。我們推測,這是因為模型在利用其對語言的一般知識時,會同時嘗試預測音頻中的下一個單詞和轉錄音頻本身。
這些模型在不同語言上的表現並不均衡,我們發現對於資源較少和/或曝光度較低的語言,或者訓練數據較少的語言,模型的準確性較低。此外,模型在特定語言的不同口音和方言上也表現出了差異,這可能包括不同性別、種族、年齡或其他人口統計學特徵的說話者之間的單詞錯誤率較高。我們的完整評估結果在本次發佈的論文中有所呈現。
此外,模型的序列到序列架構使其容易生成重複的文本,雖然可以通過束搜索和溫度調度在一定程度上緩解這一問題,但無法完全解決。論文中對這些侷限性進行了進一步分析。在資源較少和/或曝光度較低的語言上,這種行為和幻覺現象可能會更嚴重。
更廣泛的影響
我們預計Whisper模型的轉錄能力可用於改進無障礙工具。雖然Whisper模型本身不能直接用於即時轉錄,但其速度和規模表明,其他人可以在其基礎上構建允許接近即時語音識別和翻譯的應用程序。基於Whisper模型構建的有益應用程序的真正價值表明,這些模型的不同表現可能會產生實際的經濟影響。
發佈Whisper也存在潛在的雙重用途問題。雖然我們希望這項技術主要用於有益的目的,但使自動語音識別技術更易於獲取可能會使更多的人能夠構建強大的監控技術或擴大現有的監控工作,因為其速度和準確性使得對大量音頻通信進行經濟實惠的自動轉錄和翻譯成為可能。此外,這些模型可能具有直接識別特定個人的能力,這反過來又帶來了與雙重用途和不同表現相關的安全問題。實際上,我們預計轉錄成本並不是擴大監控項目的限制因素。
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}
}
🔧 技術細節
額外的速度和內存優化
你可以對Whisper應用額外的速度和內存優化,以進一步降低推理速度和顯存要求。
分塊長音頻處理
Whisper的感受野為30秒。要轉錄超過這個時長的音頻,需要使用以下兩種長音頻算法之一:
- 順序算法:使用“滑動窗口”進行緩衝推理,逐個轉錄30秒的音頻片段。
- 分塊算法:將長音頻文件分割成較短的片段(片段之間有小的重疊),獨立轉錄每個片段,然後在邊界處拼接轉錄結果。
在以下兩種情況下,應使用順序長音頻算法:
- 轉錄準確性是最重要的因素,而速度不是主要考慮因素。
- 你正在轉錄批量長音頻文件,在這種情況下,順序算法的延遲與分塊算法相當,但準確性可提高多達0.5%的單詞錯誤率。
相反,在以下情況下應使用分塊算法:
- 轉錄速度是最重要的因素。
- 你正在轉錄單個長音頻文件。
默認情況下,Transformers使用順序算法。要啟用分塊算法,可以將chunk_length_s
參數傳遞給pipeline
。對於large-v3模型,30秒的分塊長度是最優的。要對長音頻文件進行批量處理,可以傳遞batch_size
參數:
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
chunk_length_s=30,
batch_size=16, # 推理的批量大小 - 根據你的設備進行設置
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
result = pipe(sample)
print(result["text"])
Torch編譯
Whisper的前向傳播與torch.compile
兼容,可實現4.5倍的速度提升。
注意:torch.compile
目前與分塊長音頻算法或Flash Attention 2不兼容 ⚠️
import torch
from torch.nn.attention import SDPBackend, sdpa_kernel
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
from tqdm import tqdm
torch.set_float32_matmul_precision("high")
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
).to(device)
# 啟用靜態緩存並編譯前向傳播
model.generation_config.cache_implementation = "static"
model.generation_config.max_new_tokens = 256
model.forward = torch.compile(model.forward, mode="reduce-overhead", fullgraph=True)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
# 2次預熱步驟
for _ in tqdm(range(2), desc="Warm-up step"):
with sdpa_kernel(SDPBackend.MATH):
result = pipe(sample.copy(), generate_kwargs={"min_new_tokens": 256, "max_new_tokens": 256})
# 快速運行
with sdpa_kernel(SDPBackend.MATH):
result = pipe(sample.copy())
print(result["text"])
Flash Attention 2
如果你的GPU支持Flash-Attention 2,並且你沒有使用torch.compile,我們建議使用它。要使用Flash Attention 2,首先需要安裝Flash Attention:
pip install flash-attn --no-build-isolation
然後將attn_implementation="flash_attention_2"
傳遞給from_pretrained
:
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="flash_attention_2")
Torch縮放點積注意力(SDPA)
如果你的GPU不支持Flash Attention,我們建議使用PyTorch的縮放點積注意力(SDPA)。對於PyTorch 2.1.1或更高版本,此注意力實現默認啟用。要檢查你是否有兼容的PyTorch版本,可以運行以下Python代碼片段:
from transformers.utils import is_torch_sdpa_available
print(is_torch_sdpa_available())
如果上述代碼返回True
,則表示你安裝了有效的PyTorch版本,並且SDPA默認已啟用。如果返回False
,則需要根據官方說明升級你的PyTorch版本。
安裝有效的PyTorch版本後,SDPA將默認啟用。也可以通過指定attn_implementation="sdpa"
來顯式設置:
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="sdpa")
有關如何使用SDPA的更多信息,請參考Transformers SDPA文檔。
📄 許可證
本項目採用MIT許可證。



