最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

使用 Transformers 為多語種語音識別任務(wù)微調(diào) Whisper 模型

2023-06-27 21:42 作者:HuggingFace  | 我要投稿

本文提供了一個使用 Hugging Face ?? Transformers 在任意多語種語音識別 (ASR) 數(shù)據(jù)集上微調(diào) Whisper 的分步指南。同時,我們還深入解釋了 Whisper 模型、Common Voice 數(shù)據(jù)集以及微調(diào)等理論知識,并提供了數(shù)據(jù)準(zhǔn)備和微調(diào)的相關(guān)代碼。如果你想要一個全部是代碼,僅有少量解釋的 Notebook,可以參閱這個 Google Colab。

目錄

  1. 簡介

  2. 在 Google Colab 中微調(diào) Whisper

    1. 準(zhǔn)備環(huán)境

    2. 加載數(shù)據(jù)集

    3. 準(zhǔn)備特征提取器、分詞器和數(shù)據(jù)

    4. 訓(xùn)練與評估

    5. 構(gòu)建演示應(yīng)用

  3. 結(jié)束語

簡介

Whisper 是一系列用于自動語音識別 (automatic speech recognition,ASR) 的預(yù)訓(xùn)練模型,它由來自于 OpenAI 的 Alec Radford 等人于 2022 年 9 月 發(fā)布。與 WAV2Vec 2.0 等前作不同,以往的模型都是在未標(biāo)注的音頻數(shù)據(jù)上預(yù)訓(xùn)練的,而 Whisper 是在大量的 已標(biāo)注 音頻轉(zhuǎn)錄數(shù)據(jù)上預(yù)訓(xùn)練的。其用于訓(xùn)練的標(biāo)注音頻時長高達(dá) 68 萬小時,比 WAV2Vec 2.0 使用的未標(biāo)注訓(xùn)練數(shù)據(jù) (6 萬小時) 還多一個數(shù)量級。更妙的是,該預(yù)訓(xùn)練數(shù)據(jù)中還含有 11.7 萬小時的多語種數(shù)據(jù)。因此,Whisper 訓(xùn)得的 checkpoint 可應(yīng)用于超過 96 種語言,這其中包含不少 數(shù)據(jù)匱乏 的小語種。

這么多的標(biāo)注數(shù)據(jù)使得我們可以直接在 有監(jiān)督 語音識別任務(wù)上預(yù)訓(xùn)練 Whisper,從標(biāo)注音頻轉(zhuǎn)錄數(shù)據(jù)

中直接習(xí)得語音到文本的映射。因此,Whisper 幾乎不需要額外的微調(diào)就已經(jīng)是高性能的 ASR 模型了。這讓 WAV2Vec 2.0 相形見絀,因為 WAV2Vec 2.0 是在 無監(jiān)督 掩碼預(yù)測任務(wù)上預(yù)訓(xùn)練的,所以其訓(xùn)得的模型僅從未標(biāo)注的純音頻數(shù)據(jù)中習(xí)得了從語音到隱含狀態(tài)的中間映射。雖然無監(jiān)督預(yù)訓(xùn)練能產(chǎn)生高質(zhì)量的語音表征,但它 學(xué)不到語音到文本的映射,要學(xué)到語音到文本的映射只能靠微調(diào)。因此,WAV2Vec 2.0 需要更多的微調(diào)才能獲得較有競爭力的性能。

在 68 萬小時標(biāo)注數(shù)據(jù)的加持下,預(yù)訓(xùn)練 Whisper 模型表現(xiàn)出了強大的泛化到多種數(shù)據(jù)集和領(lǐng)域的能力。其預(yù)訓(xùn)練 checkpoint 表現(xiàn)出了與最先進(jìn)的 ASR 系統(tǒng)旗鼓相當(dāng)?shù)男阅? 在 LibriSpeech ASR 的無噪測試子集上的單詞錯誤率 (word error rate,WER) 僅為約 3%,另外它還在 TED-LIUM 上創(chuàng)下了新的記錄 - 4.7% 的 WER ( 詳見 Whisper 論文 的表 8)。Whisper 在預(yù)訓(xùn)練期間獲得的廣泛的多語種 ASR 知識對一些數(shù)據(jù)匱乏的小語種特別有用。稍稍微調(diào)一下,預(yù)訓(xùn)練 checkpoint 就可以進(jìn)一步適配特定的數(shù)據(jù)集和語種,從而進(jìn)一步改進(jìn)在這些語種上的識別效果。

