翻譯: https://arxiv.org/pdf/1811.07453.pdfpython
開源軟件的可用性在語音識別和深度學習的普及中發揮了重要做用。例如,Kaldi 如今是用於開發最早進的語音識別器的既定框架。 PyTorch 用於使用 Python 語言構建神經網絡,而且因爲其簡單性和靈活性,最近在機器學習社區中引發了極大的興趣。算法
PyTorch-Kaldi 項目旨在彌合這些流行工具包之間的差距,試圖繼承 Kaldi 的效率和 PyTorch 的靈活性。 PyTorch-Kaldi 不只是這些軟件之間的簡單接口,並且還嵌入了一些用於開發現代語音識別器的有用功能。例如,該代碼專門設計用於天然插入用戶定義的聲學模型。做爲替代方案,用戶能夠利用幾個預先實現的神經網絡,可使用直觀的配置文件進行自定義。 PyTorch-Kaldi 支持多種特徵和標籤流以及神經網絡的組合,可使用複雜的神經架構。該工具包與豐富的文檔一塊兒公開發布,旨在在本地或 HPC 羣集上正常工做。數組
在幾個數據集和任務上進行的實驗代表,PyTorch-Kaldi 能夠有效地用於開發現代最早進的語音識別器。網絡
在過去幾年中,咱們目擊了自動語音識別(ASR)技術的逐步改進和成熟 [1,2],這些技術已經達到了史無前例的性能水平,如今已被全球數百萬用戶使用。架構
深度學習正在發揮這一技術突破的關鍵做用 [3],這有助於克服基於高斯混合模型(GMM)的先前語音識別器。除了深度學習以外,其餘因素也在該領域的進展中發揮了做用。許多與語言相關的項目,如 AMI [4],DICIT [5],DIRHA [6] 以及 CHiME [7],Babel 和 Aspire 等語音識別挑戰,都極大地促進了 ASR 的進步。 Librispeech [8] 等大型數據集的公開發布也爲創建共同的評估框架和任務發揮了重要做用。框架
在其餘因素中,開發軟件的開發,如 HTK [9],Julius [10],CMU-Sphinx,RWTH-ASR [11],LIA-ASR [12] 以及最近的 Kaldi 工具包 [進一步幫助推廣 ASR,使新型 ASR 應用的研究和開發變得更加容易。機器學習
Kaldi 目前是最受歡迎的 ASR 工具包。它依賴於有限狀態傳感器(FST)[14] 並提供了一組 C ++ 庫,用於有效地實現最早進的語音識別系統。此外,該工具包包括一大套食譜,涵蓋了全部最流行的語音語料庫。在開發這種 ASR 專用軟件的同時,一些通用的深度學習框架,如 Theano [15],TensorFlow [16] 和 CNTK [17],已經在機器學習社區中獲得普及。這些工具包爲神經網絡設計提供了極大的靈活性,可用於各類深度學習應用。函數
PyTorch-Kaldi 採用的架構概述如圖 1 所示。主要腳本run_exp.py是用 python 編寫的,管理 ASR 系統中涉及的全部階段,包括特徵和標籤提取,訓練,驗證,解碼和評分。 該工具包將在如下小節中詳細介紹工具
主腳本將 INI 格式的配置文件做爲輸入。配置文件在項目文檔中有完整描述,它由幾個部分組成。 [Exp] 部分指定了一些高級信息,例如用於實驗的文件夾,訓練時期的數量,隨機種子。它還容許用戶指定是否必須在 CPU,GPU 或多個 GPU 上進行實驗。配置文件繼續使用 [dataset *] 部分,這些部分指定有關要素和標籤的信息,包括存儲它們的路徑,上下文窗口的特徵 [23] 以及語音數據集必須在其中的塊數。分裂。神經模型在 [architecture *] 部分中描述,而 [model] 部分定義了這些神經網絡如何組合。後一部分利用了一個由 run_exp.py 腳本自動解釋的簡單元語言。最後,配置文件定義 [decoding] 部分中的解碼參數。
使用 Kaldi 執行特徵提取,其自己提供 c ++ 庫(例如,compute-mfcc-feats,compute-fbank-feats,compute-plp-feats)以有效地提取最流行的語音識別特徵。計算出的係數存儲在二進制存檔(擴展名爲. ark)中,而後使用從 kaldi-io-for-python 項目繼承的 kaldi-io 實用程序導入到 python 環境中。而後由函數 load-chunk 處理這些功能。 ,執行上下文窗口組合,混洗,以及均值和方差歸一化。如前所述,PyTorch-Kaldi 能夠管理多個特徵流。例如,用戶能夠定義利用 MFCC,FBANK,PLP 和 fMLLR [24] 係數組合的模型。
用於訓練聲學模型的主要標籤源自語音特徵與由 Kaldi 利用語音決策樹計算的依賴於上下文的電話狀態序列之間的強制對齊過程。 爲了實現多任務學習,PyTorch-kaldi 支持多個標籤。 例如,能夠聯合加載上下文相關和上下文無關的目標,並使用後者執行單音正則化 [25,26]。 也可使用基於執行不一樣任務的神經網絡生態系統的模型,如在語音加強和語音識別之間的聯合訓練 [27,28,29] 或最近提出的合做網絡的背景下所作的那樣。 深度神經網絡 [30]。
PyTorch-Kaldi 自動將完整數據集拆分爲多個塊,這些塊由從完整語料庫中隨機抽樣的標籤和特徵組成。而後將每一個塊存儲到 GPU 或 CPU 存儲器中並由神經訓練算法 run_nn.py 處理。該工具包在每一個時期動態地組成不一樣的塊。而後從它們中得到一組小批量。小批量由幾個用於梯度計算和參數優化的訓練樣例組成。
迷你批次的彙集方式很大程度上取決於神經網絡的類型。對於前饋模型,迷你批次由隨機改組的特徵和從塊中採樣的標籤組成。對於常常性網絡,小型機必須由完整的句子組成。然而,不一樣的句子可能具備不一樣的持續時間,使得造成相同大小的小批量所需的零填充。 PyTorch-Kaldi 根據它們的長度按升序對語音序列進行排序(即,首先處理短句)。這種方法最大限度地減小了零填充的須要,而且證實有助於避免批量規範化統計數據的可能誤差。此外,已經證實有效地略微提升性能並改善梯度的數值穩定性。
每一個小批量由 PyTorch 實現的神經網絡處理,該神經網絡將特徵做爲輸入,並做爲輸出在依賴於上下文的電話狀態上的一組後驗機率。 該代碼旨在輕鬆插入自定義模型。 如圖 2 中報告的僞代碼中所報告的,能夠經過在 neural_nets.py 中添加新類來簡單地定義新模型。 該類必須由初始化方法和定義要執行的計算的正向方法組成,初始化方法經過初始化方法指定參數。
做爲替代方案,在工具箱中原生地實現了許多預約義的最早進的神經模型。 當前版本支持標準 MLP,CNN,RNN,LSTM 和 GRU 模型。 此外,它支持一些先進的循環架構,例如最近提出的 Light GRU [31] 和雙正則化 RNN [32]。 SincNet 模型 [33,34] 也用於直接從原始波形執行語音識別。 可使用實現隨機搜索算法的實用程序來調整模型的超參數(例如學習速率,神經元數量,層數,丟失因子等)[35]。
由神經網絡產生的聲學後驗機率在饋送基於 HMM 的解碼器以前經過它們的先驗歸一化。 解碼器將聲學分數與由 n-gram 語言模型導出的語言機率合併,並嘗試使用beam-search算法檢索在語音信號中發出的單詞序列。 使用 NIST SCTK 評分工具包計算最終的字錯誤率(WER)分數。
在如下子部分中,描述了實驗活動所採用的語料庫和 DNN 設置。
第一組實驗是使用 TIMIT 語料庫進行的,考慮到標準的音素識別任務(與 Kaldi s5 配方 [13] 一致)。
爲了在更具挑戰性的情景中驗證咱們的模型,還在 DIRHA-English 數據集 444 的遠距離談話條件下進行了實驗。該數據集由語言數據聯盟(LDC)分發。 [36,37]。 訓練基於原始的 WSJ-5k 語料庫(由 83 名發言者發出的 7318 個句子組成),這些語句被一系列在家庭環境中測量的脈衝響應所污染 [37]。 測試階段是使用數據集的實際部分進行的,其中包括由六位美國本土人士在上述環境中發出的 409 個 WSJ 句子。
使用 CHiME 4 數據集 [7] 進行了額外的實驗,該數據集基於在四個嘈雜環境(公共汽車,咖啡館,步行區和街道交叉點)中記錄的語音數據。 訓練集由 43690 個嘈雜的 WSJ 句子組成,由五個麥克風(安排在平板電腦上)記錄,共有 87 個揚聲器。 在這項工做中考慮的測試集 ET-real 基於由四個揚聲器發出的 1320 個真實句子,而子集 DT-real 已經用於超參數調整。 CHiME 實驗基於單通道設置 [7]。
最後,使用 LibriSpeech [8] 數據集進行實驗。 咱們使用由 100 小時組成的訓練子集和用於超參數搜索的 dev-clean 集。 使用繼承自 Kaldi s5 配方的 fglarge 解碼圖在測試清潔部分上報告測試結果。
實驗考慮了不一樣的聲學特徵,即 39 個 MFCC(13 個靜態 +Δ+ΔΔ),40 個對數濾波器組特徵(FBANKS),以及 40 個 fMLLR 特徵 [24](根據 s5 配方中的報告提取) Kaldi),使用 25 ms 的窗口計算,重疊爲 10 ms。
根據 Glorot 的方案 [38] 初始化前饋模型,而使用正交矩陣初始化復發權重 [39]。循環 dorpout 被用做正則化技術 [40]。正如 [41,42] 中提出的那樣,僅對前饋鏈接採用批量歸一化。使用運行 24 個時期的 RMSprop 算法完成優化。在每一個時期以後監測開發組的表現,而且當相對性能改善低於 0.1%時學習率減半。在開發數據集上調整模型的主要超參數(即,學習速率,隱藏層數,每層隱藏神經元,丟失因子以及雙正則化項λ)。
在本節中,咱們將討論使用 TIMIT,DIRHA,CHiME 和 LibriSpeech 數據集得到的基線。 做爲展現 PyTorch-Kaldi 工具包主要功能的展現,咱們首先報告了對 TIMIT 進行的實驗驗證。
表 1 顯示了使用不一樣特徵的幾種前饋和重複模型得到的性能。 爲了確保架構之間的更準確的比較,針對每一個模型和特徵進行了五個改變初始化種子的實驗。 所以,該表報告了全部實驗的平均電話錯誤率(PER)555 標準誤差範圍在 0.15 和 0.2 之間。
結果代表,正如預期的那樣,因爲揚聲器適應過程,fMLLR 功能優於 MFCC 和 FBANKs 係數。 循環模型明顯優於標準 MLP 模型,特別是在使用 LSTM,GRU 和 Li-GRU 架構時,經過乘法門有效地解決了梯度消失問題。 使用 Li-GRU 模型 [31] 得到最佳結果(PER = 14.2%),該模型基於單個門,所以比標準 GRU 節省了 33%的計算。
表 2 詳述了 PyTorch-Kaldi 中用於改善 ASR 性能的一些經常使用技術的影響。第一行(基線)報告使用基本循環模型實現的性能,其中不採用dropout 和 batch normalization的強大技術。第二行突出顯示在訓練期間逐漸增長序列長度時實現的性能增益。在這種狀況下,咱們經過在 100 步(即,大約 1 秒的語音)截斷語音句子開始訓練,而且咱們在每一個時期逐漸加倍最大序列持續時間。這種簡單的策略一般能夠提升系統性能,由於它鼓勵模型首先關注短時間依賴關係,並僅在稍後階段學習長期關聯。第三行顯示了添加循環的 dropout 時所實現的改進。與 [40,42] 相似,咱們對全部時間步驟應用相同的dropout mask以免梯度消失問題。相反,第四行顯示了 batch normalization 帶來的好處 [19]。最後,最後一行顯示了在應用單音素 正則化時所實現的性能 [26]。在這種狀況下,咱們經過兩個 softmax 分類器採用多任務學習策略:第一個估計依賴於上下文的狀態,而第二個預測單音目標。如 [26] 中所觀察到的,咱們的結果證明該技術能夠成功地用做有效的正則化器。
到目前爲止討論的實驗基於單個神經模型。在表 3 中,咱們將最佳 Li-GRU 系統與更復雜的架構進行比較,該架構基於由一系列特徵提供的前饋和後續模型的組合。據咱們所知,後一種系統實現的 PER = 13.8%會在 TIMIT 測試集上產生最佳發佈的性能。
之前的成就是基於用 Kaldi 計算的標準聲學特徵。 可是,在 PyTorch-Kaldi 中,用戶可使用本身的功能。 表 4 顯示了經過標準 FBANKs 係數或原始聲波波形直接饋送的卷積模型所得到的結果。基於原始樣本的標準 CNN 與由 FBANK 特徵饋送的標準 CNN 相似地執行。 使用 SincNet [33] 能夠略微提升性能,這是第一次突出顯示處理語音識別原始波形的有效性。
咱們如今將實驗驗證擴展到其餘數據集。 在這方面,表 5 顯示了在 DIRHA,CHiME 和 Librispeech(100h)數據集上取得的性能。該表始終顯示出使用 Li-GRU 模型的更好性能,證明了咱們以前在 TIMIT 上取得的成就。 DIRHA 和 CHiME 的結果顯示了所提出的工具包在嘈雜條件下的有效性。 特別是,DIRHA 表明了一項很是具備挑戰性的任務,其特色是存在至關大的噪音和混響。 在此數據集上得到的 WER = 23.9%表示迄今爲止在單麥克風任務上發佈的最佳性能。 最後,使用 Librispeech 得到的性能在所考慮的 100 小時子集上優於相應的 p - 範數 Kaldi 基線(WER=6.5%)。
本文描述了 PyTorch-Kaldi 項目,這是一項旨在彌合 Kaldi 和 PyTorch 之間差距的新舉措。該工具包旨在使 ASR 系統的開發更簡單,更靈活,容許用戶輕鬆插入其定製的聲學模型。 PyTorch-Kaldi 還支持神經架構,功能和標籤的組合,容許用戶使用複雜的 ASR 流水線。實驗證明,PyTorch-Kaldi 能夠在一些流行的語音識別任務和數據集中實現最早進的結果。
目前版本的 PyTorch-Kaldi 已經公開發布,並附有詳細的文檔。該項目仍處於初始階段,咱們邀請全部潛在的貢獻者參與其中。咱們但願創建一個足夠大的開發人員社區,以逐步維護,改進和擴展咱們當前工具包的功能。在將來,咱們計劃增長在咱們的框架中編碼的預先實現的模型的數量,而且咱們但願經過集成神經語言模型訓練以及對端到端 ASR 系統的適當支持來擴展當前項目。