说话人识别中的数据预处理和数据增强
数据预处理
- 假设已经采集到一些数据,在进行训练之前,需要先对数据做以下预处理:
- 数据清洗
- 语音检测(Voice Activity Detection,VAD,也叫Speech Detection,或Silence Suppression,静音抑制)
- 特征提取与标准化(Normalization,注意要和归一化、正则化等说法区分)
- 数据分组
数据清洗
- 目的是提高数据的正确性,关于数据的正确性,可参考说话人识别的数据需求
- 出现数据错误,有以下原因
- 录音设备故障,得到破损的音频文件
- 人工操作失误,导致录制了纯噪声
- 标签反转
- 可以进行人工清洗,或自动化清洗。人工清洗对于标签反转是不可行的,而且效率低
- 对于前两种错误,可以采用以下自动化清洗办法
- 使用信噪比(Signal-to-noise Ratio,SNR)估计算法,例如:WADA-SNR,去除信噪比很低的音频
- 使用VAD算法,去除无法触发VAD的音频
- 使用语音识别(ASR)算法,去除文字结果为空,或者置信度很低的音频
- 对于第三种错误,可采用自监督清洗,步骤如下:
- 先使用,已经去除前两种错误的数据,训练一个初始的说话人识别模型
- 利用初始的说话人识别模型,为数据中的每一个说话人,计算一个说话人的中心点,关于说话人的中心点,可参考说话人识别中的损失函数
- 如果某个说话人的音频,距离该说话人的中心点非常遥远,那么这个音频可能是标签反转噪声,需要去除
- 自监督清洗有利有弊,优点在于效率高,缺点在于可能去除了困难样本
语音检测(VAD)
- 在一段音频中,可能包含语音、静默和噪声,如下图所示:
- 使用一个预训练好的VAD模型,去除静默和噪声的部分。VAD模型是对每一帧的二分类,去除那些分类为0的帧即可
特征提取与标准化
- 特征提取是指从音频中提取出MFCC、LFBE或PLP这样的特征
- 问题在于,应该在什么阶段进行特征提取,有两种做法:
- 离线特征提取
- 在训练之前,把数据集中,所有音频的特征提取出来,储存到硬盘上
- 训练时,直接读取这些特征,而不需要读取音频文件
- 优点:
- 提取出的特征可重复使用
- 容易debug
- 缺点:需要大量的额外硬盘空间
- 在线特征提取
- 训练时,直接读取音频文件,再提取特征
- 特征提取变为训练的一部分
- 优点:不需要额外的硬盘空间
- 缺点:
- 每次训练,特征提取都需要重复计算
- 训练过程变慢,消耗变大
- 不容易debug
- 离线特征提取
- 标准化是指对提取出的特征减均值,除标准差,使其均值为0,方差为1。还可以进一步操作,限制数值范围为[0,1][0,1][0,1],或[−1,1][-1,1][−1,1]
- 限制为[0,1][0,1][0,1]:
- 找出特征的最大值xmaxx_{max}xmax和最小值xminx_{min}xmin
- 对特征x∈[xmin,xmax]x \in [x_{min},x_{max}]x∈[xmin,xmax]进行变换
x=x−xminxmax−xminx=\frac{x-x_{min}}{x_{max}-x_{min}} x=xmax−xminx−xmin - 从而x∈[0,1]x \in [0,1]x∈[0,1]
- 限制为[−1,1][-1,1][−1,1]:
- 找出特征的最大值xmaxx_{max}xmax,假定x≥0x \ge 0x≥0
- 对特征x∈[0,xmax]x \in [0,x_{max}]x∈[0,xmax]进行变换
x=x−xmax/2xmax/2x=\frac{x-x_{max}/2}{x_{max}/2} x=xmax/2x−xmax/2 - 从而x∈[−1,1]x \in [-1,1]x∈[−1,1]
- 限制为[0,1][0,1][0,1]:
- 问题在于,为什么要这么做?深度学习开始蓬勃的第一篇文章AlexNet也对数据集里的每一张图片减均值,除标准差,经典的mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]就是从ImageNet中统计出来的
- 原因在于:
- 提取出的特征,其数值范围是不受控制的
- 神经网络的参数初始化,常常会采用高斯分布
- 如果不进行标准化,特征的数值范围与参数的数值范围差距太大,会导致收敛速度极慢
数据分组
- 这是使用广义端到端损失函数,训练说话人识别模型的独有步骤,关于广义端到端损失函数,可参考说话人识别中的损失函数
- 训练神经网络时,需要把数据打包成一个一个batch,而说话人识别的batch,应该包含:
- 多个说话人,数量记为NNN
- 每个说话人应具有相同的话语个数,记为MMM
- batch的维度为N×MN \times MN×M
- 为了提高在训练过程中,从硬盘读取文件,构造batch的速度,需要对数据进行分组
- 高效的分组如下图所示,也就是按照batch中每个说话人应具有的话语个数进行分组,此时M=4M=4M=4
- 即使在数据集中,每个说话人具有超过4个话语,也要按照上图的方式进行数据分组。每个说话人具有的多于4个的那部分话语,用于构造另一个batch
数据增强
- 数据的来源一般为数据采集和数据增强,数据增强是自动化、高效、低廉的数据产生方法,而且能提高数据的多样性
- 数据增强技术,一开始在计算机视觉领域得到非常普遍的应用,如下图所示:
- 数据增强是基于原始数据的,上图中对原始的小狗图像进行了图像旋转、图像裁剪、颜色空间变换、添加噪声等操作,数据增强后,图像的标签不会变化,仍然是小狗,但是数据量变为原来的6倍,并且数据多样性提高了
- 说话人识别领域中,数据增强包括
- 时域增强(WavAugment)
- 检测扰动(Detection Perturbation)
- 时频谱增强(SpecAugment)
- 语音合成增强(Synth2Aug)
时域增强
- 常见的时域增强,包括:
- 音量:直接将整个信号乘以某个常数
- 采样率:对信号进行重采样,比如:将16000Hz信号重采样至8000Hz,以模拟有线电话的语音信号
- 语速:将音频的速度乘以某个在1附近的常数,比如:0.9、1.1
- 音高:随机偏移音频的基频
- 编码格式:将线性脉冲编码的音频,重新编码为MP3、Opus等格式
- 说话人识别中有一个比较重大的挑战——鲁棒说话人识别,也就是说希望说话人识别模型,对不同的声学环境也具备较高的性能
- 不同的声学环境包括:
- 安静的环境
- 有多种背景噪声的环境
- 带有房间混响的环境
- 为了让训练数据覆盖更多的声学环境,需要多风格训练(Multistyle Training,MTR)技术
- 假设我们需要下面的数据:
- 100个说话人
- 每个说话人具有10个话语
- 每个说话人在1000种不同的背景噪声下的话语
- 每个说话人在10种不同的房间混响下的话语
- 只通过数据采集产生上面要求的数据,需要的采集次数是100×10×1000×100=1,0000,0000100 \times 10 \times 1000 \times 100=1,0000,0000100×10×1000×100=1,0000,0000,需要一亿采集,这是不可接受的
- 采用数据增强的方式产生数据:
- 使用一组参数描述一个房间,由于房间大多为立方体,所以可以用长度、宽度和高度来描述
- 确定信号源的位置,和录音设备的位置,可以用它们在房间中的立体坐标来描述
- 使用房间冲击响应(Room Impulse Response,RIR)的公式来描述该房间内,录音设备接受信号源的情况,包括:
- 信号源直线传播,到达录音设备
- 信号源沿其他方向传播,反射到录音设备
- 背景噪声和房间混响的数学形式:
- 信号源记为x(t)x(t)x(t),对应的RIR记为hs(t)h_s(t)hs(t)
- MMM个噪声源记为ni(t)n_i(t)ni(t),对应的RIR记为hi(t)h_i(t)hi(t)
- 假设还有一个加性的(Additive)的噪声源,记为d(t)d(t)d(t)
- 增强后的信号记为xr(t)x_r(t)xr(t)
xr(t)=x(t)∗hs(t)+∑i=1Mni(t)∗hi(t)+d(t)x_r(t)=x(t)*h_s(t)+\sum_{i=1}^{M}n_i(t)*h_i(t)+d(t) xr(t)=x(t)∗hs(t)+i=1∑Mni(t)∗hi(t)+d(t)
其中,∗*∗号表示卷积运算
- 根据公式,我们可以:
- 分别采集语音信号、噪声信号和RIR
- 代入公式中,得到多种组合
- 通过加权,调整信噪比
- 相比起直接采集一亿个信号,我们只需要采集100×10+1000+100=2100100 \times 10 + 1000 + 100=2100100×10+1000+100=2100个信号,然后采用多风格训练即可
检测扰动
- 在训练时,我们到底是把数据中的哪一部分喂给模型呢?
- 对于文本相关的说话人识别,数据需要先通过关键词检出(Keyword spotting,KWS)模型,得到关键词片段
- 对于文本无关的说话人识别,数据需要先通过VAD模型,得到语音片段
- 如果在训练时采用的KWS/VAD模型,与运行时采用的KWS/VAD模型不一致,就会导致说话人识别模型的性能下降
- 为了减少说话人识别模型,对特定KWS/VAD模型的依赖,我们可以采用检测扰动的数据增强方法,包括:
- 随机偏移KWS/VAD模型的输出
- 随机扰动KWS/VAD模型的阈值
时频谱增强
- 上面介绍的两种方法都是基于时域的,也就是说,是应用于波形图的,而时频谱增强则是应用于特征提取之后的时频谱图的
- 时频谱增强的做法有三种,如下图所示,左上角是原始数据
- 时域规整(Time Warping):在原始时频谱图上选定一个时间点,将时间点左边的部分进行挤压,右边的部分进行拉伸。如左下角所示
- 频域遮掩(Frequency Masking):将原始时频谱图,特定频率范围内所有的值,替换成原始时频谱图的均值。如右上角所示
- 时域遮掩(Time Masking):将原始时频谱图,特定时间范围内所有的值,替换成原始时频谱图的均值。如右下角所示
- 优点
- 实现简单,计算代价小
- 实现效率高,可用于在线特征提取,不需要用额外的硬盘空间存储
- 实验表明,时频谱增强对语音类任务,性能提升明显
- 注意,对标准化后的时频谱图,遮掩时只需要全部替换成0即可。实际上,标准化后的时频谱图,其均值为0
语音合成增强
根据说话人识别的数据需求,我们要求数据:
- 说话人的多样性
- 文本的多样性
- 录音设备和声学环境的多样性
上述的时频域增强和时域增强,提高了录音设备和声学环境的多样性。那么对于说话人和文本的多样性,就需要用到语音合成增强方法
语音合成增强的核心在于,利用多说话人语音合成模型,输入说话人嵌入码和文本内容,就能合成对应的语音
关于多说话人语音合成模型,可参考Sample Efficient Adaptive Text-to-Speech
语音合成增强本质上是一个领域自适应问题:
- 有足够的源领域语音数据
- 不足的目标领域语音数据
- 有足够的目标领域文本数据
解决方案是:利用源领域的语音和文本数据,合成目标领域的语音数据。合成的数据并不是真正的目标领域数据,而是一种近似(Proxy)数据
说话人识别中的数据预处理和数据增强相关推荐
- PyTorch源码解析--torchvision.transforms(数据预处理、数据增强)
PyTorch框架中有一个很常用的包:torchvision torchvision主要由3个子包构成:torchvision.datasets.torchvision.models.torchvis ...
- 竞赛专题 | 数据预处理-如何处理数据中的坑?
点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 为了帮助更多竞赛选手入门进阶比赛,通过数据竞赛提升理论实践能力和团队协作能力.Data ...
- 机器学习项目中的数据预处理与数据整理之比较
要点 在常见的机器学习/深度学习项目里,数据准备占去整个分析管道的60%到80%. 市场上有各种用于数据清洗和特征工程的编程语言.框架和工具.它们之间的功能有重叠,也各有权衡. 数据整理是数据预处理的 ...
- Python数据分析中的数据预处理:数据标准化
[小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python数据分析中的 数据预处理:数据标准化 ● 选择题 以下关于 ...
- 数据预处理Part4——数据离散化
文章目录 离散化,对数据做逻辑分层 1. 什么是数据离散化? 2. 为什么要将数据离散化 3. 如何将数据离散化? 3.1 时间数据离散化 3.2 多值离散数据离散化 3.3 连续数据离散化 3.4 ...
- 【Python实战】数据预处理(数据清理、集成、变换、归约)
[Python实战]数据预处理 前言 数据预处理概述 数据清理 异常数据处理 1.异常数据分析 2.异常数据处理方法 缺失值处理 噪声数据处理 数据集成 1.实体识别 2.冗余属性 3.数据不一致 数 ...
- 数据预处理—-(数据探索、数据清理、数据集成、数据规约、数据变换)
数据挖掘概念与技术 定义挖掘目标–>数据取样–>数据探索–>数据预处理–>挖掘建模–>模型评价 第一章.数据 挖掘的数据类型:时间序列,序列,数据流,时间空间数据,多媒体 ...
- 数据预处理Part2——数据标准化
文章目录 数据标准化 1. 实现归一化的Max-Min 2. 实现中心化和正态分布的Z-Score 3. 用于稀疏数据的MaxAbs 4. 针对离群点的RobustScaler 5. 标准化后数据可视 ...
- 数据预处理Part9——数据降维
文章目录 1. 什么是数据降维? 2. 为什么要进行数据降维? 3. 降维是如何实现的? 4. sklearn中的降维算法 4.1 主成分分析PCA 4.2 因子分析FA 4.3 独立成分分析ICA ...
- Pandas数据预处理与数据重塑案例
Pandas数据预处理与数据重塑案例 前言 预处理是数据分析中不可缺少的一部分,我们日常得到的数据多半是规整的,只有得到想要的相应格式的数据,才能进行后续的探索性分析和建模.以下是我在一个小的项目 ...
最新文章
- 115页Slides带你领略深度生成模型全貌(附PPT)
- 文科生自学python要多久_怎么自学python,大概要多久?
- linux怎么创建vi脚本,Vim 创建Python脚本时候自动补全解释器和编码方法
- Cloud for Customer手机应用上传图片禁止从本地相册选择图片的核心代码
- 【Flink】Flink kafka报错 Auto-commit of offsets failed for group Offset commit failed with a retriable
- 【MySQL】MySQL STRAIGHT JOIN 使用案例以及简介
- android path拆分_Android架构进阶之路:Android 组件化方案探索与思考总结
- 【mysql优化 2】索引条件下推优化
- 每天一道剑指offer-顺时针打印矩阵
- 全网首发:JDK绘制文字:四、绘制文字的具体函数分析
- 剪辑师:入门级无水印无片头片尾免费视频剪辑工具
- 查看office2016是不是永久激活状态
- NULL,0,`0`,`\0`,0你分得清吗?
- 谷歌开发者大会焦点:TensorFlow.js可制作微信小程序,Android 10原生支持5G,TF2.0大更新...
- java字符串与数值型相互转换
- vsomeip+*.fidl+*.fdepl(3)
- PIN PIN2 PUK PUK2
- 毕业设计 stm32智能电子秤系统 - 物联网 嵌入式 单片机
- VIM 编辑器使用指南
- 中国软件外包IT公司最新排名
热门文章
- 05.17 佘山踏青“徒步爬山” 活动回顾
- Logistic Regression逻辑回归函数Python实现
- Linux gzip压缩输出
- 视频直播制作软件:MimoLive Mac v5.2b2
- DirectShow编程(2)- 开始DirectShow旅程
- java outer的使用
- Akaban操作系统(3)-----不按套路出牌的开发
- 数据处理方法-算术编码(香农算法、java编码实现)
- 警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
- R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)