Whisper 是一個基于 transformer 的編碼器 - 解碼器模型 (也稱為 序列到序列 模型),它將音頻的頻譜圖特征 序列 映射到文本的詞 _序列_。首先,通過特征提取器將原始音頻輸入變換為對數(shù)梅爾聲譜圖 (log-Mel spectrogram)。然后,transformer 編碼器對聲譜圖進(jìn)行編碼,生成一系列編碼器隱含狀態(tài)。最后,解碼器基于先前輸出的詞以及編碼器隱含狀態(tài),自回歸地預(yù)測下一個輸出詞。圖 1 是 Whisper 模型的示意圖。

圖 1: Whisper 模型,該模型是標(biāo)準(zhǔn)的基于 transformer 的編碼器-解碼器架構(gòu)。首先將對數(shù)梅爾聲譜圖輸入到編碼器,然后將編碼器生成的最終隱含狀態(tài)通過交叉注意機制輸入給解碼器。最后,解碼器基于編碼器隱含狀態(tài)和先前的輸出詞,自回歸地預(yù)測下一個輸出詞。圖源: OpenAI Whisper 博客。

在序列到序列模型中,編碼器負(fù)責(zé)從語音中提取出重要特征,將輸入轉(zhuǎn)換為一組隱含狀態(tài)表征。解碼器扮演語言模型的角色,處理隱含狀態(tài)表征并生成對應(yīng)的文本。我們把在模型架構(gòu) 內(nèi)部 集成語言模型的做法稱為 _深度融合_。與之相對的是 _淺融合_,此時,語言模型在 外部與編碼器組合,如 CTC +

-gram ( 詳見 Internal Language Model Estimation 一文)。通過深度融合,可以用同一份訓(xùn)練數(shù)據(jù)和損失函數(shù)對整個系統(tǒng)進(jìn)行端到端訓(xùn)練,從而獲得更大的靈活性和更優(yōu)越的性能 ( 詳見 ESB Benchmark)。

Whisper 使用交叉熵目標(biāo)函數(shù)進(jìn)行預(yù)訓(xùn)練和微調(diào),交叉熵目標(biāo)函數(shù)是訓(xùn)練序列標(biāo)注模型的標(biāo)準(zhǔn)目標(biāo)函數(shù)。經(jīng)過訓(xùn)練,模型可以正確地對目標(biāo)詞進(jìn)行分類,從而從預(yù)定義的詞匯表中選出輸出詞。

Whisper 有五種不同尺寸的 checkpoint。其中,四個小尺寸 checkpoint 又各有兩個版本: 英語版和多語種版,而最大的 checkpoint 只有多語種版。所有九個預(yù)訓(xùn)練 checkpoints 都可以在 Hugging Face Hub 上找到。下表總結(jié)了這些 checkpoint 的信息及其 Hub 鏈接:

下面,我們將以多語種版的 smallcheckpoint (參數(shù)量 244M (~= 1GB)) 為例,帶大家走一遍微調(diào)模型的全過程。我們將使用 Common Voice 數(shù)據(jù)集里的小語種數(shù)據(jù)來訓(xùn)練和評估我們的系統(tǒng)。通過這個例子,我們將證明,僅需 8 小時的訓(xùn)練數(shù)據(jù)就可以微調(diào)出一個在該語種上表現(xiàn)強大的語音識別模型。

Whisper 的名稱來自于 “Web-scale Supervised Pre-training for Speech Recognition (網(wǎng)絡(luò)規(guī)模的有監(jiān)督語音識別預(yù)訓(xùn)練模型)” 的首字母縮寫 “WSPSR”。

在 Google Colab 中微調(diào) Whisper

準(zhǔn)備環(huán)境

在微調(diào) Whisper 模型時,我們會用到幾個流行的 Python 包。我們使用 datasets 來下載和準(zhǔn)備訓(xùn)練數(shù)據(jù),使用 transformers 來加載和訓(xùn)練 Whisper 模型。另外,我們還需要 soundfile 包來預(yù)處理音頻文件,evaluatejiwer 來評估模型的性能。最后,我們用 gradio 來為微調(diào)后的模型構(gòu)建一個亮閃閃的演示應(yīng)用。

我們強烈建議你直接將訓(xùn)得的模型 checkpoint 上傳到 Hugging Face Hub。Hub 提供了以下功能:

  • 集成版本控制: 確保在訓(xùn)練期間不會丟失任何模型 checkpoint。

  • Tensorboard 日志: 跟蹤訓(xùn)練過程中的重要指標(biāo)。

  • 模型卡: 記錄模型的用法及其應(yīng)用場景。

  • 社區(qū): 輕松與社區(qū)進(jìn)行分享和協(xié)作!

將 Python notebook 連上 Hub 非常簡單 - 只需根據(jù)提示輸入你的 Hub 身份驗證令牌即可。你可以在 此處 找到你自己的 Hub 身份驗證令牌:

打印輸出:

Login?successful
Your?token?has?been?saved?to?/root/.huggingface/token

加載數(shù)據(jù)集

Common Voice 由一系列眾包數(shù)據(jù)集組成,其中包含了用各種語言錄制的維基百科文本。本文使用的是最新版本的 Common Voice 數(shù)據(jù)集 (版本號為 11)。語種上,我們選擇用 印地語 來微調(diào)我們的模型。印地語是一種在印度北部、中部、東部和西部使用的印度 - 雅利安語。Common Voice 11.0 中有大約 12 小時的標(biāo)注印地語數(shù)據(jù),其中 4 小時是測試數(shù)據(jù)。

我們先看下 Hub 上的 Common Voice 數(shù)據(jù)集頁面: mozilla-foundation/common_voice_11_0。如果你是首次查看此頁面,系統(tǒng)會要求你接受其使用條款,同意后就可以訪問數(shù)據(jù)集了。

一旦身份驗證成功,你就會看到數(shù)據(jù)集預(yù)覽。數(shù)據(jù)集預(yù)覽展示了數(shù)據(jù)集的前 100 個樣本。更重要的是,它還加載了可供實時收聽的音頻。我們可以在下拉菜單選擇 hi 來選擇 Common Voice 的印地語子集 ( hi 是印地語的語言標(biāo)識符代碼):

點擊第一個音頻的播放按鈕,你就可以收聽音頻并看到相應(yīng)的文本了。你還可以滾動瀏覽訓(xùn)練集和測試集中的樣本,以更好地了解待處理音頻和文本數(shù)據(jù)。從語調(diào)和風(fēng)格可以看出,這些音頻是旁白錄音。你可能還會注意到錄音者和錄音質(zhì)量的巨大差異,這是眾包數(shù)據(jù)的一個共同特征。

使用 ?? Datasets 來下載和準(zhǔn)備數(shù)據(jù)非常簡單。僅需一行代碼即可完成 Common Voice 數(shù)據(jù)集的下載和準(zhǔn)備工作。由于印地語數(shù)據(jù)非常匱乏,我們把 訓(xùn)練集驗證集合并成約 8 小時的訓(xùn)練數(shù)據(jù),而測試則基于 4 小時的 測試集:

打印輸出:

大多數(shù) ASR 數(shù)據(jù)集僅包含輸入音頻樣本 ( audio) 和相應(yīng)的轉(zhuǎn)錄文本 ( sentence)。 Common Voice 還包含額外的元信息,例如 accent 和 ?locale,在 ASR 場景中,我們可以忽略這些信息。為了使代碼盡可能通用,我們只考慮基于輸入音頻和轉(zhuǎn)錄文本進(jìn)行微調(diào),而不使用額外的元信息:

