返回文章列表

微調Whisper模型實作HillMari語音辨識

本文探討如何微調 Whisper 模型以實作 Hill Mari 語音辨識,涵蓋資料前處理、模型組態、訓練引數調整、WER 指標計算及模型評估。此外,文章也介紹如何使用 SpeechT5 模型進行文字轉語音,並探討其在威爾斯語上的應用,以及相關的倫理考量。

機器學習 語音辨識

Whisper 模型在語音辨識領域表現出色,但對於資料量稀少的語言,微調能顯著提升其效能。本文以 Hill Mari 語言為例,詳細介紹如何微調 Whisper 模型,包含資料前處理、模型組態、訓練引數設定以及 WER 指標計算等關鍵步驟。同時,也探討了使用 SpeechT5 模型進行文字轉語音的技術,並以威爾斯語為例,展示其應用流程和潛在的倫理問題。

微調Whisper模型於Hill Mari語言的語音轉文字任務

資料前處理與模型組態

在進行語音轉文字任務時,資料的前處理至關重要。首先,我們需要對標籤進行處理,確保其適合模型的輸入。

SpeechToTextDataCollator類別的作用

class SpeechToTextDataCollator:
    def __call__(self, processed_batch):
        # 檢查每個標籤的第一個標記是否為句子的起始標記(bos_token_id)
        # 如果是,則移除這個標記,以調整標籤以便正確處理
        # 傳回值:更新processed_batch字典以包含調整後的標籤,並傳回這個字典作為輸出
        pass

初始化WhisperProcessor

processor = WhisperProcessor.from_pretrained("openai/whisper-small", language="Russian", task="transcribe")

此程式碼初始化了一個WhisperProcessor例項,用於載入預訓練的whisper-small模型,並組態為轉錄俄語音訊。該處理器結合了特徵提取和標記化,簡化了音訊資料的準備過程。

建立SpeechToTextDataCollator例項

speech_to_text_data_collator = SpeechToTextDataCollator(speech_processor=processor)

此程式碼建立了一個SpeechToTextDataCollator類別的例項,並將processor物件作為引數傳遞給其speech_processor引數。該例項負責準備用於訓練或推斷的語音轉文字模型的批次資料。

文字標準化與WER指標計算

normalize_text函式

def normalize_text(text):
    text = text.lower()
    text = re.sub(r'[^\w\s]', '', text)
    return text

此函式用於標準化文字,方法包括將文字轉換為小寫並移除非單詞字元。

compute_wer_metrics函式

wer_metric = evaluate.load("wer")

def compute_wer_metrics(prediction):
    predicted_ids = prediction.predictions
    true_label_ids = prediction.label_ids
    true_label_ids[true_label_ids == -100] = tokenizer.pad_token_id
    
    predicted_texts = tokenizer.batch_decode(predicted_ids, skip_special_tokens=True)
    true_texts = tokenizer.batch_decode(true_label_ids, skip_special_tokens=True)
    
    predicted_texts = [normalize_text(text) for text in predicted_texts]
    true_texts = [normalize_text(text) for text in true_texts]
    
    word_error_rate = 100 * wer_metric.compute(predictions=predicted_texts, references=true_texts)
    return {"wer": word_error_rate}

內容解密:

此函式首先載入WER指標。然後定義了一個名為compute_wer_metrics的函式,用於計算語音轉文字模型的預測WER。該函式接收一個包含模型預測輸出ID和真實標籤ID的預測物件。它將被忽略的標記ID(標記為-100)替換為tokenizer的填充標記ID,以便進行正確的比較。然後使用tokenizer將預測和真實標籤ID解碼為文字表示。這些文字表示被傳遞給WER指標計算,該計算得出預測文字和真實文字之間的錯誤率百分比。該函式傳回WER作為百分比,提供模型效能的洞察。

模型初始化與組態

載入預訓練Whisper模型

whisper_model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
whisper_model.config.forced_decoder_ids = None
whisper_model.config.suppress_tokens = []

