英文

Data2Vec-Audio-Large-960h

Facebook's Data2Vec

在16kHz采样的语音音频上进行预训练和优化的大型模型。在使用该模型时,请确保您的语音输入也是以16kHz采样。

Paper

作者:Alexei Baevski,Wei-Ning Hsu,Qiantong Xu,Arun Babu,Jiatao Gu,Michael Auli

摘要

尽管自监督学习的总体思想在各个领域中是相同的,但实际的算法和目标却有很大的差异,因为它们是针对单一领域开发的。为了更接近通用的自监督学习,我们提出了data2vec框架,该框架可以同时用于语音、NLP或计算机视觉。其核心思想是使用标准Transformer架构,在自蒸馏设置中基于输入的屏蔽视图来预测全输入数据的潜在表示。 data2vec不像预测本质是局部的,如单词、视觉标记或人类语音单位等特定于模态的目标,而是预测包含来自整个输入的信息的上下文化潜在表示。语音识别、图像分类和自然语言理解的主要基准实验证明该方法达到了新的技术水平或与主要方法具有相近的性能。

原始模型可以在此处找到 https://github.com/pytorch/fairseq/tree/main/examples/data2vec

预训练方法

更多信息,请参阅 official paper

使用

要转录音频文件,可以将该模型作为独立的声学模型使用,如下所示:

 from transformers import Wav2Vec2Processor, Data2VecAudioForCTC
 from datasets import load_dataset
 import torch
 
 # load model and processor
 processor = Wav2Vec2Processor.from_pretrained("facebook/data2vec-audio-large-960h")
 model = Data2VecAudioForCTC.from_pretrained("facebook/data2vec-audio-large-960h")
     
 # load dummy dataset and read soundfiles
 ds = load_dataset("patrickvonplaten/librispeech_asr_dummy", "clean", split="validation")
 
 # tokenize
 input_values = processor(ds[0]["audio"]["array"],, return_tensors="pt", padding="longest").input_values  # Batch size 1
 
 # retrieve logits
 logits = model(input_values).logits
 
 # take argmax and decode
 predicted_ids = torch.argmax(logits, dim=-1)
 transcription = processor.batch_decode(predicted_ids)

评估

这段代码显示了如何在LibriSpeech的“clean”和“other”测试数据上评估 facebook/data2vec-audio-large-960h。

 from transformers import Wav2Vec2Processor, Data2VecAudioForCTC
 from datasets import load_dataset
 import torch
 from jiwer import wer
 
 # load model and processor
 processor = Wav2Vec2Processor.from_pretrained("facebook/data2vec-audio-large-960h").to("cuda")
 model = Data2VecAudioForCTC.from_pretrained("facebook/data2vec-audio-large-960h")
 

librispeech_eval = load_dataset("librispeech_asr", "clean", split="test")

def map_to_pred(batch):
    input_values = processor(batch["audio"]["array"], return_tensors="pt", padding="longest").input_values
    with torch.no_grad():
        logits = model(input_values.to("cuda")).logits

    predicted_ids = torch.argmax(logits, dim=-1)
    transcription = processor.batch_decode(predicted_ids)
    batch["transcription"] = transcription
    return batch

result = librispeech_eval.map(map_to_pred, batched=True, batch_size=1, remove_columns=["audio"])

print("WER:", wer(result["text"], result["transcription"]))

结果(WER):

"clean" "other"
1.89 4.07