自动语音识别(ASR)是许多应用中的关键技术,从语音助手到转录服务。在本教程中,我们旨在构建一个能够将语音转录为文本的ASR管道,使用Hugging Face的预训练模型。我们将使用一个轻量级数据集以提高效率,并采用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数据集,这是一个适合快速实验的小型数据集。该数据集包含简短的语音命令,如“是”、“否”和“停止”。
from datasets import load_dataset
dataset = load_dataset("superb", "ks", split="train[:1%]") # 仅加载1%的数据进行快速测试
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"] # 使用标签作为文本输出
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"词错误率: {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系统。