ASR Model Training

Moris
NLP & Speech Recognition Note
19 min readFeb 27, 2024

--

現在,我們來到訓練ASR的最後一部分。在這篇文章中,我們將深入瞭解如何訓練ASR的模型。然而,當思想從研究轉向部署時,預期訓練將非常複雜。為了推動極限,許多啟發式方法,包括試驗和錯誤,都被使用。說訓練是一個大駭客可能並不誇張。訓練商業LVCSR所需的資源巨大。細節繁瑣。許多領域知識,如訓練的長度,被當作商業秘密保留。在討論ASR訓練時,我們將著重於關鍵方面,而不是工程螺栓和堅果。但即使對此,還有很多地方需要涵蓋。由於這是本系列的最後一個主題,讓我們先快速回顧我們學到的東西。

Recap (optional)

我們的ASR目標是根據聲學觀察、聲學、發音詞典和語言模型,找出最可能的單詞序列W*。

第一步是使用滑動窗口從音頻幀中提取特徵。

Diagram on the top left

每個音頻幀將包含39個MFCC特徵。這構成了我們觀察的X(幀:x₁, x₂, x₃,…, xᵢ , …)序列。

提取的特徵包括用於識別語音的共振峰的信息,以及理解其上下文的一階和二階導數。

Modified from source

我們的任務是從觀察到的特徵向量X反向工程內部狀態序列(s₁, s₂, s₃, …)。

關鍵思想是找到一個狀態序列(一條路徑),該序列最大化了觀察的可能性。

上述R.H.S.包含了路徑的概率和給定內部狀態的觀察可能性。讓我們更仔細地看看第二部分。每個單詞將由發音詞典和HMM建模。狀態的自我循環允許ASR處理話語中不同的音長。給定狀態的觀察可能性將由m組件GMM建模。

逐個搜索這樣的序列,即使是在有限的序列長度T下,也很困難。對於詞彙表大小為k,複雜度是O(kᵀ),並隨著音頻框架的數量呈指數級增長。

幸運的是,Viterbi解碼可以遞歸地解決問題。對於每個時間步,Viterbi解碼使用上一時間步的結果計算節點的最大路徑。因此,我們可以在O(k²T)中搜索確定的最大路徑。

然而,為了提高ASR的準確性,我們還需要標記電話的上下文。不幸的是,這使得內部狀態增加到3 × 5⁰³個狀態,如果我們從3 × 50個內部電話狀態開始。為了解決這個問題,一些具有類似發聲的標籤將共享相同的聲學模型(GMM模型)。下面的圖示展示了從每個無關上下文的電話有3個狀態到每個音響三音節有3個狀態使用GMM的過程。

Source

我們可以透過在弧線上寫出輸出(發射)來簡化我們的隱馬可夫模型(HMM)拓撲圖。以下代表了包含2個音節 /T/ 和 /UW/的單詞“two”,每個音節由三個狀態模型化。

為了處理語音中的沉默、噪音和填充暫停,我們還引入了SIL音素。

Source

一旦我們為一個單詞構建了HMM模型(下面的左圖),我們可以連接並迴圈它們以處理連續語音。現在,我們可以再次使用新的圖來進行維特比解碼以處理連續語音。

為了提高自動語音識別(ASR)的準確性,我們可以使用語言模型來計算單詞之間的轉移概率。在下面的模型中,我們將語言模型簡化為二元模型。

Source

在二元模型(2-gram)中,下一個單詞只取決於前一個單詞。

我們可以將語言模型擴展為n元模型。以下是bigram模型和trigram模型的狀態圖和轉換。

這是帶有trigram語言模型的可視化。

最後,我們引入了加權有限狀態轉換器(WFST)的概念,用於分別模型化HMM三音節模型、發音詞典和語言模型。

Source

透過引入以下的四個轉換器:

我們設法將音頻解碼為單詞序列。

但是為了提高效率,我們將一起組成轉換器。

並優化並預先編譯它們以進行解碼。

下圖是ASR解碼的概念流程。

