Jua*_*ano 8 python machine-learning pytorch
我正在尝试使用 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()
Run Code Online (Sandbox Code Playgroud)
首先,如何使用加载的模型从 wav 文件返回预测?
其次,如何使用带注释的数据进行预训练?我在清单脚本中没有看到任何文字提及。
DBa*_*ker 19
在尝试了各种方法之后,我能够弄清楚这一点,并从头开始训练了一个 wav2vec 模型。
一些背景:wav2vec 使用半监督学习来学习预处理声音帧的向量表示。这类似于 word2vec 在文本语料库中学习词嵌入。在 wav2vec 的情况下,它对声音文件的随机部分进行采样,并学习从当前偏移位置预测给定部分是否在不久的将来。这有点类似于掩码任务用于训练诸如 BERT 之类的 Transformer。这种预测任务的好处在于它们是自我监督的:该算法可以在未标记的数据上进行训练,因为它使用数据的时间结构来生成标签,并使用随机采样来生成对比鲜明的负样本。它是一个二元分类任务(是否建议在当前偏移量的近期内处理声音帧)。在此二元分类任务的训练中,它学习声音帧的向量表示(每 10 毫秒的声音有一个 512 暗向量)。这些向量表示是有用的特征,因为它们集中了与预测语音相关的信息。然后可以使用这些向量代替频谱图向量作为语音到文本算法(如 wav2letter 或 deepSpeech)的输入。这是很重要的一点:不是全自动语音识别(ASR)系统。这是一个有用的组件,因为通过利用对未标记数据(包含语音但没有文本转录的音频文件)的自监督学习,它大大减少了对标记数据(语音转录为文本)的需求。根据他们的文章,似乎通过在 ASR 管道中使用 wav2vec,所需的标记数据量可以减少至少 10 倍(显然需要的转录语音少 10 到 100 倍)。由于未转录的语音文件比转录的语音更容易获得,这是在 ASR 系统中使用 wav2vec 作为初始模块的巨大优势。
所以 wav2vec 是用没有注释的数据训练的(没有使用文本来训练它)。
让我感到困惑的是以下训练命令(此处):
python train.py /manifest/path --save-dir /model/path ...(etc.).........
Run Code Online (Sandbox Code Playgroud)
事实证明,由于 wav2vec 是 fairseq 的一部分,因此应该使用以下 fairseq 命令行工具来训练它:
fairseq-train
Run Code Online (Sandbox Code Playgroud)
由于此命令的参数很长,因此可以使用 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
Run Code Online (Sandbox Code Playgroud)
大多数参数都是这里建议的参数,只有前两个(它们是文件系统路径)必须为您的系统修改。
由于我有 mp3 格式的音频语音文件,因此我使用以下 bash 脚本将它们转换为 wav 文件:
#!/bin/bash
for file in /home/user/data/soundFiles/*
do
echo "$file"
echo "${file%.*}.wav"
ffmpeg -i "$file" "${file%.*}.wav"
done
Run Code Online (Sandbox Code Playgroud)
他们建议音频文件的持续时间较短,较长的文件应拆分为较小的文件。我拥有的文件已经很短了,所以我没有做任何拆分。
必须使用脚本 wav2vec_manifest.py 在训练前创建训练数据清单。它将创建两个文件(train.tsv 和 valid.tsv),基本上创建了哪些音频文件应该用于训练和哪些应该用于验证的列表。这两个文件所在的路径是 fairseq-train 方法的第一个参数。
fairseq-train 方法的第二个参数是保存模型的路径。训练后将有这两个模型文件:
checkpoint_best.pt
checkpoint_last.pt
它们在每个时期结束时更新,因此我能够提前终止训练过程并仍然保留那些保存的模型文件