基本音声認識-食品音声認識baseline(CNN)
MFCC
メルトダウン係数(Mel-scaleFrequency Central Coefficients、MFCCと略称する)。
MFCCは通常以下のプロセスがある。は、音声信号の一部を複数のメッセージボックスに分解する。 は、音声信号を事前に強化し、高域フィルタを通過する。 は、フーリエ変換を行い、信号を周波数領域に変換する。 は、各メッセージボックスで得られたスペクトルを、メルフィルタ(三角重なりウィンドウ)を介して、メル目盛を得る。 は、各メル目盛に対数エネルギーを抽出する。 は、上記で得られた結果を離散的フーリエ逆変換し、逆スペクトル領域に変換する。 MFCCはこの逆スペクトル図の振幅である。一般的に12つの係数を使用して、メッセージボックスのエネルギーと13次元の係数を重畳する。
データセット
データ集はEating Sound Collectionから来ました。データ集には20種類の異なる食べ物の咀嚼音が含まれています。課題はこれらの音声データのモデリングで、正確に分類します。
カテゴリは、aloe、ice-cream、ribs、chocollate、cabage、candied_を含みます。frits、soup、jely、grapps、piza、gmmies、salmon、wings、burger、pickles、carrots、fries、chips、noodles、drinks
トレーニングセットのサイズ:750
テストセットのサイズ:250
1ダウンロードと解凍データセット
カテゴリラベル辞書を作成
Yの特徴サイズは:(1000、)
独熱コード
(1000,20)
データセットをトレーニングセットとテストセットに分けます。
テストセットのサイズ250
CNNネットワークを構築する
トレーニングモデル
ここでは、基本的な音声認識-食品音声認識baseline(CNN)の記事を紹介します。音声認識に関する内容は、以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。
メルトダウン係数(Mel-scaleFrequency Central Coefficients、MFCCと略称する)。
MFCCは通常以下のプロセスがある。
データセット
データ集はEating Sound Collectionから来ました。データ集には20種類の異なる食べ物の咀嚼音が含まれています。課題はこれらの音声データのモデリングで、正確に分類します。
カテゴリは、aloe、ice-cream、ribs、chocollate、cabage、candied_を含みます。frits、soup、jely、grapps、piza、gmmies、salmon、wings、burger、pickles、carrots、fries、chips、noodles、drinks
トレーニングセットのサイズ:750
テストセットのサイズ:250
1ダウンロードと解凍データセット
!wget http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531887/train_sample.zip
!unzip -qq train_sample.zip
!\rm train_sample.zip
!wget http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531887/test_a.zip
!unzip -qq test_a.zip
!\rm test_a.zip
2ライブラリ関数の読み込み
#
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split #
from sklearn.metrics import classification_report #
from sklearn.model_selection import GridSearchCV #
from sklearn.preprocessing import MinMaxScaler #
学習フレームの読み込み
#
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D, Dropout
from tensorflow.keras.utils import to_categorical
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC #
!pip install librosa --user #
#
import os
import librosa #
import librosa.display
import glob
3特徴抽出及びデータセットの確立カテゴリラベル辞書を作成
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 tqdm
def extract_features(parent_dir, sub_dirs, max_file=10, file_ext="*.wav"):
c = 0
label, 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]
#
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 label
temp = extract_features(parent_dir,sub_dirs,max_file=100)
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)
Xの特徴サイズは:(1000,128)Yの特徴サイズは:(1000、)
独熱コード
# Keras :to_categorical ( 0 1)
Y = to_categorical(Y)
print(X.shape)
print(Y.shape)
(1000,128)(1000,20)
データセットをトレーニングセットとテストセットに分けます。
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))
トレーニングセットのサイズ750テストセットのサイズ250
X_train = X_train.reshape(-1, 16, 8, 1)
X_test = X_test.reshape(-1, 16, 8, 1)
4モデルを作るCNNネットワークを構築する
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
# , ,
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.summary()
トレーニングモデル
#
model.fit(X_train, Y_train, epochs = 100, batch_size = 15, validation_data = (X_test, Y_test))
5予測テストセット
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 feature
X_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
6の結果ここでは、基本的な音声認識-食品音声認識baseline(CNN)の記事を紹介します。音声認識に関する内容は、以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。