在 Hugging Face Transformers 中使用 n-grams 增強 Wav2Vec2
Hugging Face 已將 pyctcdecode 函式庫整合至 🤗 Transformers 函式庫中,讓 Wav2Vec2 語音辨識模型能夠與 n-gram 語言模型 (LMs) 結合。這種整合顯著減少了拼字錯誤並改善了字錯率 (WER),特別是對於在有限數據上訓練的模型。
使用 n-gram LMs 提升轉錄準確度
將 Wav2Vec2 與 n-gram 語言模型結合,可以修正常見的僅依賴聲學的轉錄錯誤,即單字聽起來正確但拼寫錯誤的情況。雖然 Wav2Vec2 由於其 Transformer 架構和 Connectionist Temporal Classification (CTC) 微調,可以在沒有外部 LM 的情況下產生可接受的轉錄,但 LM 提供了必要的語言上下文,可防止模型預測不存在的單字。
在一個使用 facebook/wav2vec2-base-100h 的演示中,加入 4-gram 語言模型修正了諸如 "christmaus" 到 "christmas" 以及 "simalyis" 到 "similes" 之類的錯誤。然而,如果錯誤的轉錄是一個有效的英文單字(例如,用 "rose" 代替 "roast"),某些錯誤可能會持續存在,因為 n-gram 模型仍可能賦予其一個不可忽略的機率。
LM 增強解碼的技術實作
使用語言模型進行解碼與標準解碼在處理模型輸出方式上有所不同。Wav2Vec2ProcessorWithLM 並非使用 logits 的 argmax 來尋找最可能的字元,而是利用每個時間步長中所有可能輸出字元的完整機率分佈 (logits)。
此過程透過機率矩陣進行束搜尋 (beam search),利用 n-gram 語言模型根據語言模式來加權下一個字母的可能性。這需要 pyctcdecode 和 kenlm 函式庫以實現高效的解碼和模型儲存。
建立自定義 n-gram 語言模型
若要為特定領域或語言建立 n-gram LM,需使用以下工作流程:
1. 數據收集與預處理
有效的 LM 需要與語音辨識系統目標轉錄相符的文本數據。對於一個基於 facebook/wav2vec2-xls-r-300m 的瑞典語模型,使用了 europarl_bilingual 數據集,因為其乾淨、朗讀式的特性與口語音訊非常契合。預處理包括:
- 提取目標語言的文本。
- 將文本轉換為小寫。
- 移除特定字元(例如:標點符號)以符合微調後的聲學模型字母表。
2. 使用 KenLM 構建模型
由於 KenLM 與基於 Transformer 的 LMs 相比具有較低的計算成本,因此使用 KenLM 來建立 n-gram 模型。雖然 Transformer LMs 可以產生更好的結果,但 n-grams 提供了比沒有 LM 時顯著的性能提升,且檢索速度更快(本質上是查表查詢)。
KenLM 流水線中的關鍵步驟包括:
- 使用
lmplz指令建立 n-gram(例如:5-gram)。 - 手動將句尾 (
</s>) token 添加到.arpa檔案中,以確保與 🤗 Transformers 的相容性。 - 使用
build_binary將.arpa檔案轉換為二進位.bin格式,以減少檔案大小並提高載入速度。
整合與性能增益
若要整合 n-gram 模型,會透過結合聲學模型的特徵提取器、tokenizer,以及一個使用 KenLM 二進位模型初始化的 pyctcdecode 束搜尋解碼器來建立一個 Wav2Vec2ProcessorWithLM 物件。
性能影響
根據 Wav2Vec2 官方論文,n-gram LMs 提供了字錯率 (WER) 的大幅降低,特別是對於在極小數據集(例如:10 分鐘音訊)上訓練的模型,n-gram 可以將 WER 降低約 80%。在瑞典語 xls-r-300m-sv 的範例中,使用 5-gram LM 增強的解碼器在 Common Voice 7 測試集上達到了 18.85% 的 WER,代表相對性能提升了約 30%。
Sources
相關
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch