OpenAI Whisper論文筆記
OpenAI 收集了 68 萬小時的有標簽的語音數據,通過多任務、多語言的方式訓練了一個 seq2seq (語音到文本)的 Transformer 模型,自動語音識別(ASR)能力達到商用水準。本文為李沐老師論文精讀的學習筆記。本文的模型權重,推理代碼及 API 均以開源,相關博客也介紹了一些有趣的例子。
Paper:https://cdn.openai.com/papers/whisper.pdf
Code:https://github.com/openai/whisper
Blog:https://openai.com/blog/whisper
在互聯網上,可獲取的帶標注的語音數據有很多,如電影及其字幕,歌曲及其歌詞等。語音數據似乎很容易通過爬蟲收集。但是,目前并沒有(公開的)大規模語音數據集。這是因為這些帶標注的語音數據的版權問題很難處理。即使某些公司通過收集這些數據訓練了大語音模型,也不會聲明自己的數據是爬去自存在版權問題的作品,更不會將數據公開。在 Whisper 文章中,同樣沒有詳細說明數據來源,只是介紹了數據清洗和篩選的方法。
本文標題為 Robust Speech Recognition via Large-Scale Weak Supervision ,其中 Large-Scale 是 OpenAI 的 “傳統藝能”,也是最近學術界的一個火熱方向。即“大力出奇跡”,大模型、大數據的訓練。Weak Supervision 是指本文所用數據雖然是有標注的,但并不是為了訓練模型專門進行的人工標注,所以是質量較低的標注,故稱為 “弱監督”。
摘要
在摘要部分,作者指明,本文通過擴大語音識別弱監督數據的規模,達到 68 萬小時,并在大規模數據上進行多語言、多任務的訓練。得到了一個泛化性能很好的模型。該模型在常見語音識別數據集上,不需要微調,直接以 zero-shot 的方式進行測試,結果與在這些數據集上訓練過的語音識別模型性能相當。
導言
最近的語音識別方面的進展是使用無標簽的數據進行自監督預訓練。如 Wav2Vec,收集了大量無標簽的語音數據,通過對比學習的方式預訓練語音編碼器。在編碼器預訓練完成之后,再在標準的語音識別數據集上微調,得到的結果優于只在語音識別訓練集訓練的模型。自監督預訓練使用到的無標簽語音數據規模最多已經達到 100 萬小時。
考慮在 NLP 領域常見的兩類預訓練方式:BERT,Transformer 編碼器類 和 GPT,Transformer 解碼器類。BERT 中,預測掩碼掉的單詞和預測下一個句子是為了訓練編碼器理解自然語言而構造的預訓練任務,它們不是現實中真正要用的 NLP 任務。因此,BERT 類預訓練方法需要在對應下游任務上進行微調。GPT 類的預訓練任務標準的語言模型,預測句子的下一個單詞。這種方式可以通過構造 prompt,實現 zero-shot 測試,無需微調。然而,在語音識別領域,這種方式預測的是下一幀音頻,而非語音識別結果,故而也必須微調一個解碼器。總之,在語音識別領域,如果沒有文本標簽,很難實現無需微調的預訓練。(Wav2Vec-U 在無監督語音識別訓練方面取得了一些相關進展,不需要微調。)
在語音識別領域,自監督預訓練的方式可以訓練一個不錯的編碼器,但是預訓練階段沒有標簽,無法訓練解碼器。因此在實際用于語音識別之前,還需要在有標簽數據上進行微調,比較麻煩,并且容易造成過擬合。一個理想的語音識別系統,應當不需要根據不同的場景進行微調,即應該實現開箱即用。
既然需要有標簽數據,那么在語音識別人工標注數據集上訓練,不就能訓練出無需微調的語音識別系統了嗎?遺憾的是,目前人工標注的語音識別數據集規模都比較小,七個數據集加起來也只有 5000 小時左右。一個自然的思路是,在數據的質量和數量之間進行權衡。既然高質量的人工標注成本較高,得到的數據集規模較小,那么是否可以放寬對標注質量的要求,使用電影-字幕,歌曲-歌詞等自然帶標注的語音識別數據,從而擴大數據規模呢?本文的思路就是這樣。
本文收集了 68 萬小時的語音識別數據,除了數據的規模大幅上升之外,數據的多樣性也更加豐富。在這 68 萬小時的語音數據中,有 11.7 萬小時涵蓋了除英語外的其他 96 中語言,有 12.5 萬小時是其他語言到英語的翻譯數據。
方法
數據處理
數據部分是本文最核心的貢獻。由于數據夠多,模型夠強,本文模型直接預測原始文本,而不經過任何標準化(standardization)。從而模型的輸出就是最終識別結果,而無需經過反向的文本歸一化(inverse text normalization)后處理。所謂文本歸一化包括如將所有單詞變小寫,所有簡寫展開,所有標點去掉等操作,而反向文本歸一化就是上述操作的反過程。在 Whisper 中,這些操作統統不用,因為數據足夠多,可以覆蓋所有的情況。
在本文收集的語音數據中,包含了不同環境、不同語言、不同說話人等多樣的數據,這有助于訓練出文件的語音識別系統。然而,文本標簽的多樣性對模型的學習是一種阻礙。為了解決這個問題,本文使用了幾種自動過濾方法,來提高文本標簽的質量。
- 首先,收集自互聯網的語音識別數據,很有可能文本標簽就是來自現有的語音識別系統的識別結果。之前有研究工作表明,在訓練數據中混有機器生成的標簽數據會損害模型的性能。為此,本文根據機器識別結果的一些特點,過濾掉了這些數據。
- 另外,本文對數據中語音所屬語言和文本所屬語言進行檢測。如果文本是非英語的其他語言,則要求語音也必須是同種語言;如果文本是英語,則語音可以是任何語言(因為本文方法中有一個其他語言到英語的翻譯任務)。
- 本文用一個語音識別模型在收集的數據上進行測試,發現在一些錯誤率極高的數據中,存在音頻信息不完整、字幕聲音不匹配等低質量數據,這些數據同樣會被過濾掉。
另外,可能在收集的數據中含有標準語音識別數據集中的內容,為了避免對測試結果產生影響,這部分數據同樣需要去掉。
最后,將音頻切分為 30s 的片段,配上對應文本,得到訓練數據。
模型
Whisper 使用的模型改動不大,就是 Transformer 第一次提出時的 encoder-decoder 架構。
Whisper 的輸出側是聲音信號,聲音信號的預處理是將音頻文件重采樣到 16000 Hz,并計算出 80 通道的梅爾頻譜,計算時窗口大小為 25ms,步長為 10ms。然后將數值歸一化到 -1 到 1 之間,作為輸入數據。可以認為是對于每一個時間點,提取了一個 80 維的特征。之前數據處理部分提到每個音頻悲切氛圍 30s 的片段,這里步長為 10,所以每 30 秒有 3000 個時間點。綜上,對于一個 30 秒的音頻數據,我們提取到形狀為 3000x80 的特征。對應到 NLP 中,可以理解為句子長度為 3000,每個詞的詞嵌入維度為 80。
3000x80 的輸入數據首先通過兩個 1D 卷積層,得到 1500x80 的特征。后面的處理就是標準的 Transformer encoder-decoder結構了。將這個特征送入到 Transformer encoder 中,提取處的特征作為交叉注意力輸入送給 decoder。decoder 每次預測下一個 token,其輸入是對應多任務學習的一些預設 token 和 prompt。
多任務
語音識別系統除了識別出語音中的語言文本(轉錄)之外,還需要做一些其他的任務。比如是否有人在說話(voice activity detection, VAD)、誰在說話(speaker diarization),和反向文本歸一化等。通常,在語音識別系統中,這些任務分別由不同的模型來處理,但在本文中,這通通由 Whisper 一個模型完成。多個語音任務由同一個模型完成,有利有弊。好處是 all-in-one 的模型聽起來比較 fancy,比較符合我們對于語音識別系統的期待。壞處是多個任務中如果某幾個性能相對較差,整個模型難以調試。而且,如果需求只是做某一個比較簡單的任務(如 VAD),一般來說一個簡單的模型就可以勝任,但是 Whisper 需要跑起整個大模型。
Whisper 模型共處理四個任務,如圖左上所示。一是給定英文語音,轉錄成英文文本;二是給定其他語言語音,轉錄并翻譯成英文文本;三是給定其他語言語音,轉錄成該語言文本;四是給定只有背景音樂的音頻,識別出無人說話。
所有這些任務都由解碼器預測的 token 序列表示,從而使得一個模型能夠處理多個任務。這幾個任務及模型輸出 token 的關系可以從圖中下方的圖示中的 token 序列看出:在 START OF TRANSCRIPT token 之后,如果當前無人說話,則識別為 NO SPEECH 。如果有人說話,則識別出當前語音所屬的語言 LANGUAGE TAG 。然后有兩種可能的任務 TRANSCRIBE 還是翻譯任務 TRANSLATE ,這兩種任務又分為兩種形式:帶時間戳的和不帶時間戳的,分別穿插或不穿插時間戳 token ,預測出文本 token。最后到達 EOT token,整個流程結束。
實驗(選)
注意 Whisper 是沒有在人工標注的語音識別數據集上訓練的,即 zero-shot 的設定。而對比的方法都是在這些數據集上訓練過的,因此,要達到與它們持平的性能也是不容易的。
語音識別常用的評估指標是詞錯誤率(Word Error Rate, WER)。即預測結果和目標結果的編輯距離除以句長。
由于不同的數據集有不同的標注格式,如大小寫、括號、數字間的逗號等。為了保證公平的對比,在測試 Whisper 性能時會進行手動的 text normalizer,來對齊測試數據集。當然,這在實際使用中是不需要的。
英文語音識別
下圖展示了不同語音識別模型在 LibriSpeech dev-clean 上的性能(橫軸)和在多個數據集上的平均性能(縱軸)。LibriSpeech 是一個比較干凈、比較簡單的數據集,因此相對于其他數據集,各模型在 LibriSpeech 數據集上的性能更好。可以看到,雖然很多有監督方法在該數據集上訓練之后能夠得到很低的錯誤率(~1.6%),但這些模型在多個數據集上測試的平均錯誤率卻非常高(>20%),很可能是這些有監督方法過擬合了 LibriSpeech 數據集。而 Whisper 雖然在 LibriSpeech 上錯誤率沒有特別低,但是在多數據集測試中錯誤率也不錯。這足以說明 Whisper 優秀的泛化性能。
多語言語音識別
下表是各模型在多語言語音識別數據集上的性能。可以看到,在小數據集 MLS 上,Whisper 表現更好;而在更大的 VoxPopuli 上,在訓練集上訓練過的有監督方法性能更好。
下圖是不同語言的語音識別錯誤率隨訓練數據量的變化。可以看到,整體上隨著訓練數據的增多, 錯誤率是會下降的。另外,觀察到在相同訓練數據量的情況下, ZH、KO,即中文、韓文等語言的錯誤率相對較高。這可能有兩個原因,一是東亞語言與世界主流的英語、法語等差別較大,無法從多語言聯合訓練中受益,二是 Whisper 的 tokenizer 對于這類語言也不太友好。
多語言/多任務聯合訓練與僅英語訓練對比
藍線表示全部使用英語數據進行訓練,橙線表示多語言、多任務聯合訓練的結果。可以看到,隨著訓練數據量的增加,多語言、多任務聯合訓練對英語本身的語音識別性能也是有幫助的。
總結
Whisper 通過弱監督預訓練的方式,再加上大規模、多樣性、多語言的訓練數據,不需要自監督(self-supervised)和自訓練(self-training),即可取得很好的性能。并且在處理任何語音識別任務時也不需要微調,可以以 zero-shot 的方式工作,大大提高了語音識別系統的穩健性。
筆者認為,Whisper 的意義在于指明了只要有大規模數據,通過一個簡單的 Transformer encoder–decoder 架構就能訓練出可靠的語音識別模型。并且開源了他們的訓練權重。它的缺點也很明顯,目前 Whisper 對推理基本無優化,Large 模型需要約 10 G 顯存,速度也比較慢。不過在未來,肯定會有一系列工作從算法上或者從工程上來優化 Whisper 的推理部署。