SpeechBrain训练话语级分类器
SpeechBrain:作为一个基于 PyTorch 的开源一体化语音工具包,SpeechBrain 可用于开发最新的语音技术,包括语音识别、说话者识别、语音增强、多麦克风信号处理和语音识别系统等,且拥有相当出色的性能。
Models:TDNN分类器,ECAPA-TDNN的最新模型
Data:mini-librispeech小型开源数据集
Code:参考speech_siqin/templates/speaker_id
一.准备数据
数据准备的目标是创建数据清单文件(.JSON,.CSV)。这些文件告诉SpeechBrain在哪里可以找到音频数据以及相应的话语级别分类。
打开jupyter的终端:
数据库导入:利用cp命令将文件复制到目标文件中
eg.
cd .. 返回上层目录
1.数据清单文件
python train.py train.yaml 生成数据清单文件(.JSON)
实际上,您可以在此处指定您需要的所有条目(语言 ID、情感注释等)。但是,这些条目的名称与实验脚本(例如 train.py)期望的名称之间必须匹配。
上图通过迭代次数的增加,培训损失逐渐减少。
2.准备脚本
每个数据集的格式都不同,后序操作需要我们更改train.py,train.yaml,mini_librispeech_prepare.py文件来解析自己的数据集并创建JSON或CSV文件(我们创建了三个独立的数据清单文件来管理培训、验证和测试阶段,train.json,test.json,valid.json)
二.训练分类器
上步我们已经准备好训练分类器。要基于TDNN+统计池(xvectors)训练说话人id分类器。
稍后将插入另一个称为强调通道注意力、传播和聚合模型 (ECAPA) 的模型,该模型在说话人识别任务中提供了令人印象深刻的性能。
建议的配方执行特征计算/规范化,使用编码器处理特征,并在此基础上应用分类器。数据扩充也被用来提高系统性能。
1.训练speaker-id模型
我们将训练用于x向量的基于TDNN的模型。在卷积层的顶部使用统计池将可变长度的句子转换为固定长度的嵌入。在嵌入的顶部,使用一个简单的全连接分类器来预测N个说话人中哪一个在给定的句子中是活跃的。
训练此模型,运行以下代码:
%cd templates/speaker_id
!python train.py train.yaml --number_of_epochs=15 #--device='cpu'
如果使用jupyter运行代码则须加!,执行命令用!,换路径用%,但如果直接终端运行则不需要,并且从终端打印中看出在第一个epochs验证和培训损失都在快速减少。然后,我们基本上看到了一些小的改进和性能波动。在培训结束时,验证误差应为零(或非常接近零)。
神经网络中的epoch,iteration,batchsize:
神经网络的神奇之处就在于权重是通过训练自动得出的。所谓训练,就是让神经网络在训练数据集上跑一遍,看看损失函数的值怎么样。如果损失函数的值足够小,小到符合我们的需求,那就说明神经网络拟合得很好了,训练大功告成了(实际上并非如此,因为仅仅知道拟合得很好并不够,我们还要知道神经网络是不是拟合得太好了,也就是过拟合。所以还需要用测试数据集来测试是否过拟合。不过这里就姑且就当训练完成了吧)。反之,如果损失函数的值不够小,那就还需要继续训练。
epoch:当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch。然而,当一个epoch对于计算机而言太庞大的时候,就需要把它分成多个小块。
Batchsize:决定我们一次训练的样本数目。在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个batch。
iteration(迭代):是batch需要完成一个epoch的次数。
eg.有一个2000个训练样本的数据集。将2000个样本分成大小为500的batch,那么完成一个epoch需要4个iteration。定义10000次迭代为1个epoch,若每次迭代的batch_size设为256,那么1个epoch相当于过了2560000个训练样本。再举个栗子,训练集有1000个样本,batchsize=10,那么训练完整个样本集需要100次iteration,1次epoch。
因为我们只需对mini librispeech数据集中的28位发言者进行分类。以本教程为例,说明如何设置开发语音分类器所需的所有组件。
在深入代码之前,让我们看看在指定的output_folder:
检查点用最旧的准确率高
2.Hyperparameters超参数
yaml文件包含实现所需分类器所需的所有模块和超参数。
train.yaml:
在第一部分中,我们指定了一些基本设置,例如seed和输出文件夹的路径:
# Seed needs to be set at top of yaml, before objects with parameters are made
# 在创建带有参数的对象之前,需要在yaml的顶部设置种子
seed: 1986
__set_seed: !!python/object/apply:torch.manual_seed [!ref <seed>]
# If you plan to train a system on an HPC cluster with a big dataset,
# we strongly suggest doing the following:
# 1- Compress the dataset in a single tar or zip file.
# 2- Copy your dataset locally (i.e., the local disk of the computing node).
# 3- Uncompress the dataset in the local folder.
# 4- Set data_folder with the local path.
# Reading data from the local disk of the compute node (e.g. $SLURM_TMPDIR with SLURM-based clusters) is very important.
# It allows you to read the data much faster without slowing down the shared filesystem.
data_folder: ./data
output_folder: !ref ./results/speaker_id/<seed>
save_folder: !ref <output_folder>/save
train_log: !ref <output_folder>/train_log.txt
然后,我们指定用于培训、验证和测试的数据清单文件的路径:
# Path where data manifest files will be stored存储数据清单文件的路径
# The data manifest files are created by the data preparation script.
#数据清单文件由数据准备脚本创建。
train_annotation: train.json
valid_annotation: valid.json
test_annotation: test.json
从实验文件(train.py)调用数据准备脚本(mini_librispeech_prepare.py)时,将自动创建这些文件。 接下来,我们设置train_logger并声明将收集分类错误率统计信息的error_stats对象:
# The train logger writes training statistics to a file, as well as stdout.
#训练记录器将训练统计数据以及标准输出写入文件。
train_logger: !new:speechbrain.utils.train_logger.FileTrainLogger
save_file: !ref <train_log>
error_stats: !name:speechbrain.utils.metric_stats.MetricStats
metric: !name:speechbrain.nnet.losses.classification_error
reduction: batch
现在,我们可以指定一些训练超参数,如epoch数、批量大小、学习率、epoch数和嵌入维数。
ckpt_interval_minutes: 15 # save checkpoint every N min
# Feature parameters
n_mels: 23
# Training Parameters
sample_rate: 16000
number_of_epochs: 35
batch_size: 16
lr_start: 0.001
lr_final: 0.0001
n_classes: 28 # In this case, we have 28 speakers
emb_dim: 512 # dimensionality of the embeddings
dataloader_options:
batch_size: !ref <batch_size>
变量ckpt_interval_minutes可用于在一个训练时段内每N分钟保存一次检查点。在某些情况下,一个epoch可能需要几个小时,定期保存检查点是一种良好且安全的做法。这个基于小数据集的简单教程实际上并不需要此功能。 现在,我们可以定义培训模型所需的最重要模块:
# Added noise and reverb come from OpenRIR dataset, automatically downloaded and prepared with this Environmental Corruption class.
#添加的噪声和混响来自OpenRIR数据集,自动下载并使用此环境破坏类准备。
env_corrupt: !new:speechbrain.lobes.augment.EnvCorrupt
openrir_folder: !ref <data_folder>
babble_prob: 0.0
reverb_prob: 0.0
noise_prob: 1.0
noise_snr_low: 0
noise_snr_high: 15
# Adds speech change + time and frequency dropouts (time-domain implementation)