数据预处理

  • 假设已经采集到一些数据,在进行训练之前,需要先对数据做以下预处理:

    • 数据清洗
    • 语音检测(Voice Activity Detection,VAD,也叫Speech Detection,或Silence Suppression,静音抑制)
    • 特征提取与标准化(Normalization,注意要和归一化、正则化等说法区分)
    • 数据分组

数据清洗

  • 目的是提高数据的正确性,关于数据的正确性,可参考说话人识别的数据需求
  • 出现数据错误,有以下原因
    • 录音设备故障,得到破损的音频文件
    • 人工操作失误,导致录制了纯噪声
    • 标签反转
  • 可以进行人工清洗,或自动化清洗。人工清洗对于标签反转是不可行的,而且效率低
  • 对于前两种错误,可以采用以下自动化清洗办法
    • 使用信噪比(Signal-to-noise Ratio,SNR)估计算法,例如:WADA-SNR,去除信噪比很低的音频
    • 使用VAD算法,去除无法触发VAD的音频
    • 使用语音识别(ASR)算法,去除文字结果为空,或者置信度很低的音频
  • 对于第三种错误,可采用自监督清洗,步骤如下:
    1. 先使用,已经去除前两种错误的数据,训练一个初始的说话人识别模型
    2. 利用初始的说话人识别模型,为数据中的每一个说话人,计算一个说话人的中心点,关于说话人的中心点,可参考说话人识别中的损失函数
    3. 如果某个说话人的音频,距离该说话人的中心点非常遥远,那么这个音频可能是标签反转噪声,需要去除
  • 自监督清洗有利有弊,优点在于效率高,缺点在于可能去除了困难样本

语音检测(VAD)

  • 在一段音频中,可能包含语音、静默和噪声,如下图所示:
  • 使用一个预训练好的VAD模型,去除静默和噪声的部分。VAD模型是对每一帧的二分类,去除那些分类为0的帧即可

