译者 | 布加迪
审校 | 重楼
从语音助手到转录服务,自动语音识别(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