语音分类入门案例: 英文数字音频分类

本项目是一个全流程的语音分类项目,内容简单,适合想要涉猎音频分类的小白学习。

推荐将本项目Fork成为自己的项目并运行,以获得更好的学习体验!! 项目地址:语音分类入门:全流程英文数字音频识别

1. 解压数据集

我们使用的数据集是FSDD(free-spoken-digit-dataset),
FSDD是一个简单的音频/语音数据集,由 8kHz 文件中的语音数字记录组成。内含由6位音频录制人员录制的3000条数字(0-9)的英语发音音频数据(每人50条)。

!unzip data/data176422/FSDD.zip

2.配置环境依赖

  • 需要安装python_speech_features库,这是一个强大的音频处理库,我们进行持久化安装
!pip install python_speech_features -t  /home/aistudio/external-libraries
import sys
sys.path.append('/home/aistudio/external-libraries') #将持久化安装的库加入环境中import paddle
import os
from tqdm import tqdm
import random
from glob import glob
import numpy as np
import matplotlib.pyplot as plt
from functools import partial
from IPython import display
import soundfile
from python_speech_features import mfcc, delta # 导入音频特征提取工具包
import scipy.io.wavfile as wav

3.数据加载与处理

3.1 音频数据展示,绘制波形

example_path='FSDD/0_george_14.wav'# 读取音频
# fs--采样率 signal--音频信号
fs, signal = wav.read(example_path)
print('这段音频的采样率为:%d' % fs)
print('音频信号:', signal)
print('音频信号形状:', signal.shape)# 绘制波形
import matplotlib.pyplot as plt
plt.figure(figsize=(8,2))
x = [_ for _ in range(len(signal))]
plt.plot(x, signal)
plt.show()
这段音频的采样率为:8000
音频信号: [ 12  39 179 ...  83  68 114]
音频信号形状: (4304,)

3.2 划分数据集

  • 获取音频文件名称列表
  • 打乱音频文件名称列表
  • 训练集:验证集:测试集=0.9:0.05:0.05
#获取音频文件名称列表
data_path='FSDD'
wavs = glob("{}/*.wav".format(data_path), recursive=True)
print(type(wavs),wavs[0])# 打乱音频文件名称列表
random.shuffle(wavs)
wavs_len=len(wavs)
print("总数据数量:\t",wavs_len)#训练集:验证集:测试集=0.9:0.05:0.05
# 训练集
train_wavs=wavs[:int(wavs_len*0.9)]
# 验证集
val_wavs=wavs[int(wavs_len*0.9):int(wavs_len*0.95)]
# 测试集
test_wavs=wavs[int(wavs_len*0.95):]print("训练集数目:\t",len(train_wavs),"\n验证集数目:\t",len(val_wavs),"\n测试集数目:\t",len(test_wavs))
<class 'list'> FSDD/1_george_13.wav
总数据数量:   3000
训练集数目:   2700
验证集数目:   150
测试集数目:   150

3.3 MFCC特征提取

MFCC(Mel Frequency Cepstral Coefficent)是一种在自动语音和说话人识别中广泛使用的特征。

关于MFCC比较详细的介绍文档可以参考:语音信号处理之(四)梅尔频率倒谱系数(MFCC)

# MFCC特征提取
def get_mfcc(data, fs):# MFCC特征提取wav_feature =  mfcc(data, fs)# 特征一阶差分d_mfcc_feat = delta(wav_feature, 1)# 特征二阶差分d_mfcc_feat2 = delta(wav_feature, 2)# 特征拼接feature = np.concatenate([wav_feature.reshape(1, -1, 13), d_mfcc_feat.reshape(1, -1, 13), d_mfcc_feat2.reshape(1, -1, 13)], 0)# 对数据进行截取或者填充if feature.shape[1]>64:feature = feature[:, :64, :]else:feature = np.pad(feature, ((0, 0), (0, 64-feature.shape[1]), (0, 0)), 'constant')# 通道转置(HWC->CHW)feature = feature.transpose((2, 0, 1))return feature# 读取音频
fs, signal = wav.read(example_path)
# 特征提取
feature = get_mfcc(signal, fs)
print('特征形状(CHW):', feature.shape,type(feature))
特征形状(CHW): (13, 3, 64) <class 'numpy.ndarray'>

3.4 音频转向量,标签提取

def preproess(wavs):datalist=[]lablelist=[]for w in tqdm(wavs):lablelist.append([int(w[5])])fs, signal = wav.read(w)f = get_mfcc(signal, fs)datalist.append(f)return np.array(datalist),np.array(lablelist)train_data,train_lable=preproess(train_wavs)
val_data,val_lable=preproess(val_wavs)
test_data,test_lable=preproess(test_wavs)#print(type(train_data),train_lable[0])
100%|██████████| 2700/2700 [01:34<00:00, 28.65it/s]
100%|██████████| 150/150 [00:05<00:00, 28.87it/s]
100%|██████████| 150/150 [00:05<00:00, 27.83it/s]

3.5 组装数据集

class MyDataset(paddle.io.Dataset):"""步骤一:继承paddle.io.Dataset类"""def __init__(self,audio,text):"""步骤二:实现构造函数,定义数据集大小"""super(MyDataset, self).__init__()self.text = textself.audio = audiodef __getitem__(self, index):"""步骤三:实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)"""return self.audio[index],self.text[index]def __len__(self):"""步骤四:实现__len__方法,返回数据集总数目"""return self.audio.shape[0]
def prepare_input(inputs):src=np.array([inputsub[0] for inputsub in inputs]).astype('float32')trg=np.array([inputsub[1] for inputsub in inputs])return src,trgtrain_dataset = MyDataset(train_data,train_lable)
train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True,drop_last=True,collate_fn=partial(prepare_input))val_dataset = MyDataset(val_data,val_lable)
val_loader = paddle.io.DataLoader(val_dataset, batch_size=64, shuffle=True,drop_last=True,collate_fn=partial(prepare_input))
for i,data in enumerate(train_loader):for d in data:print(d.shape)break
[64, 13, 3, 64]
[64, 1]

4.组装网络

4.1 使用CNN网络

class audio_Net(paddle.nn.Layer):def __init__(self):super(audio_Net, self).__init__()self.conv1 = paddle.nn.Conv2D(13, 16, 3, 1, 1)self.conv2 = paddle.nn.Conv2D(16, 16, (3, 2), (1, 2), (1, 0))self.conv3 = paddle.nn.Conv2D(16, 32, 3, 1, 1)self.conv4 = paddle.nn.Conv2D(32, 32, (3, 2), (1, 2), (1, 0))self.conv5 = paddle.nn.Conv2D(32, 64, 3, 1, 1)self.conv6 = paddle.nn.Conv2D(64, 64, (3, 2), 2)self.fc1 = paddle.nn.Linear(8*64, 128)self.fc2 = paddle.nn.Linear(128, 10)# 定义前向网络def forward(self, inputs):out = self.conv1(inputs)out = self.conv2(out)out = self.conv3(out)out = self.conv4(out)out = self.conv5(out)out = self.conv6(out)out = paddle.reshape(out, [-1, 8*64])out = self.fc1(out)out = self.fc2(out)return out

4.2 查看网络结构

audio_network=audio_Net()
paddle.summary(audio_network,input_size=[(64,13,3,64)],dtypes=['float32'])
W1112 12:44:10.491739   269 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W1112 12:44:10.494805   269 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Conv2D-1      [[64, 13, 3, 64]]     [64, 16, 3, 64]         1,888
Conv2D-2      [[64, 16, 3, 64]]     [64, 16, 3, 32]         1,552
Conv2D-3      [[64, 16, 3, 32]]     [64, 32, 3, 32]         4,640
Conv2D-4      [[64, 32, 3, 32]]     [64, 32, 3, 16]         6,176
Conv2D-5      [[64, 32, 3, 16]]     [64, 64, 3, 16]        18,496
Conv2D-6      [[64, 64, 3, 16]]      [64, 64, 1, 8]        24,640
Linear-1         [[64, 512]]           [64, 128]           65,664
Linear-2         [[64, 128]]            [64, 10]            1,290
===========================================================================
Total params: 124,346
Trainable params: 124,346
Non-trainable params: 0
Input size (MB): 0.61
Forward/backward pass size (MB): 6.32
Params size (MB): 0.47
Estimated Total Size (MB): 7.40
---------------------------------------------------------------------------
{'total_params': 124346, 'trainable_params': 124346}

4.3 模型训练

