失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 零基础入门语音识别-食物声音识别

零基础入门语音识别-食物声音识别

时间:2021-10-03 01:05:41

相关推荐

零基础入门语音识别-食物声音识别

task1 Baseline

基准 (baseline) 一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

0.训练集

!wget http://tianchi-competition.oss-cn-/531887/train_sample.zip!wget http://tianchi-competition.oss-cn-/531887/test_a.zip!wget http://tianchi-competition.oss-cn-/531887/train.zip

解压缩

!unzip -qq train_sample.zip!\rm train_sample.zip!unzip -qq test_a.zip!\rm test_a.zip!unzip -qq train.zip!\rm train.zip

1.环境

天池DSW

TensorFlow的版本:2.0 +

keras

sklearn

librosa

TensorFlow是由 Google Brain 团队为深度神经网络(DNN)开发的功能强大的开源软件库.还有很多其他的深度学习库,如 Torch、Theano、Caffe 和

MxNet,包括 TensorFlow 在内的大多数深度学习库能够自动求导、开源、支持多种

CPU/GPU、拥有预训练模型,并支持常用的NN架构,如递归神经网络(RNN)、卷积神经网络(CNN)和深度置信网络(DBN)。

Keras是一个由Python编写的开源人工神经网络库(框架),可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化

keras

pip install keras

Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality

Reduction)、分类(Classfication)、聚类(Clustering)等方法

如果已经安装NumPy和SciPy,安装scikit-learn:

pip install -U scikit-learn

librosa是一个用于音频、音乐分析、处理的python工具包,包含常见的时频处理、特征提取、绘制声音图形等功能

2.import

基本库

import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom sklearn.model_selection import GridSearchCVfrom sklearn.preprocessing import MinMaxScaler

加载深度学习框架

from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D, Dropoutfrom tensorflow.keras.utils import to_categorical from sklearn.ensemble import RandomForestClassifierfrom sklearn.svm import SVC

其他库

import osimport librosaimport librosa.displayimport glob

特征提取以及数据集的建立

feature = []label = []# 建立类别标签,不同类别对应不同的数字。label_dict = {'aloe': 0, 'burger': 1, 'cabbage': 2,'candied_fruits':3, 'carrots': 4, 'chips':5,'chocolate': 6, 'drinks': 7, 'fries': 8, 'grapes': 9, 'gummies': 10, 'ice-cream':11,'jelly': 12, 'noodles': 13, 'pickles': 14, 'pizza': 15, 'ribs': 16, 'salmon':17,'soup': 18, 'wings': 19}label_dict_inv = {v:k for k,v in label_dict.items()}

from tqdm import tqdmdef extract_features(parent_dir, sub_dirs, max_file=10, file_ext="*.wav"):c = 0label, feature = [], []for sub_dir in sub_dirs:for fn in tqdm(glob.glob(os.path.join(parent_dir, sub_dir, file_ext))[:max_file]): # 遍历数据集的所有文件# segment_log_specgrams, segment_labels = [], []#sound_clip,sr = librosa.load(fn)#print(fn)label_name = fn.split('/')[-2]label.extend([label_dict[label_name]])X, sample_rate = librosa.load(fn,res_type='kaiser_fast')mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 计算梅尔频谱(mel spectrogram),并把它作为特征feature.extend([mels])return [feature, label]

MFCC(Mel-frequency cepstral coefficients):梅尔频率倒谱系数。梅尔频率是基于人耳听觉特性提取出来的, 它与Hz频率成非线性对应关系。梅尔频率倒谱系数(MFCC)则是利用它们之间的这种关系,计算得到的Hz频谱特征。主要用于语音数据特征提取和降低运算维度。例如:对于一帧有512维(采样点)数据,经过MFCC后可以提取出最重要的40维(一般而言)数据同时也达到了将维的目的。

MFCC一般会经过这么几个步骤:预加重,分帧,加窗,快速傅里叶变换(FFT),梅尔滤波器组,离散余弦变换(DCT).其中最重要的就是FFT和梅尔滤波器组,这两个进行了主要的降维操作。

