0 前言

   在做ASR和KWS实验时,必不可少的需要对语音数据预处理,提取特征(业内常见是提取为MFCC),最后再喂入模型中。数据预处理可分为离线处理和在线处理:

  • 离线处理: 训练之前先对语音数据进行加噪音、调低\高音量、1.5倍速播放等(有人用工具audiomentations),然后再提取MFCC特征到特征文件里(特征文件格式.h5,.csv),训练时数据集从特征文件读取,不需要再预处理了.
      优点: 只需提取特征一次就可以多次训练,时间减少很多;
      缺点: 每个epoch喂入模型的数据特征都是一样的(提取到特征文件,其实特征就被写死了),变相的降低了数据集可增强的空间,模型泛化能力会降低;
  • 在线处理: 对数据进行预处理,然后提取MFCC特征,最后喂入模型中。每一个epoch都会进行预处理,再喂入模型;
      优点: 数据集可增强空间变大(相当于有epoch个数据集),模型泛化能力强;
      缺点: 训练时间长,显存消耗大;

后面章节将介绍语音预处理、特征提取到特征文件

1 语音预处理

语音预处理常用工具是librosa或者audiomentations,下面将介绍基于audiomentations的数据预处理;

1.1 audiomentations简介

audiomentations工具是一款GitHub开源的语音处理工具,主要有

1.2 audiomentations增强语音数据

import audiomentations
import librosadef audio_preprocessing(file):""" file为wav语音文件,返回离散语音数据 """data , sr = librosa.core.load(file)  #  语音流转为离散数值augmenter = Compose([AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=0.5),TimeStretch(min_rate=0.8, max_rate=1.25, p=0.5),PitchShift(min_semitones=-4, max_semitones=4, p=0.5),Shift(min_fraction=-0.5, max_fraction=0.5, p=0.5),])return augmenter(audio, sample_rate=sr)  # 语音预处理,返回离散语音数据

2.特征提取到文件.h5

特征文件常见的有.h5,.npy, .txt, .csv等 ,前两种比较受欢迎,其读写速度都比较快,博客详细的介绍他们的性能;这里我采用.h5文件保存特征,但是.h5有一个问题,多线程读取一个文件时会出现报错:

据说.h5多线程本身的问题,因此需要用到多线程的需要注意。

2.1 节省空间小技巧

下面简单介绍下hdf5文件存储特征时,节省空间的小技巧。

  1. .h5文件数据保存格式默认是float64, 但实际上并不需要那么高精度,float32也足够了;
  2. 保存文件时采用gzip压缩格式,压缩级别设置到9;
  3. 最后就是chunks的设置,可以限定你文件都写都是放在一个块中,这个大大节约了空间;

2.2 语音数据特征提取为mel光谱图

博客详细的讲解了特征提取为MFCC的过程,这里简单介绍:

  1. 离散傅里叶变换FFT: FFT用于提取声音频谱信息,将语音流的时域序列转到频域表示;x轴为时间(每个点即表示一帧),y轴代表频率;
  2. 平方取功率谱;
  3. Mel滤波器: 将声音转换到Mel表示,更加符合人耳听觉特性(只对频率操作即可);
  4. 取对数增强低频数据;
  5. DCT离散余弦变换: 傅里叶的逆变换,得到系数向量,即倒谱系数;
  6. 偏微分: 偏微分可以丰富信息;
import librosadef extract_feature_1(file):""" file 为 数组"""melspectrogram = librosa.feature.melspectrogram(y=file, sr=16000, n_fft=2048, hop_length=1024)  # mel滤波s =librosa.power_to_db(melspectrogram)  # 取对数mfcc = librosa.feature.mfcc(S=s, n_mfcc=20)  # MFCC,这里其实可以一步到位,去掉melspectrogram、power_to_db操作都可以mfcc_delta = librosa.feature.delta(mfcc)mfcc_delta_delta = librosa.feature.delta(mfcc_delta)  # 偏微分mfcc_comb = np.concatenate([mfcc, mfcc_delta, mfcc_delta_delta], axis=0)return mfcc_comb

DCT变换只提取了频谱的包络信息,损失了大量声音细节,特征也失去了,因此在深度学习中,采用特征更加丰富的Mel谱信息作为特征更优。下面我们定义只提取到mei谱的特征函数。

import librosa
def extract_feature(file):""" file 为 数组"""melspectrogram = librosa.feature.melspectrogram(y=file, sr=16000, n_fft=2048, hop_length=1024, n_mels=40)  # mel滤波mel =librosa.power_to_db(melspectrogram)  # 取对数return mel

2.3 特征提取到文件

假设数据特征shape(1,40, 101),若没有补0.

