我正在尝试使用wav2vec来训练自己的自动语音识别系统:

https://github.com/pytorch/fairseq/tree/master/examples/wav2vec

import torch
from fairseq.models.wav2vec import Wav2VecModel

cp = torch.load('/path/to/wav2vec.pt')
model = Wav2VecModel.build_model(cp['args'], task=None)
model.load_state_dict(cp['model'])
model.eval()

首先,如何使用加载的模型从wav文件返回预测?

第二,如何使用带注释的数据进行预训练?
我没有在 list 脚本中看到任何文字提及。

最佳答案

在尝试了各种方法之后,我能够弄清楚这一点,并从头开始训练了wav2vec模型。

背景知识:wav2vec使用半监督学习来学习预处理声音帧的矢量表示。这类似于word2vec进行的学习将单词嵌入文本语料库的操作。对于wav2vec,它将对声音文件的随机部分进行采样,并从当前偏移位置开始学习预测给定的部分是否在不久的将来。这有点类似于用于训练诸如BERT之类的变压器的掩盖单词任务。这种预测任务的好处在于它们是自我监督的:由于该算法使用数据的时间结构来产生标签,并且使用随机采样来产生对比性的负面样本,因此可以对未标记的数据进行训练。这是一个二进制分类任务(在当前偏移量的不久的将来是否建议处理的声音帧)。
在训练此二进制分类任务时,它将学习声音帧的矢量表示(每10ms的声音有512个暗淡矢量)。这些矢量表示是有用的功能,因为它们集中了与预测语音有关的信息。然后,这些向量可以代替频谱图向量用作语音输入到文本算法(例如wav2letter或deepSpeech)的输入。这一点很重要:wav2vec不是全自动语音识别(ASR)系统。它是有用的组件,因为通过对未标记的数据(包含语音但不带文本转录的音频文件)进行自我监督学习,可以大大减少对标记的数据(语音转录为文本)的需求。根据他们的文章看来,通过在ASR管道中使用wav2vec,所需的标记数据量可以减少至少10倍(显然,转录语音需要减少10到100倍)。由于未转录的语音文件比转录的语音更容易获得,因此使用wav2vec作为ASR系统中的初始模块具有巨大的优势。

因此,wav2vec使用未注释的数据进行训练(不使用文本来训练它)。

让我感到困惑的是下面的训练命令(here):

python train.py /manifest/path --save-dir /model/path ...(etc.).........

事实证明,由于wav2vec是fairseq的一部分,因此应使用以下fairseq命令行工具进行培训:
fairseq-train

由于此命令的参数很长,因此可以使用bash scipt完成此操作,例如
#!/bin/bash
fairseq-train /home/user/4fairseq --save-dir /home/user/4fairseq --fp16 --max-update 400000 --save-interval 1 --no-epoch-checkpoints \
--arch wav2vec --task audio_pretraining --lr 1e-06 --min-lr 1e-09 --optimizer adam --max-lr 0.005 --lr-scheduler cosine \
--conv-feature-layers "[(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1)]" \
--conv-aggregator-layers "[(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)]" \
--skip-connections-agg --residual-scale 0.5 --log-compression --warmup-updates 500 --warmup-init-lr 1e-07 --criterion binary_cross_entropy --num-negatives 10 \
--max-sample-size 150000 --max-tokens 1500000


大多数参数是建议使用的here,只有前两个(文件系统路径)必须为您的系统修改。

由于我有mp3格式的音频语音文件,因此我通过以下bash脚本将它们转换为wav文件:
#!/bin/bash
for file in /home/user/data/soundFiles/*
do
  echo "$file"
  echo "${file%.*}.wav"
  ffmpeg -i "$file" "${file%.*}.wav"
done


他们建议音频文件的持续时间较短,应将较长的文件拆分为较小的文件。我的文件已经很短了,所以我没有做任何分割。

在训练之前,必须使用脚本wav2vec_manifest.py创建训练数据 list 。它将创建两个文件(train.tsv和valid.tsv),基本上创建列表,列出哪些音频文件用于培训,哪些音频文件用于验证。这两个文件所在的路径是fairseq-train方法的第一个参数。

方法fairseq-train的第二个参数是保存模型的路径。
经过培训后,将有以下两个模型文件:
checkpoint_best.pt
checkpoint_last.pt
这些在每个纪元结束时进行更新,因此我能够尽早终止训练过程,并且仍然保留了那些已保存的模型文件

10-04 19:00