譯者 | 布加迪
審校 | 重樓
從語音助手到轉錄服務,自動語音識別(ASR)是許多應用中的一項關鍵技術。我們在本教程中旨在使用Hugging Face的預訓練模型構建一條能夠將語音轉錄為文本的ASR管道。我們將使用輕量級數據集來提高效率,并使用Wav2Vec2這種強大的語音識別自監督模型。
我們的系統將:
- 加載和預處理語音數據集
- 微調預訓練的Wav2Vec2模型
- 使用字錯誤率(WER)評估模型的性能
- 部署模型進行實時語音轉文本推理
為了確保模型輕量級、高效,我們將使用小型語音數據集,而不是Common Voice之類的大型數據集。
第1步:安裝依賴項
在開始之前,我們需要安裝必要的庫。這些庫將允許我們加載數據集、處理音頻文件并微調我們的模型。
pip install torch torchaudio transformers datasets soundfile jiwer
以下是下列庫的主要用途:
- transformers:為語音識別提供預訓練的Wav2Vec2模型
- datasets:加載和處理語音數據集
- torchaudio:處理音頻處理和操縱
- soundfile:讀取和寫入.wav文件
- jiwer:計算WER以評估ASR性能
第2步:加載輕量級語音數據集
我們使用SUPERB KS而不是使用Common Voice之類的大型數據集,這是一個非常適合快速試驗的小型數據集。該數據集由“是”、“不”和“停止”等簡短的口頭命令組成。
from datasets import load_dataset
dataset = load_dataset("superb", "ks", split="train[:1%]") # Load only 1% of the data for quick testing
print(dataset)
這會加載數據集的一小部分以降低計算成本,同時仍允許我們對模型進行微調。
提醒:數據集仍需要存儲空間,因此在處理較大的分割時,請注意磁盤使用情況。
第3步:預處理音頻數據
為了訓練ASR模型,我們需要確保音頻數據的格式正確。Wav2Vec2模型需要:
- 16 kHz 采樣率
- 無填充或截斷(動態處理)
我們定義一個函數來處理音頻并提取相關特征。
import torchaudio
def preprocess_audio(batch):
speech_array, sampling_rate = torchaudio.load(batch["audio"]["path"])
batch["speech"] = speech_array.squeeze().numpy()
batch["sampling_rate"] = sampling_rate
batch["target_text"] = batch["label"] # Use labels as text output
return batch
dataset = dataset.map(preprocess_audio)
這確保了所有音頻文件正確加載,并正確格式化,供進一步處理。
第4步:加載預訓練的Wav2Vec2模型
我們使用來自Hugging Face模型中心的預訓練Wav2Vec2模型。該模型已使用大型數據集進行了訓練,可以針對我們的特定任務進行微調。
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")
在這里,我們定義了將原始音頻轉換為對模型友好的特征的處理器和模型,包括使用960 小時長的語音進行預訓練的Wav2Vec2。
第5步:為模型準備數據
我們必須對音頻進行分詞和編碼,以便模型可以理解它。
def preprocess_for_model(batch):
inputs = processor(batch["speech"], sampling_rate=16000, return_tensors="pt", padding=True)
batch["input_values"] = inputs.input_values[0]
return batch
dataset = dataset.map(preprocess_for_model, remove_columns=["speech", "sampling_rate", "audio"])
該步驟確保我們的數據集與Wav2Vec2模型兼容。
第6步:定義訓練參數
在訓練之前,我們需要設置訓練配置。這包括批量大小、學習速率和優化步驟。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./wav2vec2",
per_device_train_batch_size=4,
evaluation_strategy="epoch",
save_strategy="epoch",
logging_dir="./logs",
learning_rate=1e-4,
warmup_steps=500,
max_steps=4000,
save_total_limit=2,
gradient_accumulation_steps=2,
fp16=True,
push_to_hub=False,
)
第7步:訓練模型
使用Hugging Face的Trainer,我們對Wav2Vec2模型進行了微調。
from transformers import Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
tokenizer=processor,
)
trainer.train()
第8步:評估模型
為了評估我們的模型轉錄語音的效果,我們計算了WER。
import torch
from jiwer import wer
def transcribe(batch):
inputs = processor(batch["input_values"], return_tensors="pt", padding=True)
with torch.no_grad():
logits = model(inputs.input_values).logits
predicted_ids = torch.argmax(logits, dim=-1)
batch["predicted_text"] = processor.batch_decode(predicted_ids)[0]
return batch
results = dataset.map(transcribe)
wer_score = wer(results["target_text"], results["predicted_text"])
print(f"Word Error Rate: {wer_score:.2f}")
WER分數越低,表示性能越好。
第9步:對新音頻運行推理
最后,我們可以使用訓練過的模型轉錄真實世界的語音。
import torchaudio
import soundfile as sf
speech_array, sampling_rate = torchaudio.load("example.wav")
inputs = processor(speech_array.squeeze().numpy(), sampling_rate=16000, return_tensors="pt", padding=True)
with torch.no_grad():
logits = model(inputs.input_values).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = processor.batch_decode(predicted_ids)
結語
好了,你已經使用PyTorch和Hugging Face以及輕量級數據集成功構建了一個ASR系統。
原文標題:Building an Automatic Speech Recognition System with PyTorch & Hugging Face,作者:Josep Ferrer