如果你對這個概述沒有一絲線索,你可能需要從這個系列的開始閱讀。到目前為止的描述都是為了解碼。在訓練ASR時,我們專注於使用由訓練數據集提取的特徵學習HMM模型。詞典模型和語言模型已經在之前討論過,並且不太難學。所以我們不會進一步詳述。

ASR訓練的主要焦點是開發用於三音節(上下文相關的音節)的聲學模型。

ASR

單個數字的ASR模型非常簡單。以下是數字“six”的HMM拓撲圖。

Source (the word “six”)

我們可以連接所有數字的HMM模型以形成識別數字的ASR。

接下來,我們問訓練大詞彙連續語音識別器(LVCSR)有多難。以下是識別連續語音的HMM。拓撲是HMM模型的簡單連接。基本組件與單詞識別器相同。

但是,當我們將語言模型添加到LVCSR(右圖)時,圖可能會變得瘋狂複雜。

但是,多虧了WFST,我們可以將它們組成為單獨的模型。語言模型與使用簡單出現計數的語料庫單獨模型化。組成所有模型一起(H ◦ C ◦ LG )是繁瑣的,但是我們將讓OpenFST之類的庫來做髒活。但是,LVCSR在訓練中有以下幾個新的挑戰。

  • 發音對單詞內和單詞之間的相鄰音節(上下文)敏感。
  • HMM狀態和音頻幀之間的對齊對於連續語音來說更難。
  • 大詞彙觸發了需要跟蹤的大量狀態。

為了提高準確性,大詞彙連續語音識別(LVCSR)需要一個複雜的聲學模型和更多的HMM狀態來模擬問題。目前,第一個問題將由GMM來解決,而第二個問題將通過三音素來考慮音素上下文。基本HMM拓撲結構與單詞識別器相同,許多訓練概念可以被重複使用。但是有一些重要的例外。首先,每個HMM狀態的聲學模型更加複雜。這在訓練中帶來了一個主要的問題。隨著複雜度的增加,可能會陷入不良的局部最優解。像其他複雜的機器學習模型一樣,我們需要一個好的策略來學習它。其次,我們需要更頻繁地執行對齊。第三,由於潛在的聲學模型數量非常龐大,相似聲音的HMM狀態需要共享相同的聲學模型。我們將訓練一個決策樹來將哪些三音素分為同一模型進行聚類。接下來,我們將討論一些關鍵概念,然後詳細介紹訓練步驟。

Training strategy

羅馬非一日造成。訓練商業品質的 ASR 需要好幾週的時間,必須使用一群機器。訓練任何複雜的機器學習(ML)和深度學習(DL)模型需要時間和耐心。我們希望訓練能提供最佳解。ASR 是以階段(多次傳遞)的方式來訓練模型。在許多優化問題中,我們會以初始猜測的方式來數值地解決問題。如果目標函數是凹函數,我們可以保證解是全域最優解。

如果不是,我們可能只能達到局部最優。

在 ASR 中,HMM 中隱藏狀態的存在使局部最優問題更加問題重重。但是,如果聲學模型足夠簡單,相應的成本函數可能會變得平滑得多,全域最優更為優勢。也就是說,找到它並不難。(注意:這是一個普遍的假設或信念。)

但是這個模型偏見很大。我們需要做得更好,使其更為複雜。由於 HMM 拓樸結構保持不變,如果下一個聲學模型是我們已經訓練的超集,我們可以用舊模型的參數來初始化新模型。這為我們提供了下一階段訓練的先機。更重要的是,這可能幫助我們遠離令人討厭的局部最優。如果我們從隨機猜測開始,我們可能會陷入一個可怕的局部最優。

在 ASR 中,我們從較簡單的上下文獨立(CI)電話模型開始訓練。並且 HMM 中的每個發射(輸出)首先用單一高斯(1-component GMM)來模擬。

我們將高斯的平均值和方差初始化為 0 和 1。即使有這種天真的猜測,也可以使用訓練數據集建立一個合理的模型。對於這種模型來說,接近全域最優並不難。一旦模型被訓練,我們將它們用來初始化更複雜的 GMM 模型的參數。比如說,我們從 1-component GMM 轉移到 2-component GMM,然後在每次傳遞中將組件數量加倍。我們會逐步進行,以確保我們不會過早行動。