除了 Common Voice,Hub 上還有不少其他多語種 ASR 數(shù)據(jù)集可供使用,你可以點擊鏈接: Hub 上的 ASR 數(shù)據(jù)集 了解更多。

準(zhǔn)備特征提取器、分詞器和數(shù)據(jù)

ASR 的流水線主要包含三個模塊:

  1. 對原始音頻輸入進(jìn)行預(yù)處理的特征提取器

  2. 執(zhí)行序列到序列映射的模型

  3. 將模型輸出轉(zhuǎn)換為文本的分詞器

在 ?? Transformers 中,Whisper 模型有自己的特征提取器和分詞器,即 WhisperFeatureExtractor 和 WhisperTokenizer。

下面,我們逐一詳細(xì)介紹特征提取器和分詞器!

加載 WhisperFeatureExtractor

語音可表示為隨時間變化的一維數(shù)組,給定時刻的數(shù)組值即表示信號在該時刻的 _幅度_,而我們可以僅從幅度信息重建音頻的頻譜并恢復(fù)其所有聲學(xué)特征。

由于語音是連續(xù)的,因此它包含無數(shù)個幅度值,而計算機只能表示并存儲有限個值。因此,我們需要通過對語音信號進(jìn)行離散化,即以固定的時間間隔對連續(xù)信號進(jìn)行 _采樣_。我們將每秒采樣的次數(shù)稱為 _采樣率_,通常以樣本數(shù)/秒或 赫茲 (Hz) 為單位。高采樣率可以更好地逼近連續(xù)語音信號,但同時每秒所需的存儲量也更大。

需要特別注意的是,輸入音頻的采樣率需要與模型期望的采樣率相匹配,因為不同采樣率的音頻信號的分布是不同的。處理音頻時,需要使用正確的采樣率,否則可能會引起意想不到的結(jié)果!例如,以 16kHz 的采樣率采集音頻但以 8kHz 的采樣率收聽它,會使音頻聽起來好像是半速的。同樣地,向一個需要某一采樣率的 ASR 模型饋送一個錯誤采樣率的音頻也會影響模型的性能。Whisper 特征提取器需要采樣率為 16kHz 的音頻輸入,因此輸入的采樣率要與之相匹配。我們不想無意中用慢速語音來訓(xùn)練 ASR!

Whisper 特征提取器執(zhí)行兩個操作。首先,填充或截斷一批音頻樣本,將所有樣本的輸入長度統(tǒng)一至 30 秒。通過在序列末尾添加零 (音頻信號中的零對應(yīng)于無信號或靜音),將短于 30 秒的樣本填充到 30 秒。而對超過 30 秒的樣本,直接截斷為 30 秒就好了。由于這一批數(shù)據(jù)中的所有樣本都被填充或截斷到統(tǒng)一長度 (即 30 s) 了,因此將音頻饋送給 Whisper 模型時就不需要注意力掩碼了。這是 Whisper 的獨門特性,其他大多數(shù)音頻模型都需要用戶提供一個注意力掩碼,詳細(xì)說明填充位置,這樣模型才能在自注意力機制中忽略填充部分。經(jīng)過訓(xùn)練的 Whisper 模型可以直接從語音信號中推斷出應(yīng)該忽略哪些部分,因此無需注意力掩碼。

Whisper 特征提取器執(zhí)行的第二個操作是將第一步所得的音頻變換為對數(shù)梅爾聲譜圖。這些頻譜圖是信號頻率的直觀表示,類似于傅里葉變換。圖 2 展示了一個聲譜圖的例子,其中

軸表示梅爾頻段 (Mel channel),對應(yīng)于特定的頻段,

軸表示時間,顏色對應(yīng)于給定時刻該頻段的對數(shù)強度。Whisper 模型要求輸入為對數(shù)梅爾聲譜圖。

