language: pt
datasets:
- common_voice
- mls
- cetuc
- lapsbm
- voxforge
metrics:
- wer
tags:
- audio
- speech
- wav2vec2
- pt
- portuguese-speech-corpus
- automatic-speech-recognition
- speech
- PyTorch
- hf-asr-leaderboard
model-index:
- name: wav2vec2-large-xlsr-open-brazilian-portuguese-v2
results:
- task:
name: 自动语音识别
type: automatic-speech-recognition
dataset:
name: Common Voice
type: common_voice
args: pt
metrics:
- name: 测试WER
type: wer
value: 10.69
license: apache-2.0
基于开放巴西葡萄牙语数据集的Wav2vec 2.0模型v2
这是针对巴西葡萄牙语微调的Wav2vec模型演示,使用了以下数据集:
- CETUC:包含约145小时的巴西葡萄牙语语音,由50名男性和50名女性发音人录制,每人朗读约1,000条从CETEN-Folha语料库中选取的语音平衡句子。
- 多语言Librispeech (MLS):一个包含多种语言的大规模数据集。MLS基于公共领域的有声书录音,如LibriVox。该数据集总计包含6,000小时的转录数据,涵盖多种语言。本工作使用的葡萄牙语数据集(主要为巴西变体)约284小时语音,来自62名朗读者录制的55本有声书。
- VoxForge:旨在为声学模型构建开放数据集的项目。该语料库包含约100名发音人和4,130条巴西葡萄牙语发音,采样率从16kHz到44.1kHz不等。
- Common Voice 6.1:由Mozilla基金会提出的项目,旨在创建不同语言的广泛开放数据集以训练ASR模型。志愿者通过官方网站捐赠并验证语音。本工作使用的葡萄牙语(主要为巴西变体)数据集为6.1版本(pt_63h_2020-12-11),包含约50小时已验证语音和1,120名独特发音人。
- Lapsbm:"Falabrasil - UFPA"是Fala Brasil小组用于基准测试巴西葡萄牙语ASR系统的数据集。包含35名发音人(10名女性),每人朗读20条独特句子,总计700条巴西葡萄牙语发音。音频以22.05 kHz采样率录制,未进行环境控制。
这些数据集被合并构建为一个更大的巴西葡萄牙语数据集。除Common Voice的开发/测试集分别用于验证/测试外,所有数据均用于训练。
原始模型使用fairseq进行微调。本笔记本使用转换后的版本。
注意:Common Voice测试报告显示WER为10%,但该模型训练时使用了除测试集外所有已验证的Common Voice实例。这意味着训练集中的某些发音人可能出现在测试集中。
导入与依赖
%%capture
!pip install datasets
!pip install jiwer
!pip install torchaudio
!pip install transformers
!pip install soundfile
import torchaudio
from datasets import load_dataset, load_metric
from transformers import (
Wav2Vec2ForCTC,
Wav2Vec2Processor,
)
import torch
import re
import sys
准备
chars_to_ignore_regex = '[\,\?\.\!\;\:\"]'
wer = load_metric("wer")
device = "cuda"
model_name = 'lgris/wav2vec2-large-xlsr-open-brazilian-portuguese-v2'
model = Wav2Vec2ForCTC.from_pretrained(model_name).to(device)
processor = Wav2Vec2Processor.from_pretrained(model_name)
def map_to_pred(batch):
features = processor(batch["speech"], sampling_rate=batch["sampling_rate"][0], padding=True, return_tensors="pt")
input_values = features.input_values.to(device)
attention_mask = features.attention_mask.to(device)
with torch.no_grad():
logits = model(input_values, attention_mask=attention_mask).logits
pred_ids = torch.argmax(logits, dim=-1)
batch["predicted"] = processor.batch_decode(pred_ids)
batch["predicted"] = [pred.lower() for pred in batch["predicted"]]
batch["target"] = batch["sentence"]
return batch
测试
针对Common Voice的测试(同域)
dataset = load_dataset("common_voice", "pt", split="test", data_dir="./cv-corpus-6.1-2020-12-11")
resampler = torchaudio.transforms.Resample(orig_freq=48_000, new_freq=16_000)
def map_to_array(batch):
speech, _ = torchaudio.load(batch["path"])
batch["speech"] = resampler.forward(speech.squeeze(0)).numpy()
batch["sampling_rate"] = resampler.new_freq
batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower().replace("’", "'")
return batch
ds = dataset.map(map_to_array)
result = ds.map(map_to_pred, batched=True, batch_size=1, remove_columns=list(ds.features.keys()))
print(wer.compute(predictions=result["predicted"], references=result["target"]))
for pred, target in zip(result["predicted"][:10], result["target"][:10]):
print(pred, "|", target)
结果:10.69%
针对TEDx的测试(跨域)
!gdown --id 1HJEnvthaGYwcV_whHEywgH2daIN4bQna
!tar -xf tedx.tar.gz
dataset = load_dataset('csv', data_files={'test': 'test.csv'})['test']
def map_to_array(batch):
speech, _ = torchaudio.load(batch["path"])
batch["speech"] = speech.squeeze(0).numpy()
batch["sampling_rate"] = resampler.new_freq
batch["sentence"] = re.sub(chars_to_ignore_regex, '', batch["sentence"]).lower().replace("’", "'")
return batch
ds = dataset.map(map_to_array)
result = ds.map(map_to_pred, batched=True, batch_size=1, remove_columns=list(ds.features.keys()))
print(wer.compute(predictions=result["predicted"], references=result["target"]))
for pred, target in zip(result["predicted"][:10], result["target"][:10]):
print(pred, "|", target)
结果:34.53%