一旦我們建立了一個上下文獨立的 CI 模型,我們就可以通過將 CI GMM 參數複製到新的 CD GMM 模型,從 CI 訓練切換到上下文相關(CD)訓練。然後,我們開始用三音標記 HMM 狀態。這種策略使我們能夠逐漸建立起更複雜的隱藏狀態和聲學模型。

Forced alignment

聲學模型被定義為 P(x | HMM 狀態),其中 x 是音頻幀中觀察到的特徵。

許多訓練語料庫都是音位轉寫的,並且每個音素的 HMM 拓樸結構是手動定義的。在下面的設計中,每個音素被細分為三個 HMM 隱藏狀態。

一個 HMM 狀態可以跨越多個幀。自循環結構模擬了語句中 HMM 狀態的不同持續時間。這提供了一個靈活的模型來適應講話者和講話速度的變異。

強制對齊確定了對應於音頻幀的 HMM 狀態。

詞稿與音素時間對齊。所以我們仍然需要將音頻幀進一步對齊與 HMM 狀態。我們將以程式化的方式進行。

此外,對於 LVCSR,音素對齊可能並不完美。另外,電話之間可能會有沉默或噪聲。我們需要使用觀察到的音頻幀進行進一步的對齊。

這項對齊任務找到了與觀察值相對應的最可能的 HMM 狀態序列。這並不容易,因為我們還不知道 HMM 模型參數。

Forward-backward algorithm (FB)

幸運的是,我們已經學過一種機器學習算法來解決這個問題。那就是隱馬爾科夫模型(HMM)中的Forward-backward(FB)算法。快速回顧一下,使用HMM模型,我們應用前向算法來學習在給定所有迄今為止觀察到的觀察值情況下,時間t處的隱狀態的分佈α。我們反轉方向進行後向算法,找出給定我們應該看到的觀察值情況下,時間t處的隱狀態的分佈β

從前向和後向概率αβ,我們計算狀態佔有概率(γ)和轉移(ξ)以最大化給定觀察值的可能性。這些值將被用來重新精煉HMM模型。我們不斷迭代。γξ的估計將通過與觀察到的音頻幀對齊更好的HMM模型而得到改善。更好的γξ產生更好的HMM模型。

FB隱含的對齊也將在每次迭代中得到改善。

在過程結束時,語料庫中的每個音頻幀將與一個HMM狀態相關聯。

Modified from source

我們將它們組合在一起,以估計給定狀態P(x | HMM狀態)的特徵分佈 — 聲學模型。然而,這種解釋並不完全正確。FB是一種使用軟指派的EM算法。它計算在時間t處有HMM狀態與觀察到的音頻特徵的機會。所描述的是一個硬指派,它只將一個音頻幀指派給一個狀態。FB使用軟指派。如果你想了解更多詳情,你可以在這裡找到。但是如果你不知道差異,你可以繼續前進並將其偽裝為硬指派以便更容易理解。在我們的情境中,你只需要知道一個重要的點。為了計算在時間t處處於某個狀態的概率,FB將所有可能到達該狀態的路徑的概率加總。

Viterbi training

因此,FB計算上非常繁重。它通過對所有可能的路徑進行求和來計算前向和後向概率。但是如果我們切換到一個硬指派概念,我們只需要知道最可能的狀態是什麼。然後將音頻幀指派給該特定狀態。例如,對於下面的話語,我們可以將o₄與ahf相關聯,將o₂與ahm相關聯。

Source

這個過程只需要定位最可能的狀態序列。為此,我們可以使用維特比解碼來找到這樣的序列,並跳過計算前向和後向概率。

不要將維特比訓練與維特比解碼相混淆。FB和維特比訓練都是從一個初始的HMM模型開始。在維特比訓練中,我們使用維特比解碼來找到最可能的路徑。這將一個隱狀態與一個音頻幀相連接。