梅爾頻段是語音處理的標(biāo)準(zhǔn)方法,研究人員用它來近似表示人類的聽覺范圍。對于 Whisper 微調(diào)這個任務(wù)而言,我們只需要知道聲譜圖是語音信號中頻率的直觀表示。更多有關(guān)梅爾頻段的詳細(xì)信息,請參閱 梅爾倒譜 一文。

圖 2: 將音頻信號變換為對數(shù)梅爾聲譜圖。左圖:一維音頻離散信號。右圖:對應(yīng)的對數(shù)梅爾聲譜圖。圖源:谷歌 SpecAugment 博文.

幸運的是,?? Transformers Whisper 特征提取器僅用一行代碼即可執(zhí)行填充和聲譜圖變換兩個操作!我們使用以下代碼從預(yù)訓(xùn)練的 checkpoint 中加載特征提取器,為音頻數(shù)據(jù)處理做好準(zhǔn)備:

加載 WhisperTokenizer

現(xiàn)在我們加載 Whisper 分詞器。Whisper 模型會輸出詞元,這些詞元表示預(yù)測文本在詞典中的索引。分詞器負(fù)責(zé)將這一系列詞元映射為最終的文本字符串 (例如 [1169, 3797, 3332] -> “the cat sat”)。

過去,當(dāng)使用編碼器模型進(jìn)行 ASR 時,我們需使用 連接時序分類法 (Connectionist Temporal Classification,CTC) ?進(jìn)行解碼。在使用 CTC 進(jìn)行解碼時,我們需要為每個數(shù)據(jù)集訓(xùn)練一個 CTC 分詞器。但使用編碼器 - 解碼器架構(gòu)的一個優(yōu)勢是我們可以直接使用預(yù)訓(xùn)練模型的分詞器。

Whisper 分詞器在 96 種語種數(shù)據(jù)上預(yù)訓(xùn)練而得,因此,其 字節(jié)對 (byte-pair) ?覆蓋面很廣,幾乎包含了所有語種。就印地語而言,我們可以加載分詞器并將其直接用于微調(diào)。僅需指定一下目標(biāo)語種和任務(wù),分詞器就會根據(jù)這些參數(shù)將語種和任務(wù)標(biāo)記添加為輸出序列的前綴:

我們可以通過對 Common Voice 數(shù)據(jù)集的第一個樣本進(jìn)行編解碼來驗證分詞器是否正確編碼了印地語字符。在對轉(zhuǎn)錄文本進(jìn)行編碼時,分詞器在序列的開頭和結(jié)尾添加“特殊標(biāo)記”,其中包括文本的開始/結(jié)尾、語種標(biāo)記和任務(wù)標(biāo)記 (由上一步中的參數(shù)指定)。在解碼時,我們可以選擇“跳過”這些特殊標(biāo)記,從而保證輸出是純文本形式的:

打印輸出:


組裝一個 WhisperProcessor

為了簡化使用,我們可以將特征提取器和分詞器 包進(jìn) 到一個 WhisperProcessor 類,該類繼承自 WhisperFeatureExtractor 及 ?WhisperTokenizer,可根據(jù)需要用于音頻處理和模型預(yù)測。有了它,我們在訓(xùn)練期間只需要保留兩個對象: processormodel 就好了。

準(zhǔn)備數(shù)據(jù)

我們把 Common Voice 數(shù)據(jù)集的第一個樣本打印出來,看看數(shù)據(jù)長什么樣:

打印輸出:?

可以看到,樣本含有一個一維音頻數(shù)組及其對應(yīng)的轉(zhuǎn)錄文本。上文已經(jīng)多次談及采樣率,以及將音頻的采樣率與 Whisper 模型所需的采樣率 (16kHz) 相匹配的重要性。由于現(xiàn)在輸入音頻的采樣率為 48kHz,所以在將其饋送給 Whisper 特征提取器之前,我們需要將其 _下采樣_至 16kHz。

我們將使用 datasetcast_column 方法將輸入音頻轉(zhuǎn)換至所需的采樣率。該方法僅指示 datasets 讓其在首次加載音頻時 _即時地_對數(shù)據(jù)進(jìn)行重采樣,因此并不會改變原音頻數(shù)據(jù):