特征提取与标准化

  • 特征提取是指从音频中提取出MFCC、LFBE或PLP这样的特征
  • 问题在于,应该在什么阶段进行特征提取,有两种做法:
    1. 离线特征提取

      • 在训练之前,把数据集中,所有音频的特征提取出来,储存到硬盘上
      • 训练时,直接读取这些特征,而不需要读取音频文件
      • 优点:
        • 提取出的特征可重复使用
        • 容易debug
      • 缺点:需要大量的额外硬盘空间
    2. 在线特征提取
      • 训练时,直接读取音频文件,再提取特征
      • 特征提取变为训练的一部分
      • 优点:不需要额外的硬盘空间
      • 缺点:
        • 每次训练,特征提取都需要重复计算
        • 训练过程变慢,消耗变大
        • 不容易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​−xmin​x−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]
  • 问题在于,为什么要这么做?深度学习开始蓬勃的第一篇文章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,需要一亿采集,这是不可接受的
  • 采用数据增强的方式产生数据:
    1. 使用一组参数描述一个房间,由于房间大多为立方体,所以可以用长度、宽度和高度来描述
    2. 确定信号源的位置,和录音设备的位置,可以用它们在房间中的立体坐标来描述
    3. 使用房间冲击响应(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∑M​ni​(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)数据

说话人识别中的数据预处理和数据增强相关推荐

  1. PyTorch源码解析--torchvision.transforms(数据预处理、数据增强)

    PyTorch框架中有一个很常用的包:torchvision torchvision主要由3个子包构成:torchvision.datasets.torchvision.models.torchvis ...

  2. 竞赛专题 | 数据预处理-如何处理数据中的坑?

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 为了帮助更多竞赛选手入门进阶比赛,通过数据竞赛提升理论实践能力和团队协作能力.Data ...

  3. 机器学习项目中的数据预处理与数据整理之比较

    要点 在常见的机器学习/深度学习项目里,数据准备占去整个分析管道的60%到80%. 市场上有各种用于数据清洗和特征工程的编程语言.框架和工具.它们之间的功能有重叠,也各有权衡. 数据整理是数据预处理的 ...

  4. Python数据分析中的数据预处理:数据标准化

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python数据分析中的 数据预处理:数据标准化 ● 选择题 以下关于 ...

  5. 数据预处理Part4——数据离散化

    文章目录 离散化,对数据做逻辑分层 1. 什么是数据离散化? 2. 为什么要将数据离散化 3. 如何将数据离散化? 3.1 时间数据离散化 3.2 多值离散数据离散化 3.3 连续数据离散化 3.4 ...

  6. 【Python实战】数据预处理(数据清理、集成、变换、归约)

    [Python实战]数据预处理 前言 数据预处理概述 数据清理 异常数据处理 1.异常数据分析 2.异常数据处理方法 缺失值处理 噪声数据处理 数据集成 1.实体识别 2.冗余属性 3.数据不一致 数 ...

  7. 数据预处理—-(数据探索、数据清理、数据集成、数据规约、数据变换)

    数据挖掘概念与技术 定义挖掘目标–>数据取样–>数据探索–>数据预处理–>挖掘建模–>模型评价 第一章.数据 挖掘的数据类型:时间序列,序列,数据流,时间空间数据,多媒体 ...

  8. 数据预处理Part2——数据标准化

    文章目录 数据标准化 1. 实现归一化的Max-Min 2. 实现中心化和正态分布的Z-Score 3. 用于稀疏数据的MaxAbs 4. 针对离群点的RobustScaler 5. 标准化后数据可视 ...

  9. 数据预处理Part9——数据降维

    文章目录 1. 什么是数据降维? 2. 为什么要进行数据降维? 3. 降维是如何实现的? 4. sklearn中的降维算法 4.1 主成分分析PCA 4.2 因子分析FA 4.3 独立成分分析ICA ...

  10. Pandas数据预处理与数据重塑案例

    Pandas数据预处理与数据重塑案例 前言   预处理是数据分析中不可缺少的一部分,我们日常得到的数据多半是规整的,只有得到想要的相应格式的数据,才能进行后续的探索性分析和建模.以下是我在一个小的项目 ...

最新文章

  1. 115页Slides带你领略深度生成模型全貌(附PPT)
  2. 文科生自学python要多久_怎么自学python,大概要多久?
  3. linux怎么创建vi脚本,Vim 创建Python脚本时候自动补全解释器和编码方法
  4. Cloud for Customer手机应用上传图片禁止从本地相册选择图片的核心代码
  5. 【Flink】Flink kafka报错 Auto-commit of offsets failed for group Offset commit failed with a retriable
  6. 【MySQL】MySQL STRAIGHT JOIN 使用案例以及简介
  7. android path拆分_Android架构进阶之路:Android 组件化方案探索与思考总结
  8. 【mysql优化 2】索引条件下推优化
  9. 每天一道剑指offer-顺时针打印矩阵
  10. 全网首发:JDK绘制文字:四、绘制文字的具体函数分析
  11. 剪辑师:入门级无水印无片头片尾免费视频剪辑工具
  12. 查看office2016是不是永久激活状态
  13. NULL,0,`0`,`\0`,0你分得清吗?
  14. 谷歌开发者大会焦点:TensorFlow.js可制作微信小程序,Android 10原生支持5G,TF2.0大更新...
  15. java字符串与数值型相互转换
  16. vsomeip+*.fidl+*.fdepl(3)
  17. PIN PIN2 PUK PUK2
  18. 毕业设计 stm32智能电子秤系统 - 物联网 嵌入式 单片机
  19. VIM 编辑器使用指南
  20. 中国软件外包IT公司最新排名

热门文章

  1. 05.17 佘山踏青“徒步爬山” 活动回顾
  2. Logistic Regression逻辑回归函数Python实现
  3. Linux gzip压缩输出
  4. 视频直播制作软件:MimoLive Mac v5.2b2
  5. DirectShow编程(2)- 开始DirectShow旅程
  6. java outer的使用
  7. Akaban操作系统(3)-----不按套路出牌的开发
  8. 数据处理方法-算术编码(香农算法、java编码实现)
  9. 警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
  10. R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)