Source

我們通過所有的語句來估計所有相應的隱狀態。

Source

現在,一切都是可見的,我們可以重新估計HMM模型的參數。然後,我們通過使用新的HMM模型找到最佳序列,再次重複這個過程。因此,儘管Viterbi解碼找到最佳狀態序列,但FB和Viterbi訓練都是EM算法,在交替步驟中優化HMM模型參數和聲學模型。

Viterbi訓練的計算量較小。因此,如果可以選擇,就優先考慮它。但在早期訓練中,聲學模型可能還不夠成熟。這時可以考慮使用FB算法。在實際應用中,速度和簡單性可能會主導訓練結果。所以,先給Viterbi訓練一個機會。實際上,許多從業者可能會建議這樣做。當HMM模型變得更加成熟時,軟分配和硬分配之間的差異不太明顯,將產生相同的結果。(在本文中,我們可能會提及使用FB算法來訓練模型。實際上,可以改用Viterbi訓練。)

對齊改進了聲學模型。良好的聲學模型提高了對齊的準確性。因此,在整個訓練過程中,每當聲學模型有顯著改善時,我們就進行對齊。當模型變得更加準確時,我們將使用它來糾正文本中的錯誤,並引入靜音音素。

Key training steps

在訓練之前,我們收集

  • 帶有文本的語句。
  • 我們為每個單詞定義發音詞典。
  • 我們手動定義HMM拓樸。

我們可能想要確定模型的大小,例如GMM中的組件數量。我們可能想要確定語音決策樹可能可用的問題。

以下是主要的訓練步驟:

  • 根據參考文本,我們形成初始的HMM拓樸。
Source

底部的圖表是表示發話“他是新的”的HMM拓撲結構。它是根據數據集的文本記錄、發音詞典和音素模型推導而來的。

Source
  • 基於此拓樸,我們為每個CI電話建立聲學模型。為了學習HMM音素狀態和音頻幀之間的對齊,我們應用前向-後向演算法(FB)。
Source
  • 然後,對齊的音頻幀中的MFCC特徵將被用作計算單高斯的均值和變異數的訓練數據。
  • Mixture splitting(稍後詳述):我們從這個1組件GMM(單高斯)開始。我們將每個高斯分裂成兩個並運行許多次FB迭代。這會使音頻幀與HMM音素狀態重新對齊。我們繼續分裂,然後進行很多次FB迭代,直到達到GMM中組件的目標數量。這個聲學模型將逐漸變得更複雜。
  • 精煉參考文本:在此階段,我們選擇發音變體並找出語句中的沉默音素。我們進行進一步的FB訓練以精煉文本和對齊。
  • 使用CI模型和精煉的文本重新對齊CI音素與訓練數據。然後我們建立語音決策樹(稍後詳述)。
  • 從CI模型中種子(克隆)CD模型:
  • 使用前向-後向演算法或Viterbi演算法重新訓練CD模型。我們精煉聲學GMM模型,並可能進行更多的混合分裂。

作為參考,這裡有一個ASR模型示例。這是北美商業新聞(NAB)任務中40K詞彙的模型(典型的英語為母語的成人知道約42K詞)。

Source

(高斯組件的數量可以比上面的模型高得多。)

GMM acoustic model

ASR訓練的主要重點是開發聲學模型。我們從單高斯開始聲學模型。最終,我們希望為其開發一個GMM。

為了簡化討論,假設我們只從每個音頻幀中提取一個特徵。在強制對齊完成後,我們收集訓練數據集中相應的觀察特徵來為給定的音素狀態模型GMM模型。

Source

假設,我們想要發現上面的組件G1,G2和G3,我們可以應用k-mean聚類。以下是k-means聚類的一個例子,其中k=3。但在此例子中,提取的特徵是2維的,而不是1維的。

K=3 for 2-D features

Mixture Splitting

k-means聚類不同,一種流行的方法是混合分裂。從單高斯開始,我們將其分裂成兩個,並且兩個新的初始質心與原始質心相差ε。我們可以選擇ε與原始高斯的變異數成比例,如0.2 × σ。但是,如果任何分裂群集沒有太多可用的數據點,我們將忽略分裂。