重新打印下 Common Voice 數(shù)據(jù)集中的第一個音頻樣本,可以看到其已被重采樣:

打印輸出:

酷!我們可以看到音頻已被下采樣到 16kHz 了。數(shù)組里面的值也變了,現(xiàn)在的 1 個幅度值大致對應(yīng)于之前的 3 個幅度值。

現(xiàn)在我們編寫一個函數(shù)來為模型準(zhǔn)備數(shù)據(jù):

  1. 調(diào)用 batch["audio"] 加載和重采樣音頻數(shù)據(jù)。如上所述,?? Datasets 會即時執(zhí)行任何必要的重采樣操作。

  2. 使用特征提取器將一維音頻數(shù)組變換為對數(shù)梅爾聲譜圖特征。

  3. 使用分詞器將錄音文本編碼為 ID。

我們可以用 dataset.map 方法在所有訓(xùn)練樣本上應(yīng)用上述函數(shù):

好了!訓(xùn)練數(shù)據(jù)準(zhǔn)備完畢!我們繼續(xù)看看如何使用這些數(shù)據(jù)來微調(diào) Whisper。

注意: 目前 datasets 主要使用 torchaudio 和 [librosa](https://librosa.org /doc/latest/index.html) 來進(jìn)行音頻加載和重采樣。如果你自己定制一個數(shù)據(jù)加載/采樣函數(shù)的話,你完全可以直接通過 "path" 列獲取音頻文件路徑而不用管 "audio" 列。

訓(xùn)練與評估

至此,數(shù)據(jù)已準(zhǔn)備完畢,可以開始訓(xùn)練了。訓(xùn)練的大部分繁重的工作都會由 ?? Trainer 來完成。我們要做的主要有:

  • 定義數(shù)據(jù)整理器 (data collator): 數(shù)據(jù)整理器獲取預(yù)處理后的數(shù)據(jù)并將其轉(zhuǎn)換為 PyTorch 張量。

  • 評估指標(biāo): 我們使用 單詞錯誤率 (word error rate,WER) 指標(biāo)來評估模型,因此需要定義一個 compute_metrics 函數(shù)來計算它。

  • 加載預(yù)訓(xùn)練 checkpoint: 我們需要加載預(yù)訓(xùn)練 checkpoint 并正確配置它以進(jìn)行訓(xùn)練。

  • 定義訓(xùn)練參數(shù): ?? Trainer 在制訂訓(xùn)練計劃時需要用到這些參數(shù)。

微調(diào)完后,我們需要使用測試數(shù)據(jù)對其進(jìn)行評估,以驗證最終模型在印地語上的語音識別效果。

定義數(shù)據(jù)整理器

序列到序列語音模型的數(shù)據(jù)整理器與其他任務(wù)有所不同,因為 input_featureslabels 的處理方法是不同的: input_features 必須由特征提取器處理,而 labels 由分詞器處理。

input_features 已經(jīng)填充至 30s 并轉(zhuǎn)換為固定維度的對數(shù)梅爾聲譜圖,我們所要做的只剩將其轉(zhuǎn)換為 PyTorch 張量。我們用特征提取器的 .pad 方法來完成這一功能,且將其入?yún)⒃O(shè)為 return_tensors=pt。請注意,這里不需要額外的填充,因為輸入維度已經(jīng)固定了,所以我們只需要簡單地將 input_features 轉(zhuǎn)換為 PyTorch 張量就好了。

另一方面,labels 數(shù)據(jù)之前并未填充。所以,我們首先要使用分詞器的 .pad 方法將序列填充至本 batch 的最大長度。然后將填充標(biāo)記替換為 -100,這樣它們就可以 用參與損失的計算了。然后我們把 SOT 從序列的開頭去掉,稍后訓(xùn)練的時候我們再把它加回來。

我們可以利用之前定義的 WhisperProcessor 來執(zhí)行特征提取和分詞操作:

