You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.1 KiB
130 lines
4.1 KiB
import librosa
|
|
import scipy.signal as signal
|
|
import tensorflow as tf
|
|
from tensorflow.keras.models import Sequential
|
|
from tensorflow.keras.layers import Dense
|
|
import numpy as np
|
|
|
|
x_train = []
|
|
y_train = []
|
|
chords = ['C', 'D', 'E', 'F', 'G', 'A', 'B', 'HC']
|
|
path = '/Users/seungwoomun/Documents/MYC/train/Grand Piano/'
|
|
paths = '/Users/seungwoomun/Documents/MYC/train/Grand Piano/C_1.wav'
|
|
|
|
# file_name = ["C_1.wav", "D_1.wav"]
|
|
# 도는 [1,0], 레는 [0,1]로 설정한다
|
|
lable = [[1, 0, 0, 0, 0, 0, 0, 0], # 도 C
|
|
[0, 1, 0, 0, 0, 0, 0, 0], # 레 D
|
|
[0, 0, 1, 0, 0, 0, 0, 0], # 미 E
|
|
[0, 0, 0, 1, 0, 0, 0, 0], # 파 F
|
|
[0, 0, 0, 0, 1, 0, 0, 0], # 솔 G
|
|
[0, 0, 0, 0, 0, 1, 0, 0], # 라 A
|
|
[0, 0, 0, 0, 0, 0, 1, 0], # 시 B
|
|
[0, 0, 0, 0, 0, 0, 0, 1]] # 도 HC
|
|
|
|
# train data 생성
|
|
for index in range(len(chords)):
|
|
audio_sample, sampling_rate = librosa.load(path + chords[index] + '_1.wav', sr = 44100)
|
|
input_data = np.abs(librosa.stft(audio_sample, n_fft = 2048, hop_length = 1024, win_length = 2048, window=signal.hann))
|
|
|
|
# input_data의 배열 형태를 알아본다
|
|
shape = np.shape(input_data)
|
|
nb_samples = shape[0]
|
|
nb_windows = shape[1]
|
|
|
|
# [nb_samples][nb_windows] 형태이므로, 딥러닝을 수행하기 위한 배열 형태 [nb_windows][nb_samples]로 맞춰준다
|
|
input_data = input_data.T
|
|
|
|
# 학습용 레이블 배열을 생성한다
|
|
lable_tmp = [lable[index] for row in range(nb_windows)]
|
|
|
|
# 하나의 배열로 합친다
|
|
if index == 0:
|
|
x_train = input_data
|
|
y_train = lable_tmp
|
|
else:
|
|
x_train = np.r_[x_train, input_data]
|
|
y_train = np.r_[y_train, lable_tmp]
|
|
|
|
# test data 생성
|
|
for indexs in range(len(chords)):
|
|
audio_sample2, sampling_rate2 = librosa.load(path + chords[indexs] + '_3.wav', sr = 44100)
|
|
input_data2 = np.abs(librosa.stft(audio_sample2, n_fft = 2048, hop_length = 1024, win_length = 2048, window=signal.hann))
|
|
|
|
# input_data의 배열 형태를 알아본다
|
|
shape2 = np.shape(input_data2)
|
|
nb_samples2 = shape2[0]
|
|
nb_windows2 = shape2[1]
|
|
|
|
# [nb_samples][nb_windows] 형태이므로, 딥러닝을 수행하기 위한 배열 형태 [nb_windows][nb_samples]로 맞춰준다
|
|
input_data2 = input_data2.T
|
|
|
|
# 학습용 레이블 배열을 생성한다
|
|
lable_tmp2 = [lable[indexs] for row in range(nb_windows2)]
|
|
|
|
# 하나의 배열로 합친다
|
|
if indexs == 0:
|
|
x_test = input_data2
|
|
y_test = lable_tmp2
|
|
else:
|
|
x_test = np.r_[x_test, input_data2]
|
|
y_test = np.r_[y_test, lable_tmp2]
|
|
|
|
# print(x_train.shape)
|
|
# print(y_train.shape)
|
|
# print(x_test.shape)
|
|
# print(y_test.shape)
|
|
|
|
# model 생성
|
|
model = Sequential()
|
|
|
|
model.add(Dense(units = 1025, input_dim = 1025)) # input_shape = (513, )
|
|
model.add(Dense(units = 128, activation = 'relu'))
|
|
model.add(Dense(8, activation = 'softmax'))
|
|
# model.add(Dense(128, activation = 'relu'))
|
|
# model.add(Dense(8, input_dim = 128, activation = 'relu'))
|
|
# model.add(Dense(1, activation = 'sigmoid'))
|
|
|
|
model.summary()
|
|
|
|
model.compile(optimizer = 'sgd', loss = 'mse', metrics = ['acc'])
|
|
|
|
# x_train = [[2, 4, 8], [3, 6, 9], [4, 8, 12]]
|
|
# y_train = [[2], [3], [4]]
|
|
# x_test = [[2, 4, 8]]
|
|
|
|
# 학습
|
|
model.fit(x_train, y_train, epochs = 500, verbose = 1, validation_data = (x_test, y_test)) # batch_size = 257
|
|
|
|
# 평가
|
|
print("####### Model 평가 #######")
|
|
loss, acc = model.evaluate(x_test, y_test)
|
|
print("복원된 모델의 정확도: {:5.2f}%".format(100 * acc))
|
|
|
|
# 검증
|
|
print("####### Model 검증 #######")
|
|
for i in range(255, 300) :
|
|
test = np.array([x_test[i]])
|
|
# print(test)
|
|
print(model.predict(test))
|
|
|
|
# model 저장
|
|
# model.save('DNN_Model_2048_500.h5')
|
|
|
|
# W = tf.Variable(tf.random.normal([1]), name="weight")
|
|
# b = tf.Variable(tf.random.normal([1]), name="bias")
|
|
|
|
# hypothesis=x_train*W+b
|
|
|
|
# cost = tf.reduce_mean(tf.square(hypothesis - y_train))
|
|
# sgd = tf.keras.optimizers.SGD(learning_rate=0.01)
|
|
|
|
# model = Sequential()
|
|
|
|
# model.add(Dense(1, input_dim = 1))
|
|
|
|
# model.compile(loss='mean_squared_error',optimizer=sgd)
|
|
|
|
# model.fit(x_train,y_train,epochs=10)
|
|
|
|
# print(model.predict(np.array([5])))
|