所以我們將高斯分裂成兩個並運行許多次FB演算法。然後我們再分裂。我們重複迭代,直到達到GMM組件的目標數量。

Phonetic Decision Tree

為了提高ASR解碼的準確性,訓練從CI(上下文獨立)音節模型轉移到CD(上下文相關)音節模型。然而,創建上下文的音節組合產生了大量的音節狀態(三音節)。語音決策樹的關鍵想法是讓一些聽起來相似的三音節共享相同的GMM模型(聲學模型)。在訓練之前,我們準備了一個我們想用於決策樹樁的問題清單。我們使用決策樹技術來劃分資料。我們希望用最少的步驟將相似的三音節群聚在一起。這樣,他們可以共享相同的GMM模型。

Source: left, right

我們再次將音節與音頻框對齊,並根據相應的觀察特徵和上下文構建決策樹。

Source

一旦有了這樣的決策樹,我們就可以從上下文獨立的訓練轉換為上下文相關的訓練。

Refine transcript

有了transcript,發音詞典,音節級HMM,我們可以在模擬語音中組成一個HMM。

Source

為了減少圖的複雜性,我們希望transcript盡可能接近語音,並且有最少的弧。特別是,我們希望確定具有多種發音的單詞的確切發音。

Noise

此外,我們希望改進我們的翻譯以定位語音中的沉默,噪聲和充滿的停頓。我們引入SIL作為另一個音節來識別這些聲音。SIL始終插入在語音的開頭和結尾。如果沒有正確識別這些沉默聲音,則可能會打斷識別器。但這些聲音很難模擬。我們可能需要使用五個HMM狀態來模擬呼吸,笑聲和背景噪聲等聲音。我們可能會引入更多的SIL音節而不是一個。

當HMM模型相當好時,我們可以執行Viterbi演算法來縮小沉默音節和單詞的確切發音。

Modified from source

對於後續的步驟,包括生成音素決策樹和CD音素模型,我們將使用這個精煉過的文本記錄。

這些是ASR訓練的主要步驟。但是要知道,還有許多其他選擇和變體。接下來,我們再看一下對齊。

Alignment (Optional)

對齊將transcript與錄音相匹配。但是,一些transcript,如電視字幕,可能無法完全匹配音頻。例如,謄本可能會跳過或添加詞語。如果這些音頻用於語音識別訓練,我們可能需要首先對其進行篩選,並選擇那些與謄本匹配良好的語音。這稱為輕度監督訓練。

首先,我們可以基於從transcript得出的語言模型和從語料庫中學習的常規語言模型來內插新的語言模型。

然後,我們使用現有的聲學模型和新的語言模式解碼訓練數據。這創建了一個更可靠的謄本和對齊。對於訓練,我們選擇謄本和解碼輸出之間匹配良好的語音。

不必使用語言模型來建立分佈,我們可以從文本記錄中建立一個新的WFST語言模型,並用它來解碼音頻。下面的G轉換器被稱為因子轉換器。它允許檢測原始文本記錄的任何子串。

Source

這是它的決定性版本。

Source

我們可以修改它以允許從transcript中刪除單詞。

Source

這是它的決定性版本。

Source

首先,我們可以使用因子轉換器對音頻進行解碼。然後,我們將輸出與原始文本記錄進行對齊並重新分割數據。之後,我們再次使用上面的第二個轉換器對其進行解碼,以允許音頻中跳過單詞。完成後,我們可以比較解碼的單詞和文本記錄,以確定是否應該接受該發話進行訓練。詳細信息請參閱該paper

Speaker adaptation

我們也可以訓練一個模型以適應特定的說話者。在下面的深度網絡模型中,我們添加了層,以訓練適應特定說話者。這個概念與DL中的轉移學習非常相似。

Source

--

--

Moris
NLP & Speech Recognition Note

An AI engineer who loves deep learning technology and is willing to share resources and learn new technologies