我們初始化一下剛剛定義的數(shù)據(jù)整理器:

評估指標(biāo)

接下來要定義評估指標(biāo)。我們將使用詞錯誤率 (WER) 指標(biāo),它是評估 ASR 系統(tǒng)的“標(biāo)準(zhǔn)”指標(biāo)。有關(guān)其詳細(xì)信息,請參閱 WER 文檔。下面,我們從 ?? Evaluate 中加載 WER 指標(biāo):?

然后我們只需要定義一個函數(shù)來接受模型輸出并返回 WER 指標(biāo)。這個名為 compute_metrics 的函數(shù)首先將 -100 替換為 label_ids 中的 pad_token_id (以便在計算損失時將其忽略)。然后,將預(yù)測到的 ID 和 label_ids 解碼為字符串文本。最后,計算輸出文本和真實文本之間的 WER:?

加載預(yù)訓(xùn)練 checkpoint

現(xiàn)在我們加載預(yù)訓(xùn)練 Whisper small 模型的 checkpoint。同樣,可以通過使用 ?? transformers 很輕松地完成這一步!

原始 Whisper 模型在自回歸生成開始之前強制添加了若干前綴詞元 ID (forced_decoder_ids)。這些詞元 ID 主要用于在零樣本 ASR 任務(wù)中標(biāo)識語種和任務(wù)。因為我們現(xiàn)在是對已知語種 (印地語) 和任務(wù) (轉(zhuǎn)錄) 進(jìn)行微調(diào),所以我們要將 forced_decoder_ids 設(shè)置為 None。另外,模型還抑制了一些詞元 (suppress_tokens),這些詞元的對數(shù)概率被強置為 -inf,以保證它們永遠(yuǎn)不會被采樣到。我們會用一個空列表覆蓋 suppress_tokens,即我們不抑制任何詞元:

定義訓(xùn)練參數(shù)

最后一步是定義與訓(xùn)練相關(guān)的所有參數(shù),下面對其中一部分參數(shù)進(jìn)行了解釋:

  • output_dir: 保存模型權(quán)重的本地目錄,它也會是 Hugging Face Hub 上的模型存儲庫名稱。

  • generation_max_length: 評估階段,自回歸生成的最大詞元數(shù)。

  • save_steps: 訓(xùn)練期間,每 save_steps 步保存一次中間 checkpoint 并異步上傳到 Hub。

  • eval_steps: 訓(xùn)練期間,每 eval_steps 步對中間 checkpoint 進(jìn)行一次評估。

  • report_to: 訓(xùn)練日志的保存位置,支持 azure_ml 、comet_ml 、mlflow 、neptune 、tensorboard 以及 wandb 這些平臺。你可以按照自己的偏好進(jìn)行選擇,也可以直接使用缺省的 tensorboard 保存至 Hub。

如需更多其他訓(xùn)練參數(shù)的詳細(xì)信息,請參閱 Seq2SeqTrainingArguments 文檔。

注意: 如果不想將模型 checkpoint 上傳到 Hub,你需要設(shè)置 push_to_hub=False。

我們可以將訓(xùn)練參數(shù)以及模型、數(shù)據(jù)集、數(shù)據(jù)整理器和 compute_metrics 函數(shù)一起傳給 ?? Trainer:

有了這些,就可以開始訓(xùn)練了!

訓(xùn)練

要啟動訓(xùn)練,只需執(zhí)行:

訓(xùn)練大約需要 5-10 個小時,具體取決于你的 GPU 或 Google Colab 后端的 GPU。根據(jù) GPU 的情況,你可能會在開始訓(xùn)練時遇到 CUDA 內(nèi)存耗盡錯誤。此時,你可以將 per_device_train_batch_size 逐次減少 2 倍,同時增加 gradient_accumulation_steps 進(jìn)行補償。

打印輸出:

最佳 WER 是 32.0% —— 對 8 小時的訓(xùn)練數(shù)據(jù)來說還不錯!那與其他 ASR 系統(tǒng)相比,這個表現(xiàn)到底處于什么水平?為此,我們可以查看 hf-speech-bench,這是一個按語種和數(shù)據(jù)集對模型分別進(jìn)行 WER 排名的排行榜。

微調(diào)后的模型顯著提高了 Whisper small checkpoint 的零樣本性能,也突出展示了 Whisper 強大的遷移學(xué)習(xí)能力。

當(dāng)將訓(xùn)練結(jié)果推送到 Hub 時,只需配置適當(dāng)?shù)年P(guān)鍵字參數(shù) (key-word arguments,kwargs) 就可以自動將 checkpoint 提交到排行榜。如需適配自己的數(shù)據(jù)集、語種和模型名稱,僅需對下述代碼作出相應(yīng)的修改即可:

現(xiàn)在,只需執(zhí)行 push_to_hub 命令就可以將訓(xùn)練結(jié)果上傳到 Hub 了:

任何人可以用你的模型的 Hub 鏈接訪問它。他們還可以使用標(biāo)識符 "your-username/the-name-you-picked"加載它,例如:?

雖然微調(diào)后的模型在 Common Voice Hindi 測試數(shù)據(jù)上的效果還不錯,但其效果遠(yuǎn)算不上最優(yōu)。本文的目的僅為演示如何在任意多語種 ASR 數(shù)據(jù)集上微調(diào)預(yù)訓(xùn)練的 Whisper checkpoint,對效果并未做太多深究。如需提升效果,你還可以嘗試更多技巧,如優(yōu)化訓(xùn)練超參 (例如 learning rate 和 dropout) 、使用更大的預(yù)訓(xùn)練 checkpoint ( medium 或 ?large) 等。

構(gòu)建演示應(yīng)用

現(xiàn)在模型已經(jīng)微調(diào)結(jié)束,我們開始構(gòu)建一個演示應(yīng)用來展示其 ASR 功能!我們將使用 ?? Transformers pipeline 來完成整個 ASR 流水線: 從對音頻輸入進(jìn)行預(yù)處理一直到對模型輸出進(jìn)行解碼。我們使用 Gradio 來構(gòu)建我們的交互式演示。 Gradio 提供了最直截了當(dāng)?shù)臉?gòu)建機器學(xué)習(xí)演示應(yīng)用的方法,我們可以用它在幾分鐘內(nèi)構(gòu)建一個演示應(yīng)用!

運行以下代碼會生成一個 Gradio 演示應(yīng)用,它用計算機的麥克風(fēng)錄制語音并將其饋送給微調(diào)后的 Whisper 模型以轉(zhuǎn)錄出相應(yīng)的文本:

結(jié)束語

通過本文,我們介紹了如何使用 ?? Datasets、Transformers 和 Hugging Face Hub 一步步為多語種 ASR 微調(diào)一個 Whisper 模型。如果你想自己嘗試微調(diào)一個,請參閱 Google Colab。如果你有興趣針對英語和多語種 ASR 微調(diào)一個其它的 Transformers 模型,請務(wù)必參考下 examples/pytorch/speech-recognition。

英文原文: https://hf.co/blog/fine-tune-whisper

原文作者: Sanchit Gandhi

譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向為 transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理。

審校/排版: zhongdongy (阿東)


使用 Transformers 為多語種語音識別任務(wù)微調(diào) Whisper 模型的評論 (共 條)

分享到微博請遵守國家法律
洛川县| 桂平市| 怀来县| 台北市| 金昌市| 桐城市| 株洲县| 广西| 常宁市| 石楼县| 琼海市| 汽车| 招远市| 丘北县| 龙口市| 栾城县| 长泰县| 灵石县| 兰溪市| 仁寿县| 惠州市| 香河县| 蓝山县| 台州市| 贵阳市| 肥乡县| 东乌| 梁平县| 安图县| 商水县| 三河市| 射阳县| 绩溪县| 株洲市| 宁化县| 高雄市| 道孚县| 丰镇市| 突泉县| 鄯善县| 太仆寺旗|