內容解密:

  1. 載入預訓練的whisper-small模型,用於語音轉文字任務。
  2. 將模型的forced_decoder_ids設定為None,表示在生成過程中不強制使用特定的解碼器標記ID。
  3. 將模型的suppress_tokens設定為空列表,表示不抑制任何標記的生成。

訓練引陣列態

Seq2SeqTrainingArguments設定

whisper_hill_mari_finetuning_args = Seq2SeqTrainingArguments(
    output_dir="dkhublani/whisper_small_model_fine_tuned",
    hub_model_id="dkhublani/whisper_small_model_fine_tuned",
    per_device_train_batch_size=16,
    gradient_accumulation_steps=1,
    learning_rate=1e-5,
    lr_scheduler_type="constant_with_warmup",
    warmup_steps=20,
    max_steps=500,
    gradient_checkpointing=True,
    fp16=True,
    fp16_full_eval=True,
    evaluation_strategy="steps",
    per_device_eval_batch_size=16,
    predict_with_generate=True,
    generation_max_length=225,
    save_steps=250,
    eval_steps=250,
    logging_steps=25,
    report_to=["tensorboard"],
    load_best_model_at_end=True,
    metric_for_best_model="wer",
    greater_is_better=False,
    push_to_hub=True,
)

內容解密:

此程式碼塊定義了使用Seq2SeqTrainingArguments類別對Whisper模型進行微調的訓練引數。主要組態包括:

  1. 輸出目錄:指定模型檢查點等訓練輸出的儲存目錄。
  2. 批次大小:設定每個裝置的訓練批次大小為16。
  3. 梯度累積:設定梯度累積步驟為1,可以根據需要調整以模擬更大的批次大小。
  4. 學習率:設定學習率為1e-5。
  5. 學習率排程器:使用帶有預熱步驟的常數學習率排程器。
  6. 最大訓練步驟:限制訓練步驟為500,建議在資源允許的情況下增加此值。
  7. 混合精確度訓練:啟用FP16混合精確度訓練,以減少記憶體使用並可能加速訓練。
  8. 評估策略:設定每隔一定步驟進行一次模型評估。
  9. 日誌記錄與儲存:設定日誌記錄、模型儲存和評估的步驟間隔。
  10. 最佳模型載入:在訓練結束時載入最佳模型,根據WER指標進行評估。

微調 Whisper 模型於 Hill Mari 語音辨識之應用

模型微調引數設定

在進行 Whisper 模型的微調過程中,我們需要對訓練引數進行精確設定,以確保最佳的學習效果與評估準確性。以下是所使用的關鍵引數:

  • per_device_eval_batch_size:設定每個裝置上的評估批次大小。
  • predict_with_generate:啟用預測生成模式,以進行評估。
  • generation_max_length:設定生成序列的最大長度。
  • save_steps:決定多少步驟後儲存一次模型檢查點。
  • eval_steps:指定多少步驟後進行一次模型評估。
  • logging_steps:組態訓練進度的日誌記錄頻率。
  • report_to:指定將指標記錄到 TensorBoard。
  • load_best_model_at_end:在訓練結束時載入最佳模型,評估標準為指定的指標。
  • metric_for_best_model:使用 WER(詞錯誤率)作為評估最佳模型的指標。
  • greater_is_better:設定為 False,表示 WER 越低越好。
  • push_to_hub:關閉自動推播模型至 Hugging Face Model Hub 的功能。

這些引數的設定旨在最佳化微調過程,以實作有效的學習和評估。

processor.save_pretrained(whisper_hill_mari_finetuning_args.output_dir)
whisper_hill_mari_trainer = Seq2SeqTrainer(
    args=whisper_hill_mari_finetuning_args,
    model=whisper_model,
    train_dataset=common_voice["train"],
    eval_dataset=common_voice["test"],
    data_collator=speech_to_text_data_collator,
    compute_metrics=compute_wer_metrics,
    tokenizer=processor.feature_extractor,
)
whisper_hill_mari_trainer.train()

