从零开始的语音分类

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)
卷积神经网络(Convolutional Neural Network, CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,它在计算机视觉、语音识别、自然语言处理等多个领域都有广泛应用。CNN的核心设计理念源于对生物视觉系统的模拟,尤其是大脑皮层中视觉信息处理的方式,其主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。以下是CNN技术的详细介绍: ### **1. 局部感知与卷积操作** **卷积层**是CNN的基本构建块,它通过使用一组可学习的滤波器(或称为卷积核)对输入图像进行扫描。每个滤波器在图像上滑动(卷积),并以局部区域(感受野)内的像素值与滤波器权重进行逐元素乘法后求和,生成一个输出值。这一过程强调了局部特征的重要性,因为每个滤波器仅对一小部分相邻像素进行响应,从而能够捕获图像中的边缘、纹理、颜色分布等局部特征。 ### **2. 权重共享** 在CNN中,同一滤波器在整个输入图像上保持相同的权重(参数)。这意味着,无论滤波器在图像的哪个位置应用,它都使用相同的参数集来提取特征。这种权重共享显著减少了模型所需的参数数量,增强了模型的泛化能力,并且体现了对图像平移不变性的内在假设,即相同的特征(如特定形状或纹理)不论出现在图像的哪个位置,都应由相同的滤波器识别。 ### **3. 池化操作** **池化层**通常紧随卷积层之后,用于进一步降低数据维度并引入一定的空间不变性。常见的池化方法有最大池化和平均池化,它们分别取局部区域的最大值或平均值作为输出。池化操作可以减少模型对微小位置变化的敏感度,同时保留重要的全局或局部特征。 ### **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起,形成深度网络结构。随着网络深度的增加,每一层逐渐提取更复杂、更抽象的特征。底层可能识别边缘、角点等低级特征,中间层识别纹理、部件等中级特征,而高层可能识别整个对象或场景等高级语义特征。这种层级结构使得CNN能够从原始像素数据中自动学习到丰富的表示,无需人工设计复杂的特征。 ### **5. 激活函数与正则化** CNN中通常使用非线性激活函数(如ReLU、sigmoid、tanh等)来引入非线性表达能力,使得网络能够学习复杂的决策边界。为了防止过拟合,CNN常采用正则化技术,如L2正则化(权重衰减)来约束模型复杂度,以及Dropout技术,在训练过程中随机丢弃一部分神经元的输出,以增强模型的泛化性能。 ### **6. 应用场景** CNN在诸多领域展现出强大的应用价值,包括但不限于: - **图像分类**:如识别图像中的物体类别(猫、狗、车等)。 - **目标检测**:在图像中定位并标注出特定对象的位置及类别。 - **语义分割**:对图像中的每个像素进行分类,确定其所属的对象或背景类别。 - **人脸识别**:识别或验证个体身份。 - **图像生成**:通过如生成对抗网络(GANs)等技术创建新的、逼真的图像。 - **医学影像分析**:如肿瘤检测、疾病诊断等。 - **自然语言处理**:如文本分类、情感分析、词性标注等,尽管这些任务通常结合其他类型的网络结构(如循环神经网络)。 ### **7. 发展与演变** CNN的概念起源于20世纪80年代,但其影响力在硬件加速(如GPU)和大规模数据集(如ImageNet)出现后才真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构在图像识别竞赛中取得突破性成果,推动了CNN技术的快速发展。如今,CNN已经成为深度学习图像处理领域的基石,并持续创新,如引入注意力机制、残差学习、深度可分离卷积等先进思想。 综上所述,卷积神经网络通过其独特的局部感知、权重共享、多层级抽象等特性,高效地从图像数据中提取特征并进行学习,已成为解决图像和视频处理任务不可或缺的工具,并在众多实际应用中取得了卓越的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值