import h5py
import audio_preprocessing,extract_featuredef extract_feature_to_h5(data)"""data为数组,存储的为语音wav文件 """### 预处理 audio_preprocessing()audio_data = []for wav in data:audio_data.append(audio_preprocessing(wav))### 特征提取features = []for wav in audio_data:item = extract_feature(wav)item = np.pad(data, (0, max(0, in_len - item.shape[1])), "constant")  # 数据格式对齐(1,40,101)features.appen(item.reshape(1,40,101))### 特征保存到文件.h5h5_train = h5py.File("Train.h5", 'w')  # 新建一个Train.h5文件h5_data = h5_train.create_dataset("data", data=[[[]]], maxshape=(None, 40, 101), chunks=(1,  40, 101), compression="gzip", compression_opts=9)  # 在.h5文件中创建data 数据集,后续需要重新添加数据,因此数据集大小不能写死maxshape=(None,101,40)中None说明可以随时写入数据集。for i, item in  enumerate(features):h5_data .resize((i+1,40, 101))h5_data [i] = itemh5_data.close()

语音识别数据预处理(添加噪音)和特征提取相关推荐

  1. 深入浅出Python机器学习9——数据预处理、降维、特征提取及聚类

    数据预处理 使用 StandScaler 进行数据预处理 首先手工生成一些数据:        用make_blobs 函数时,指定了样本数量 n_samples 为 40,分类 centers 为 ...

  2. 多特征值数据预处理_「人工智能」No.6 特征工程之数据预处理

    [导读:当今人类即将或者已然了进入智能时代,这是·情报通·人工智能科普系列第[6]篇文章,欢迎阅读和收藏!] 1 基本概念 "数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 ...

  3. python语音识别预处理_自然语言处理之数据预处理

    摘要: 数据预处理的整个步骤流程在自然语言处理的工程中要比其在机器学习的工程中精简一些,最大的区别就在数据清洗和特征构造这两个至关重要的过程.在自然语言处理中特征构造是否良好,很大程度上取决于所构造的 ...

  4. R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)

    R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录

  5. 说话人识别中的数据预处理和数据增强

    数据预处理 假设已经采集到一些数据,在进行训练之前,需要先对数据做以下预处理: 数据清洗 语音检测(Voice Activity Detection,VAD,也叫Speech Detection,或S ...

  6. Pandas 数据预处理

    Pandas数据处理 一 概述 1.1 业务建模流程 将业务抽象为分类or回归问题 定义标签,得到y 选取合适的样本,并匹配出全部的信息作为特征的来源 特征工程 + 模型训练 + 模型评价与调优(相互 ...

  7. 《Data Mining》第2章翻译 数据预处理

    2 数据预处理 "凡事预则立,不预则废."--孔子 2.1 简介 真实数据的原始格式通常变化很大.许多值可能会丢失,不同数据源之间不一致,并且是错误的.对于分析人员来说,这会在有效 ...

  8. 数据预处理和特征选择

    背景介绍 结合网上一些相关资料,我们整理输出了这篇文章,本文说明了数据的重要性以及数据在各个环节和领域地位.更重要的是,这篇文章会详尽的讲解数据预处理和特征选择的原理及方法细节. 数据是什么? 通过观 ...

  9. 使用Sklearn库学习数据预处理和特征工程

    目录 1,概述 1.1,数据预处理和特征工程 1.2,sklearn中的数据预处理和特征工程 2,数据预处理 Preprocessing & Impute 2.1,数据无量纲化 2.2,缺失值 ...

最新文章

  1. 关于Blocking IO, Non-Blocking IO 和 Asynchronous I/O的理解
  2. android graphic:canvas
  3. 9、使用GROUP BY分组查询
  4. Object类和常用API
  5. Exp3 免杀原理与实践
  6. 还要什么ETL?它是搭建数据仓库的必备,许多人都不知道!
  7. http://java.sun.com/jsp/jstl/core cannot be resolved(含有jstl1.2jar包网盘)
  8. Gccgo in GCC 4.7.1[翻译]
  9. sftp访问_实时数据处理探索:接收、处理、访问
  10. 自动检测删除微信好友:学会这些方法,别再花冤枉钱!
  11. Spring关于@required注解
  12. DirectSound学习(二)--流式缓冲区
  13. 互联网快讯:猿辅导推品牌“飞象星球”入局TO B市场;京东云首次发布物联网全景图;苹果更新App Store规则
  14. 不得转载可以转发吗_微信公众号可以复制转载别人的文章吗?如何转发其他公众号文章?...
  15. Axure的入门到精通(一)——基础使用及常用快捷键
  16. lingo子模型——数学模型4.7 例1 广告投入
  17. centos6.5卸载图形界面
  18. 邮箱验证(验证码验证)
  19. 12个基本的在线设计竞赛目录
  20. yuv显卡转换rgb

热门文章

  1. 金额平均分配算法 python实现
  2. K-Means(K-均值)聚类算法
  3. 如何删除鼠标右键的显示的快捷键或功能?
  4. java为什么匿名内部类的参数引用需要添加final?
  5. python-django 阿里云ECS服务器部署uwsgi+nginx过程解说
  6. git命令解决冲突解决
  7. Python3.7.4入门-4模块
  8. MTK平台修改开机动画,开机logo
  9. openfoam CourantNo.H
  10. AutoLeaders控制组—51单片机学习笔记