內容解密:

  1. processor.save_pretrained():將處理器組態儲存到指定的輸出目錄中,以便於後續使用或載入相同組態。
  2. Seq2SeqTrainer 初始化:建立一個名為 whisper_hill_mari_trainer 的訓練器物件,用於微調 Whisper 模型。
    • args:使用預先定義的訓練引數物件 whisper_hill_mari_finetuning_args,包含了批次大小、學習率、評估策略等訓練相關的引數。
    • model:指定要微調的 Whisper 模型。
    • train_dataseteval_dataset:分別使用 Common Voice 資料集的訓練集和測試集進行訓練和評估。
    • data_collator:使用 speech_to_text_data_collator 對資料進行格式化,以正確地形成批次資料。
    • compute_metrics:利用 compute_wer_metrics 函式計算詞錯誤率(WER),用於評估模型效能。
    • tokenizer:將處理器的特徵提取器作為 tokenizer 使用,這在 Whisper 模型的上下文中是合理的,因為它負責準備資料。
  3. whisper_hill_mari_trainer.train():啟動微調過程,根據設定的引數和資料集進行模型的訓練。

模型評估與推論

在完成模型的微調後,我們進入了模型評估與推論的階段。這一階段的核心目標是對比微調後的 Whisper 模型與原始預訓練模型的效能差異,藉此瞭解微調對模型在不同條件下理解和轉錄音訊資料能力的影響。透過嚴謹的分析和比較,我們旨在揭示微調帶來的改進以及潛在的改進空間。

比較定量指標

表格編號描述
Table 4-1比較預訓練模型和微調模型的輸出結果
Table 4-2比較預訓練模型和微調模型的輸出結果
Table 4-3比較預訓練模型和微調模型的輸出結果

從表格中可以明顯看出,微調後的模型在效能上明顯超越了預訓練模型。經過 500 步的訓練後,微調模型的 WER 為 0.308,而預訓練模型的 WER 為 1.29。進一步地,我們透過定性評估來比較兩者在測試資料集上的表現。

原始陳述式範例:

  1. колжы миде сеткӓшкӹ
  2. йынгы йыла стихотворени отважный морякреволюционер макаров лӹмеш сирӹмӹ
  3. кырыквлӓ ӓнгӹрвлӓм йоктарат

圖表翻譯:

此圖示展示了預訓練模型與微調模型在不同測試陳述式下的輸出結果對比,可以看出微調模型顯著提高了語音辨識的準確性。

從語音到文字再到語音合成

在前面的章節中,我們探討瞭如何利用 Whisper 將語音轉換為文字,並針對未包含在其原始訓練資料集中的語言進行了微調,從而提升了其效能。現在,我們將注意力轉移到文字到語音(TTS)的轉換,這一技術能夠將書面文字轉換為類別似人類的音訊。TTS 技術具有多種應用場景,包括幫助視障人士存取數位內容、建立有聲書、為虛擬助理(如 Siri 和 Google Assistant)提供語音支援,以及透過提供語音內容來增強娛樂、遊戲和語言學習體驗。

然而,TTS 技術的能力也引發了倫理方面的擔憂。例如,它可能被濫用於在未經同意的情況下建立令人信服的詐騙音訊錄音。因此,負責任地使用 TTS 技術至關重要。

我們計劃採用由 Junyi Ao 和他的團隊在 Microsoft 開發的 SpeechT5 模型,用於我們的 TTS 應用。SpeechT5 模型根據傳統的 Transformer 編碼器-解碼器框架,能夠有效地捕捉序列轉換的細微差別,並透過隱藏表示來表達輸入資料的特徵。此外,SpeechT5 整合了六個專門的預網和後網,用於處理語音或文字輸入,這些網路對於準備輸入資料至關重要。

圖表翻譯: 此圖示展示了 SpeechT5 模型的整體架構,從輸入文字到輸出語音的流程。可以看出,模型首先透過編碼器處理輸入文字,接著透過解碼器生成對應的語音輸出。整個過程有效地利用了 Transformer 的強大序列處理能力。

使用預訓練的SpeechT5模型進行文字轉語音

