模型概述
模型特點
模型能力
使用案例
🚀 語音識別模型Whisper
Whisper是一款用於自動語音識別(ASR)和語音翻譯的預訓練模型。它在68萬小時的標註數據上進行訓練,無需微調,就能在眾多數據集和領域中展現出強大的泛化能力。
🚀 快速開始
Whisper是OpenAI的Alec Radford等人在論文 Robust Speech Recognition via Large-Scale Weak Supervision 中提出的自動語音識別和語音翻譯預訓練模型。原始代碼倉庫可在 此處 找到。
支持語言
- en、zh、de、es、ru、ko、fr、ja、pt、tr、pl、ca、nl、ar、sv、it、id、hi、fi、vi、he、uk、el、ms、cs、ro、da、hu、ta、'no'、th、ur、hr、bg、lt、la、mi、ml、cy、sk、te、fa、lv、bn、sr、az、sl、kn、et、mk、br、eu、is、hy、ne、mn、bs、kk、sq、sw、gl、mr、pa、si、km、sn、yo、so、af、oc、ka、be、tg、sd、gu、am、yi、lo、uz、fo、ht、ps、tk、nn、mt、sa、lb、my、bo、tl、mg、as、tt、haw、ln、ha、ba、jw、su
模型示例
模型指標
任務 | 數據集 | 指標 | 值 |
---|---|---|---|
自動語音識別 | LibriSpeech (clean) | 測試詞錯誤率 (WER) | 3.432213777886737 |
自動語音識別 | LibriSpeech (other) | 測試詞錯誤率 (WER) | 7.628304527060248 |
自動語音識別 | Common Voice 11.0 | 測試詞錯誤率 (WER) | 87.3 |
自動語音識別 | Common Voice 13.0 | 詞錯誤率 (WER) | 125.69809089960707 |
✨ 主要特性
- 多語言支持:支持多種語言的語音識別和翻譯。
- 弱監督訓練:使用大規模弱監督標註的68萬小時語音數據進行訓練。
- 多任務處理:可同時處理語音識別和語音翻譯任務。
- 多種模型大小:提供五種不同大小配置的檢查點,滿足不同需求。
📚 詳細文檔
模型詳情
Whisper是基於Transformer的編碼器 - 解碼器模型,也稱為 序列到序列 模型。它使用大規模弱監督對68萬小時的標註語音數據進行訓練。
模型分為僅英語數據訓練和多語言數據訓練兩種。僅英語模型用於語音識別任務,多語言模型則同時用於語音識別和語音翻譯任務。對於語音識別,模型預測與音頻相同語言的轉錄文本;對於語音翻譯,模型預測與音頻不同語言的轉錄文本。
Whisper檢查點有五種不同大小的配置,其中最小的四種可在僅英語或多語言數據上訓練,最大的檢查點僅支持多語言。所有十個預訓練檢查點都可在 Hugging Face Hub 上獲取。具體信息如下表所示:
大小 | 參數 | 僅英語模型 | 多語言模型 |
---|---|---|---|
tiny | 39 M | 鏈接 | 鏈接 |
base | 74 M | 鏈接 | 鏈接 |
small | 244 M | 鏈接 | 鏈接 |
medium | 769 M | 鏈接 | 鏈接 |
large | 1550 M | 無 | 鏈接 |
large-v2 | 1550 M | 無 | 鏈接 |
使用方法
要轉錄音頻樣本,模型需要與 WhisperProcessor
一起使用。WhisperProcessor
用於:
- 預處理音頻輸入(將其轉換為模型所需的對數梅爾頻譜圖)
- 後處理模型輸出(將其從令牌轉換為文本)
通過傳遞適當的“上下文令牌”,模型可以知道要執行的任務(轉錄或翻譯)。上下文令牌是在解碼過程開始時提供給解碼器的一系列令牌,順序如下:
- 轉錄始終以
<|startoftranscript|>
令牌開始 - 第二個令牌是語言令牌(例如,英語為
<|en|>
) - 第三個令牌是“任務令牌”,可以是
<|transcribe|>
(語音識別)或<|translate|>
(語音翻譯) - 此外,如果模型不應包括時間戳預測,則添加
<|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-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
>>> 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.<|endoftext|>']
>>> 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-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
>>> 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.<|endoftext|>']
>>> 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-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
>>> 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 Small:
>>> 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-small")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small").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"]))
3.432213777886737
長音頻轉錄
Whisper模型本質上設計用於處理最長30秒的音頻樣本。但是,通過使用分塊算法,可以用於轉錄任意長度的音頻樣本。這可以通過Transformers的 pipeline
方法實現。在實例化管道時設置 chunk_length_s=30
可啟用分塊。啟用分塊後,管道可以進行批量推理,還可以通過傳遞 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-small",
>>> 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作為一種自動語音識別解決方案,對開發者也非常有用,特別是在英語語音識別方面。
模型主要在自動語音識別和語音翻譯為英語的任務上進行訓練和評估,在約10種語言中表現出較強的自動語音識別能力。它們可能具有其他功能,特別是在針對某些任務(如語音活動檢測、說話人分類或說話人分割)進行微調時,但在這些領域尚未進行全面評估。強烈建議用戶在特定上下文和領域中對模型進行全面評估後再進行部署。
特別要注意,請勿在未經個人同意的情況下使用Whisper模型轉錄其錄音,也不要將這些模型用於任何主觀分類。不建議在高風險領域(如決策場景)中使用,因為準確性的缺陷可能導致結果出現明顯偏差。這些模型旨在轉錄和翻譯語音,將其用於分類不僅未經過評估,而且不合適,特別是用於推斷人類屬性時。
訓練數據
模型在從互聯網收集的68萬小時音頻及其對應的轉錄文本上進行訓練。其中,65%(約43.8萬小時)是英語音頻和匹配的英語轉錄文本,約18%(約12.6萬小時)是非英語音頻和英語轉錄文本,最後17%(約11.7萬小時)是非英語音頻及其對應的轉錄文本,這些非英語數據涵蓋98種不同語言。
正如 隨附論文 中所討論的,特定語言的轉錄性能與該語言的訓練數據量直接相關。
性能和侷限性
研究表明,與許多現有的自動語音識別系統相比,這些模型在口音、背景噪音、專業語言方面具有更強的魯棒性,並且在多語言到英語的零樣本翻譯方面表現出色;語音識別和翻譯的準確性接近當前的先進水平。
然而,由於模型是使用大規模噪聲數據進行弱監督訓練的,預測結果可能包含音頻輸入中實際未說出的文本(即幻覺)。推測這是因為模型結合了根據語言常識預測音頻中的下一個單詞和轉錄音頻本身的任務。
模型在不同語言上的表現不均衡,在資源較少和/或可發現性較低的語言或訓練數據較少的語言上,準確性較低。此外,模型在特定語言的不同口音和方言上也表現出差異,可能導致不同性別、種族、年齡或其他人口統計標準的說話者的詞錯誤率較高。完整的評估結果見 本次發佈的隨附論文。
此外,模型的序列到序列架構使其容易生成重複文本,儘管可以通過束搜索和溫度調度在一定程度上緩解,但無法完全消除。論文 對這些侷限性進行了進一步分析。在資源較少和/或可發現性較低的語言上,這種行為和幻覺可能更嚴重。
更廣泛的影響
預計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}
}
📄 許可證
本項目採用 Apache-2.0 許可證。



