构建基于Hugging Face预训练模型的自动语音识别系统

自动语音识别(ASR)是许多应用中的关键技术,从语音助手到转录服务。在本教程中,我们旨在构建一个能够将语音转录为文本的ASR管道,使用Hugging Face的预训练模型。我们将使用一个轻量级数据集以提高效率,并采用Wav2Vec2,这是一个强大的自监督语音识别模型。

我们的系统将:

  1. 加载并预处理语音数据集
  2. 微调预训练的Wav2Vec2模型
  3. 使用词错误率(WER)评估模型性能
  4. 部署模型进行实时语音到文本推理

为了保持模型的轻量化和高效性,我们将使用一个小型语音数据集,而不是像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系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值