本章節將探討如何利用預訓練的SpeechT5模型,將威爾斯語(Welsh)文字轉換為語音,模擬威爾斯語使用者的聲音。我們首先生成說話者嵌入(speaker embeddings),以捕捉獨特的聲音特徵,並將威爾斯陳述式子作為輸入傳遞給SpeechT5模型。我們將使用富含威爾斯語資料的Common Voice 13資料集。

步驟1:安裝必要的函式庫和載入資料

首先,我們為Common Voice資料集中的特定威爾斯語樣本生成說話者嵌入。

!pip install huggingface-hub
!pip install datasets
!pip install transformers datasets soundfile speechbrain accelerate

內容解密:

上述程式碼用於安裝執行文字轉語音任務所需的函式庫,包括huggingface-hubdatasetstransformerssoundfilespeechbrainaccelerate。這些函式庫對於處理機器學習模型、管理資料集、音訊處理以及加速AI模型訓練和推斷任務至關重要。

接下來,我們匯入所需的模組和函式庫:

from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan
from datasets import load_dataset, Audio, DatasetDict
from collections import defaultdict
import os
import torch
from speechbrain.pretrained import EncoderClassifier

內容解密:

這段程式碼匯入了處理文字轉語音任務所需的各個模組和函式庫。具體來說,它從transformers函式庫中匯入了SpeechT5ProcessorSpeechT5ForTextToSpeechSpeechT5HifiGan,用於處理SpeechT5模型的文字轉語音任務。同時,從datasets函式庫中匯入了load_datasetAudioDatasetDict,用於資料集管理和音訊處理。此外,還匯入了defaultdict用於建立具有預設值的字典,匯入了torch用於張量運算,以及從speechbrain.pretrained匯入了EncoderClassifier用於音訊分類別任務。

from huggingface_hub import notebook_login
notebook_login()

內容解密:

上述程式碼提示在Google Collab筆記本中進行Hugging Face Hub身份驗證,讓使用者能夠直接從筆記本環境中存取他們的Hugging Face帳戶和私有模型或資料集。

SpeechT5模型架構與運作原理

SpeechT5是一種統一的模型架構,能夠處理多種語音相關任務,包括文字轉語音(TTS)。其架構的核心在於能夠學習文字和語音之間的通用表示,從而實作高品質的語音合成。

在進行文字轉語音任務時,SpeechT5首先將輸入文字透過預網(pre-net)進行處理,然後利用序列到序列(seq2seq)架構生成對應的頻譜圖(spectrogram)。生成的頻譜圖再經過後網(post-net)進行細化,最終透過聲碼器(vocoder)轉換為自然的音訊波形。

SpeechT5架構圖示

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 微調Whisper模型實作HillMari語音辨識

package "Whisper 微調流程" {
    package "資料前處理" {
        component [Hill Mari 語料] as data
        component [WhisperProcessor] as processor
        component [DataCollator] as collator
    }

    package "模型組態" {
        component [whisper-small] as model
        component [語言設定] as lang
        component [轉錄任務] as task
    }
}

package "評估指標" {
    component [文字標準化] as normalize
    component [WER 計算] as wer
    component [效能分析] as perf
}

package "延伸應用" {
    component [SpeechT5 TTS] as tts
    component [威爾斯語合成] as welsh
}

data --> processor : 音訊輸入
processor --> collator : 特徵提取
collator --> model : 批次資料
model --> normalize : 轉錄文字
normalize --> wer : 錯誤率
wer --> perf : 模型品質
tts --> welsh : 文字轉語音

note right of wer
  WER 計算:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

圖表翻譯: 此圖示呈現了SpeechT5模型在進行文字轉語音任務時的處理流程。首先,輸入文字透過預網處理成文字表示,接著透過seq2seq架構生成初始頻譜圖。然後,頻譜圖經過後網進行細化,最後透過聲碼器轉換為最終的音訊波形。

使用預訓練的SpeechT5模型進行威爾斯語TTS

為了實作威爾斯語的文字轉語音,我們利用預訓練的SpeechT5模型。首先,我們需要生成說話者嵌入,以捕捉特定說話者的聲音特徵。然後,將威爾斯語文字輸入到模型中,利用Common Voice 13資料集中的威爾斯語資料進行推斷。