1 changed files with 203 additions and 0 deletions
@ -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) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue