模型概述
模型特點
模型能力
使用案例
🚀 自動語音識別模型 - Whisper large-v3-turbo
本項目基於OpenAI的Whisper模型,提供了強大的自動語音識別和語音翻譯功能。通過微調,可適應不同語言和任務,在多種場景下實現高效準確的語音處理。
🚀 快速開始
模型支持情況
Whisper large-v3-turbo 支持多種語言,可用於自動語音識別任務。它基於OpenAI的Whisper模型,在性能和速度上有顯著提升。
相關資源鏈接
免費使用資源
模型性能對比
Unsloth支持的模型 | 免費筆記本鏈接 | 性能表現 | 內存使用 |
---|---|---|---|
Orpheus-TTS | 點擊開始 | 快1.5倍 | 減少58% |
Whisper Large V3 | 點擊開始 | 快1.5倍 | 減少50% |
Qwen3 (14B) | 點擊開始 | 快2倍 | 減少70% |
Llama 3.2 Vision (11B) | 點擊開始 | 快1.8倍 | 減少50% |
✨ 主要特性
- 多語言支持:支持多種語言的自動語音識別和翻譯,包括英語、中文、德語、西班牙語等。
- 高性能:基於OpenAI的Whisper模型,經過優化,在速度和準確性上表現出色。
- 易於使用:通過Hugging Face Transformers庫,可輕鬆集成到項目中。
- 可微調:可以使用少量標註數據進行微調,以適應特定的語言和任務。
📦 安裝指南
要運行Whisper large-v3-turbo模型,首先需要安裝Transformers庫。為了加載來自Hugging Face Hub的玩具音頻數據集,還需要安裝datasets
庫;為了減少模型加載時間,需要安裝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"])
轉錄本地音頻文件
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壓縮比閾值(在token空間中)
"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"})
執行語音翻譯任務
result = pipe(sample, generate_kwargs={"task": "translate"})
預測時間戳
句子級時間戳
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壓縮比閾值(在token空間中)
"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模型有五種不同大小的配置,其中最小的四種有英語專用和多語言版本,最大的只有多語言版本。所有十種預訓練模型都可以在Hugging Face 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 | 點擊查看 |
長音頻轉錄算法
順序算法
適用於以下情況:
- 轉錄準確性是最重要的因素,對速度要求不高。
- 批量轉錄長音頻文件,此時順序算法的延遲與分塊算法相當,但準確性可提高0.5%。
分塊算法
適用於以下情況:
- 轉錄速度是最重要的因素。
- 轉錄單個長音頻文件。
默認情況下,Transformers使用順序算法。要啟用分塊算法,可在pipeline
中傳遞chunk_length_s
參數。對於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 compile
Whisper的前向傳播與torch.compile
兼容,可實現4.5倍的速度提升。
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支持,且不使用torch.compile,建議使用Flash-Attention 2。首先安裝Flash Attention:
pip install flash-attn --no-build-isolation
然後在from_pretrained
中傳遞attn_implementation="flash_attention_2"
:
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="flash_attention_2")
Torch Scale-Product-Attention (SDPA)
如果GPU不支持Flash Attention,建議使用PyTorch的scaled dot-product attention (SDPA)。對於PyTorch 2.1.1或更高版本,此注意力實現默認啟用。可通過以下代碼檢查PyTorch版本是否兼容:
from transformers.utils import is_torch_sdpa_available
print(is_torch_sdpa_available())
如果返回True
,則已安裝有效版本的PyTorch,SDPA默認啟用。如果返回False
,需要根據官方說明升級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文檔。
📚 詳細文檔
微調
預訓練的Whisper模型具有很強的泛化能力,但通過微調可以進一步提高其在特定語言和任務上的預測能力。博客文章Fine-Tune Whisper with ü§ó Transformers提供了使用最少5小時標註數據微調Whisper模型的詳細步驟。
評估使用
這些模型的主要目標用戶是研究當前模型的魯棒性、泛化能力、性能、偏差和侷限性的AI研究人員。不過,Whisper作為一種自動語音識別解決方案,對開發者也非常有用,尤其適用於英語語音識別。
模型主要在自動語音識別和語音翻譯為英語的任務上進行訓練和評估,在約10種語言中表現出較強的自動語音識別能力。如果在特定任務(如語音活動檢測、說話人分類或說話人分割)上進行微調,可能會展現出更多能力,但在這些領域尚未進行充分評估。強烈建議用戶在特定上下文和領域中對模型進行充分評估後再進行部署。
特別提醒,請勿使用Whisper模型轉錄未經個人同意的錄音,或聲稱使用這些模型進行任何主觀分類。不建議在高風險領域(如決策場景)使用,因為準確性缺陷可能導致嚴重後果。模型旨在轉錄和翻譯語音,用於分類不僅未經過評估,也不合適,尤其不能用於推斷人類屬性。
性能和侷限性
研究表明,與許多現有的自動語音識別系統相比,這些模型在應對口音、背景噪音、專業語言方面表現出更強的魯棒性,並且能夠實現多種語言到英語的零樣本翻譯。語音識別和翻譯的準確性接近當前的先進水平。
然而,由於模型是使用大規模噪聲數據進行弱監督訓練的,預測結果可能包含音頻輸入中實際未說出的文本(即幻覺)。推測這是因為模型結合了基於語言知識預測下一個單詞和轉錄音頻本身的任務。
模型在不同語言上的表現不均衡,在資源較少、可發現性較低或訓練數據較少的語言上準確性較低。在特定語言的不同口音和方言上也表現出差異,可能導致不同性別、種族、年齡或其他人口統計特徵的說話人之間的單詞錯誤率更高。完整的評估結果見本次發佈的論文。
此外,模型的序列到序列架構容易生成重複文本,雖然可以通過束搜索和溫度調度在一定程度上緩解,但無法完全解決。論文對這些侷限性進行了進一步分析。在資源較少和/或可發現性較低的語言上,這種行為和幻覺可能更嚴重。
更廣泛的影響
預計Whisper模型的轉錄能力可用於改進輔助工具。雖然Whisper模型本身不能直接用於即時轉錄,但其速度和規模表明,開發者可以在此基礎上構建接近即時的語音識別和翻譯應用。基於Whisper模型構建的有益應用的實際價值表明,這些模型的不均衡性能可能會產生實際的經濟影響。
發佈Whisper模型也帶來了潛在的雙重用途問題。雖然希望該技術主要用於有益目的,但自動語音識別技術的普及可能使更多人能夠構建強大的監控技術或擴大現有監控工作的規模,因為其速度和準確性使得大量音頻通信的自動轉錄和翻譯變得經濟可行。此外,這些模型可能具有一定的識別特定個人的能力,這在雙重用途和不均衡性能方面都帶來了安全問題。實際上,預計轉錄成本不是擴大監控項目的限制因素。
📄 許可證
本項目採用MIT許可證。
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}
}



