プログラミングの勉強を始めて3か月の初心者です。現在、Pythonで音声データを学習して話者の性別を認識をするプログラムを作っています。
mfccをsvmにて学習させています。
教師データ、テストデータ、境界線をplotしてグラフで確認する方法を調べているのですが、最適な方法が見つからないため教えて頂きたいです。
import numpy as np import librosa import librosa.display import os import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn import svm from scipy import fftpack dir_name = 'wav' #音声データを読み込む speakers={'man':0,'woman':1} #特徴量を返す def get_feat(file_name): a, sr = librosa.load(file_name) y=librosa.feature.mfcc(y=a,sr=sr) return y #特徴量と分類のラベル済みのラベルの組みを返す def get_data(dir_name): data_X = [] data_y = [] for file_name in sorted(os.listdir(path=dir_name)): print("read:{}".format(file_name)) speaker = file_name[0:file_name.index('_')] data_X.append(get_feat(os.path.join(dir_name, file_name))) data_y.append((speakers[speaker], file_name)) #return (np.array(data_X), np.array(data_y)) return (data_X, data_y) data_X, data_y = get_data(dir_name) # 教師データとテストデータに分ける train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, random_state=11813813) print("{} -> {}, {}".format(len(data_X), len(train_X), len(test_X))) # 各時間に対応する成分をそれぞれ1つの特徴量として分割する def split_feat(data_X, data_y): data_X2 = [] data_y2 = [] for X, y in zip(data_X, data_y): X2 = X.T y2 = np.array([y[0]] * X.shape[1]) data_X2.append(X2) data_y2.append(y2) data_X2 = np.concatenate(data_X2) data_y2 = np.concatenate(data_y2) return (data_X2, data_y2) train_X2, train_y2 = split_feat(train_X, train_y) #教師用データをプロットする fig = plt.figure() ax = fig.add_subplot(1,1,1) count=0 for label in train_y2: freq=0 if label==0: c='blue' if label==1: c='red' plt.plot(train_X2[count], c) count+=1 plt.show() plt.savefig("mfcc.png") clf = svm.SVC(gamma =0.00000001, C=1000) clf.fit(train_X2, train_y2) def predict(X): result = clf.predict(X.T) return np.argmax(np.bincount(result)) ok_count = 0 for X, y in zip(test_X, test_y): actual =predict(X) expected = y[0] file_name = y[1] ok_count += 1 if actual == expected else 0 result = 'o' if actual == expected else 'x' print("{} file: {}, actual: {}, expected: {}".format(result, file_name, actual, expected)) print("{}/{}".format(ok_count, len(test_X))) ### 該当のソースコード ```Python ソースコード
あなたの回答
tips
プレビュー