np.mean()函数:求取均值

mean() 函数定义:

numpy.mean(a, axis, dtype, out,keepdims )

其中axis参数:

axis 不设置值,对 mn 个数求均值,返回一个实数

axis = 0:压缩行,对各列求均值,返回 1n 矩阵

axis =1 :压缩列,对各行求均值,返回 m *1 矩阵

# 自己更改目录parent_dir = './train_sample/'save_dir = "./"folds = sub_dirs = np.array(['aloe','burger','cabbage','candied_fruits','carrots','chips','chocolate','drinks','fries','grapes','gummies','ice-cream','jelly','noodles','pickles','pizza','ribs','salmon','soup','wings'])# 获取特征feature以及类别的labeltemp = extract_features(parent_dir,sub_dirs,max_file=100)

np.array():创建一个数组

numpy.array(object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0)

object:数组,公开数组接口的任何对象,__array__方法返回数组的对象,或任何(嵌套)序列。

dtype : 数据类型,可选

数组所需的数据类型。如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型。此参数只能用于“upcast”数组。对于向下转换,请使用.astype(t)方法。

copy : bool,可选

如果为true(默认值),则复制对象。否则,只有当__array__返回副本,obj是嵌套序列,或者需要副本来满足任何其他要求(dtype,顺序等)时,才会进行复制。

order : {‘K’,‘A’,‘C’,‘F’},可选

指定阵列的内存布局。如果object不是数组,则新创建的数组将按C顺序排列(行主要),除非指定了’F’,在这种情况下,它将采用Fortran顺序(专业列)。如果object是一个数组,则以下成立。

当copy=False出于其他原因而复制时,结果copy=True与对A的一些例外情况相同,默认顺序为“K”。

subok : bool,可选.如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。

ndmin : int,可选.指定结果数组应具有的最小维数。根据需要,将根据需要预先设置形状。

返回值:out:ndarray,满足要求的数组对象

temp = np.array(temp)data = temp.transpose()

# 获取特征X = np.vstack(data[:, 0])# 获取标签Y = np.array(data[:, 1])print('X的特征尺寸是:',X.shape)print('Y的特征尺寸是:',Y.shape)

# 在Keras库中:to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示Y = to_categorical(Y)

'''最终数据'''print(X.shape)print(Y.shape)

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state = 1, stratify=Y)print('训练集的大小',len(X_train))print('测试集的大小',len(X_test))

X_train = X_train.reshape(-1, 16, 8, 1)X_test = X_test.reshape(-1, 16, 8, 1)

建立模型

搭建CNN网络

CNN:用于特征提取

CNN(Conv)

pooling:池化层,提取最大值

model = Sequential()# 输入的大小input_dim = (16, 8, 1)model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷积层model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷积层model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层model.add(Dropout(0.1))model.add(Flatten()) # 展开model.add(Dense(1024, activation = "tanh"))model.add(Dense(20, activation = "softmax")) # 输出层:20个units输出20个类的概率

# 编译模型,设置损失函数,优化方法以及评价标准pile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

利用keras搭建CNN,

model.summary()

预测测试集

def extract_features(test_dir, file_ext="*.wav"):feature = []for fn in tqdm(glob.glob(os.path.join(test_dir, file_ext))[:]): # 遍历数据集的所有文件X, sample_rate = librosa.load(fn,res_type='kaiser_fast')mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 计算梅尔频谱(mel spectrogram),并把它作为特征feature.extend([mels])return featureX_test = extract_features('./test_a/')

X_test = np.vstack(X_test)predictions = model.predict(X_test.reshape(-1, 16, 8, 1))preds = np.argmax(predictions, axis = 1)preds = [label_dict_inv[x] for x in preds]path = glob.glob('./test_a/*.wav')result = pd.DataFrame({'name':path, 'label': preds})result['name'] = result['name'].apply(lambda x: x.split('/')[-1])result.to_csv('submit.csv',index=None)

!ls ./test_a/*.wav | wc -l!wc -l submit.csv

如果觉得《零基础入门语音识别-食物声音识别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。