epochs = 20 model=paddle.Model(audio_network)model.prepare(optimizer=paddle.optimizer.Adam(learning_rate=0.001,parameters=model.parameters()),loss=paddle.nn.CrossEntropyLoss(), metrics=paddle.metric.Accuracy())model.fit(train_data=train_loader, epochs=epochs,eval_data= val_loader,verbose =2,log_freq =100,callbacks=[paddle.callbacks.VisualDL('./log')]


5.预测

bingo_num=0
for i in range(test_data.shape[0]):x=paddle.to_tensor([test_data[i]],dtype='float32')out=audio_network(x)out=paddle.nn.functional.softmax(out,axis=-1)out=paddle.argmax(out)if i<3:fs, signal = wav.read(test_wavs[i])display.display(display.Audio(signal, rate=fs))print("预测值:",out.numpy()[0],"\t 真实值:",test_lable[i][0])if out.numpy()[0]==test_lable[i][0]:bingo_num+=1print("\n测试集准确率:",bingo_num/150)
预测值: 5     真实值: 5
预测值: 2    真实值: 2
预测值: 9    真实值: 9
测试集准确率: 0.9066666666666666

6.总结

本项从0搭建一个全流程的音频分类模型,重点展示音频文件的读取与处理过程,适合想涉猎音频的领域的小白学习。

语音分类入门案例: 英文数字音频分类相关推荐

  1. 语音分类:全流程英文数字音频分类

    语音分类入门案例: 英文数字音频分类 本项目是一个全流程的语音分类项目,内容简单,适合想要涉猎音频分类的小白学习. 推荐将本项目Fork成为自己的项目并运行,以获得更好的学习体验!! 1. 解压数据集 ...

  2. 机器学习入门案例:鸢尾花数据集分类 绘制PR曲线

    案例使用鸢尾花数据集进行分类预测,并绘制评价分类性能的PR曲线图 认识分类任务和数据集 Iris(鸢尾花)数据集 案例演示中使用的是有监督的机器学习算法:SVM 支持向量机 建立模型的流程如下: 训练 ...

  3. halcon19.11深度学习关于分类入门案例

    目录 halcon19.11深度学习分类 关于配置环境 准备训练集 训练数据集 评估模型 测试模型 halcon19.11深度学习分类 关于配置环境 首先,如果你想使用halcon19.11学习深度学 ...

  4. 热文 | 卷积神经网络入门案例,轻松实现花朵分类

    作者 | 黎国溥 责编 | 寇雪芹 出品 | AI 科技大本营(ID:rgznai100) 前言 本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类:使用到TF的花 ...

  5. CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init、ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录

    CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init.ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录 目录 基于 ...

  6. 【Kaldi 新手入门】手把手教你搭建简易英文数字ASR系统

    * 写作本文的目的:一方面是为了帮助Kaldi的新手更好的入门这个语音识别工具,另一方面是为自己的学习做一个笔记,也方便日后的学习查阅. * Kaldi的下载安装 备注: 虽然Kaldi可以同时运行在 ...

  7. 使用深度学习进行音频分类的端到端示例和解释

    声音分类是音频深度学习中应用最广泛的方法之一.它包括学习对声音进行分类并预测声音的类别.这类问题可以应用到许多实际场景中,例如,对音乐片段进行分类以识别音乐类型,或通过一组扬声器对短话语进行分类以根据 ...

  8. 使用google的bert结合哈工大预训练模型进行中文/英文文本二分类,基于pytorch和transformer

    使用bert的哈工大预训练模型进行中文/英文文本二分类,基于pytorch和transformer 前提 简要介绍 开始 导入必要的包和环境 准备并读取数据 导入模型的tokenizer 对数据进行t ...

  9. 文本分类入门(四)训练Part 1

    文本分类入门(四)训练Part 1 训练,顾名思义,就是training(汗,这解释),简单的说就是让计算机从给定的一堆文档中自己学习分类的规则(如果学不对的话,还要,打屁屁?). 开始训练之前,再多 ...

最新文章

  1. 【bzoj4939】【YNOI2016】掉进兔子洞(莫队)
  2. python获取系统时间函数_简单记录python的时间函数操作
  3. 服务器不显示内存条,服务器检测不到内存条
  4. Swift 2.3- 3.0
  5. Android开发之Scroller
  6. Vscode在Windows上配置远程开发
  7. Unity3D实现按钮切换Panel的功能
  8. Qone 自动删除说说脚本
  9. 为什要学习烹饪?学习烹饪迫在眉睫
  10. 台大matlab教程笔记
  11. 频收罚单的浦发银行:增收不增利,曾遭骗贷数亿元,内控缺位?
  12. 深刻揭露步态识别的“谎言”(篇一)
  13. Python cx_Oracle执行的sql字符串拼接含分号导致报“ORA-01756“引号内的字符串没有正确结束
  14. Solidworks工程图模板之自定义文件属性与零件图关联
  15. 求两个列表的交集、并集和补集
  16. Android M 六大新特性
  17. 计算机视觉面试宝典--文本检测与GAN篇
  18. 第四章 WEB表单(二)
  19. 中国最缺大学的重点城市
  20. 镜湖资本吴幽:集齐这六颗钻石、你就能成为区块链领域的灭霸

热门文章

  1. 计算机英语 resume,计算机英语简历
  2. 直接从网站下载视频的方法
  3. 接入层网络用于讲家庭用户计算机,根据寄生虫的方法,计算机病毒分为引导区型病毒,文件型病毒和寄生虫病毒...
  4. kindle推送服务
  5. pyspark使用anaconda后spark-submit方法
  6. 微信长按识别二维码 -- 页面多个二维码如何识别?
  7. 飞凌嵌入式 全志A40i开发板试用体验 之 模块初体验
  8. PHP 接口和抽象类的区别
  9. python爬虫(上课笔记)
  10. Java中的八大包装类(Wrapper)