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

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

推荐将本项目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)

Your browser does not support the audio element.

预测值: 5     真实值: 5

Your browser does not support the audio element.

预测值: 2     真实值: 2

Your browser does not support the audio element.

预测值: 9     真实值: 9测试集准确率: 0.9066666666666666

6.总结

本项目基于寂寞你快进去的音频分类:英文数字语音分类项目进行,在此基础上进行了相应的简化,并将paddle版本由1.8.4升级为2.4.0。

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

此文章为搬运
原项目链接

语音分类:全流程英文数字音频分类相关推荐

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

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

  2. Keras花卉分类全流程(预处理+训练+预测)

    本文的代码包括以下内容的示例: 1.用一个类封装自己的模型和训练.预测等过程 2.使用图片生成器(ImageDataGenerator)进行数据预处理,这一功能是Keras很 方面的地方,省去了自己进 ...

  3. 数字音频技术:混音器

    混音器是处理音频的一种装置,分为软件类型和硬件类型.由于原理不同,软件类型的混音器和硬件类型的混音器的应用也大不相同,前者主要用于音频处理,后者主要用于音响设置. 软件类型的混音器 软件类型的混音器, ...

  4. Python数据分析案例18——化学分子数据模型(机器学习分类问题全流程)

    1. 引言 1.1设计背景 对分子进行分类,对于筛选特定疾病的候选药物是至关重要的.传统的机器学习算法可以对分子进行分类,但是分子不能直接作为机器学习模型的输入,需要进行大量的实验从分子中得到一系列的 ...

  5. 【飞桨PaddleSpeech语音技术课程】— 一句话语音合成全流程实践

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 一句话语音合成全流程实践 点击播放视频 1 声音克隆介绍 & 语音合成基本概念回顾 语音合成(Speech ...

  6. 《飞桨PaddleSpeech语音技术课程》一句话语音合成全流程实践

    一句话语音合成全流程实践 PaddleSpeech r1.2.0 发新内容 1 声音克隆介绍 & 语音合成基本概念回顾 语音合成(Speech Sysnthesis),又称文本转语音(Text ...

  7. 2016年GitHub上史上最全的Android开源项目分类汇总

    以下内容为转载 版主原网址 http://itindex.net/detail/51896-github-android-开源 GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时 ...

  8. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  9. 网络语音流隐写分析全流程 (Steganalysis of VoIP Speech Streams)

    欢迎访问我的个人博客:https://hi.junono.com/ AMR隐写数据集地址(Kaggle) 网络语音流隐写分析全流程 隐写分析流程介绍: 基本知识 **基于网络语音(VoIP)流的隐写术 ...

最新文章

  1. 图解ZooKeeper!小学生也能看懂!
  2. Ajax请求SSM后台传值方式踩坑
  3. Effective JavaScript Item 33 让构造函数不再依赖newkeyword
  4. 程序员面试HR你该看重什么?!
  5. 利用ajax,巧妙的sql语句组合,轻松做出不错的树型菜单
  6. matlab中load seamout,matlab中的save与load函数
  7. 头条2020届实习生笔试题
  8. java mysql insert id_MySQL和Java-获取最后插入值的ID(JDBC)[重复]
  9. 在 Android 中使用生物识别,kotlin开发思维
  10. 解读“统一价格分评审方法”
  11. 什么是线程安全?如何保证线程安全?
  12. 交易结算金额一致性保证
  13. vue实现简单搜索功能
  14. SSLOJ 1323.交流
  15. 深度学习(3):不同分类模型的评价指标(F1、Recall、P)
  16. Google Chrome谷歌浏览器导入csv账号密码
  17. Windows目录下文件夹详解
  18. 查看matlab当前路径,Matlab 如何查找当前路径下文件夹
  19. HashMap的实际应用
  20. 【学习笔记】《深入浅出Pandas》第17章:Pandas实战案例

热门文章

  1. 【学习记录】Origin8.0 安装流程(附赠所需安装包以及免安装包)
  2. 20230303英语学习
  3. 漫画:什么是摩尔斯电码?
  4. 如何用纯 CSS 创作一台拍立得照相机
  5. MTK平台adb固定cpu频率及核数
  6. 推特 我们目前不能注册此邮箱地址_试玩手游版LOL,媲美端游的质量,这份注册攻略须收藏...
  7. WAV系列之二:ADPCM编解码原理及代码实现
  8. 哈工大 c语言测控系统 输入一个数x,其小于10^100,哈工大C语言试题.doc
  9. 小厨房设计软件测试,面积小于10㎡的小厨房的设计之道,好看又好用!
  10. 【绝对实用】百度网盘下载助手