プログラミングの勉強を始めて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 ソースコード
「最適な話者認識のグラフ」をもう少し言語化できますか?質問者様が作れているグラフはどういうもので、それだとどういうことに不向きであるため、どのようにしたい、といったこと、もしくは、見本としている理想のグラフを示してください。
https://qiita.com/koshian2/items/321690d8b94a77931bae
https://www.kouken-party.info/2017/12/25/2%E6%AC%A1%E5%85%83%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%97%E3%81%A6%E8%A6%8B%E3%82%8B%E3%82%84%E3%81%A4/
とかに、画像データを次元削減して2次元の散布図にプロットする例があります
mfccを画像として扱って上記のようにしてみたら、いけるかも
参考
https://medium.com/@LeonFedden/comparative-audio-analysis-with-wavenet-mfccs-umap-t-sne-and-pca-cb8237bfce2f
あなたの回答
tips
プレビュー