AI在线 AI在线

使用PyTorch和Hugging Face构建一个自动语音识别系统

作者: 布加迪
2025-04-01 09:31
译者 | 布加迪审校 | 重楼从语音助手到转录服务,自动语音识别(ASR)是许多应用中的一项关键技术。 我们在本教程中旨在使用Hugging Face的预训练模型构建一条能够将语音转录为文本的ASR管道。 我们将使用轻量级数据集来提高效率,并使用Wav2Vec2这种强大的语音识别自监督模型。

使用PyTorch和Hugging Face构建一个自动语音识别系统

译者 | 布加迪

审校 | 重楼

从语音助手到转录服务,自动语音识别(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

相关资讯

小米新一代Kaldi团队论文解读:新型自动语音识别 (ASR) 模型Zipformer诞生之路|ICLR 2024 Oral

近日,小米集团新一代 Kaldi 团队关于语音识别声学模型的论文《Zipformer: A faster and better encoder for automatic speech recognition》被 ICLR 2024 接收为 Oral (Top 1.2%)。论文链接:: Kaldi 团队是由 Kaldi 之父、IEEE fellow、小米集团首席语音科学家 Daniel Povey 领衔的团队,专注于开源语音基础引擎研发,从神经网络声学编码器、损失函数、优化器和解码器等各方面重构语音技术链路,旨在提
1/25/2024 5:14:00 PM
机器之心

机器学习的下一个前沿—量子扩展

译者 | 陈峻审校 | 重楼现如今,机器学习的速度比以往任何时候都快得多,也能够解决那些曾被认为完全无法解决的问题。 将来,在量子计算潜力的驱动下,人工智能(AI)模型会越来越大、越来越强,甚至会超越我们对其训练的工具。 说到模型训练,其计算和能源的消耗成本日趋高启。
1/21/2025 8:11:24 AM
陈峻

PyTorch内存优化的十种策略总结:在有限资源环境下高效训练模型

在大规模深度学习模型训练过程中,GPU内存容量往往成为制约因素,尤其是在训练大型语言模型(LLM)和视觉Transformer等现代架构时。 由于大多数研究者和开发者无法使用配备海量GPU内存的高端计算集群,因此掌握有效的内存优化技术变得尤为关键。 本文将系统性地介绍多种内存优化策略,这些技术组合应用可使模型训练的内存消耗降低近20倍,同时不会损害模型性能和预测准确率。
3/3/2025 10:42:50 AM
佚名