From 483dfc3dde02ba9e29270331cc1b59aff2eb69a5 Mon Sep 17 00:00:00 2001 From: city1616 Date: Thu, 1 Jul 2021 19:02:58 +0900 Subject: [PATCH] =?UTF-8?q?code=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/use_Model.py | 203 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100755 code/use_Model.py diff --git a/code/use_Model.py b/code/use_Model.py new file mode 100755 index 0000000..b69ed3d --- /dev/null +++ b/code/use_Model.py @@ -0,0 +1,203 @@ +import tensorflow as tf +import numpy as np +import librosa +import scipy.signal as signal +from operator import itemgetter +from pyknon.genmidi import Midi +from pyknon.music import NoteSeq, Note, Rest +import music21 + +filename = 'title.wav' + +def print_pdf(filename) : + chords = ['C', 'D', 'E', 'F', 'G', 'A', 'B', 'HC'] + path1 = '/Users/seungwoomun/Documents/MYC/train/Grand Piano/' + path2 = '/Users/seungwoomun/Documents/MYC/train/Classical Grand/' + path3 = '/Users/seungwoomun/Documents/MYC/train/test_wav/' + path4 = '/Users/seungwoomun/Documents/MYC/train/Electric Piano/' + path5 = '/Users/seungwoomun/Documents/MYC/code/wav/' + 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 + test_pred = [] + test_result = [] + music = '' + # filename = 'star_1.wav' + + # X, Y 데이터 추출 + audio_sample, sampling_rate = librosa.load(path5 + filename, sr = None) + input_data = np.abs(librosa.stft(audio_sample, n_fft = 1024, hop_length = 512, win_length = 1024, window = signal.hann)) + + filename = filename.replace('.wav',"") + + # 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[0] for row in range(nb_windows)] + + # 하나의 배열로 합친다 + + x_test = np.array(input_data) + y_test = np.array(lable_tmp) + + model = tf.keras.models.load_model("./DNN_Model_500.h5") + + print("####### Model 평가 #######") + loss, acc = model.evaluate(x_test, y_test) + print("모델의 정확도: {:5.2f}%".format(100 * acc)) + + + prediction = model.predict(x_test) + + # 예측값에서 음계 구분 + for i in prediction : + if i.argmax() == 0: + test_pred.append("도") + # test_pred = np.r_["도"] + elif i.argmax() == 1 : + test_pred.append("레") + # test_pred = np.r_["레"] + elif i.argmax() == 2 : + test_pred.append("미") + # test_pred = np.r_["미"] + elif i.argmax() == 3 : + test_pred.append("파") + # test_pred = np.r_["파"] + elif i.argmax() == 4 : + test_pred.append("솔") + # test_pred = np.r_["솔"] + elif i.argmax() == 5 : + test_pred.append("라") + # test_pred = np.r_["라"] + elif i.argmax() == 6 : + test_pred.append("시") + # test_pred = np.r_["시"] + elif i.argmax() == 7 : + test_pred.append("h_도") + # test_pred = np.r_["h_도"] + + # 예측값에서 음계 개수 추출 + # print(test_pred) + # print(len(test_pred)) + # print(test_pred[448]) + print(np.shape(test_pred)) + print("도 : " + str(test_pred.count("도"))) + print("레 : " + str(test_pred.count("레"))) + print("미 : " + str(test_pred.count("미"))) + print("파 : " + str(test_pred.count("파"))) + print("솔 : " + str(test_pred.count("솔"))) + print("라 : " + str(test_pred.count("라"))) + print("시 : " + str(test_pred.count("시"))) + print("h_도 : " + str(test_pred.count("h_도"))) + + # 이전 음계 추출 + # for i in range(0, len(test_pred) - 1) : + # if test_pred[i] != test_pred[i + 1] : + # test_result.append(test_pred[i]) + + # if i + 1 == len(test_pred) - 1 : + # test_result.append(test_pred[i + 1]) + + toc = 0 + # coc = 0 + # 최종 음계 추출 + for i in range(0, len(test_pred) - 1) : + if test_pred[i] == test_pred[i + 1] : + toc += 1 + # coc += 1 + else : + toc = 0 + # coc = 0 + + if toc >= 40 : + toc = 0 + test_result.append(test_pred[i]) + + # if toc >= 40 and toc < 50 : + # toc = 0 + # if coc > 80 : + # coc = 0 + # else : + # test_result.append(test_pred[i]) + + # if toc >= 30 : + # toc = 0 + # # test_result.append(test_pred[i]) + # elif toc >= 20 and toc < 25 : + # toc = 0 + # test_result.append(test_pred[i]) + + print(test_result) + print(np.shape(test_result)) + print("음 개수 : " + str(len(test_result))) + + # midi file 생성 + notes = NoteSeq(music) + + # midi file 생성을 위한 구분 + for index in test_result : + if index == '도' : + # music = music + 'C4' + notes.append(Note(12, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == '레' : + # music = music + 'D4' + notes.append(Note(14, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == '미' : + # music = music + 'E4' + notes.append(Note(16, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == '파' : + # music = music + 'F4' + notes.append(Note(17, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == '솔' : + # music = music + 'G4' + notes.append(Note(19, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == '라' : + # music = music + 'A4' + notes.append(Note(21, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == '시' : + # music = music + 'B4' + notes.append(Note(23, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + elif index == 'h_도' : + # music = music + 'C4' + notes.append(Note(24, octave = 4, dur = 1/4)) # 21 A 22 A# 23 B 24 C + # music = music + ' ' + + # notes.append(Note(24, octave = 4, dur = 1/8)) # 21 A 22 A# 23 B 24 C + + midi = Midi(number_tracks = 1, tempo = 90) + midi.seq_notes(notes, track = 0) + midi.write('Midi/' + filename + '.mid') + + # Midi to pdf + us = music21.environment.UserSettings() # music21 환경 설정 + + midi_file = music21.converter.parse('Midi/' + filename + '.mid') + midi_file.insert(0, music21.metadata.Metadata()) + midi_file.metadata.title = 'Make Your Chord' + midi_file.metadata.composer = 'MYC' + midi_file.write('musicxml.pdf', fp = 'pdf/'+ filename + '.pdf') + print(midi_file) + # index, value = max(enumerate(prediction[0]), key = itemgetter(1)) + # print(index, value) + + # # for i in x_test : + + # 검증 + # print("####### Model 검증 #######") + # for i in range(0, len(x_test)) : + # test = np.array([x_test[i]]) + # # print(test) + # print(model.predict(test)) + +print_pdf(filename) \ No newline at end of file