상세 컨텐츠

본문 제목

[AI랑] 모두를 위한, 딥러닝 기반 동요 작곡작사 서비스 - 작곡

프로젝트/Ai랑

by yunyuno3o 2021. 5. 18. 23:22

본문

아이랑AIRang

모두를 위한 딥러닝 기반 동요 작곡 작사 서비스

 


 

작곡 

위 프로젝트에서는 구글에서 제공하는 Magenta Project를 사용하여 작곡을 진행하였다. 

 

마젠타

github.com/magenta/magenta

 

magenta/magenta

Magenta: Music and Art Generation with Machine Intelligence - magenta/magenta

github.com

마젠타는 학습이 완료된 다양한 모델을 제공하고 있지만, AI랑은 곡의 장르가 동요로 좁혀져있는 만큼 수집한 데이터셋(MIDI 파일)을 기반으로 많은 모델 중 Improv RNN을 학습시키고자 한다. Melody RNN과 비교하였을 때 노래의 완성도를 높이고 분위기를 선택할 수 있다는 점에서 해당 모델을 선택하였다. 

 

마젠타의 작곡 모델은 LSTM 언어 모델을 사용하는데, 이는 음악의 특성 때문이다. 하나의 음표를 만들어내기 위해 이전 멜로디 구성을 반영하여 작성해야 하는 것이 그 특성인데, LSTM은 네트워크가 정보를 오랜 시간동안 기억하기 때문에 연속된 데이터 구조인 음악을 작곡하는 데 용이하다. 

 

마젠타를 사용하는 방법은 많지만, 여기서는 로컬에서 설치하여 모델 훈련부터 작곡 생성까지 진행해보도록 한다. 설치 명령어는 cmd창에서 pip install magenta를 주면 끝이다. 

 

 

데이터셋 생성하기

github.com/magenta/magenta/blob/master/magenta/scripts/README.md

 

magenta/magenta

Magenta: Music and Art Generation with Machine Intelligence - magenta/magenta

github.com

마젠타는 MIDI 파일이 아닌 NoteSequence라는 데이터 포맷을 사용한다. NoteSequence는 빠르고 효율적인 프로토콜 버퍼로, MIDI 파일보다 사용하기 쉽다. 아래의 코드를 통해 MusicXML 파일이나 MIDI 파일을 NoteSequences 파일 형식으로 변환할 수 있다. Melody RNN은 멜로디를 만들어내는 것이기 때문에 MIDI 파일로도 충분했지만, 이보다 더 발전된 모델인 Improv RNN은 Lead sheet (반주 코드가 작성되어있는 악보 데이터) 형태의 데이터만을 필요로 한다. 따라서 MusicXML 형태의 데이터를 사용한다. 

 

훈련용 데이터를 수집했다면, 다음 코드로 데이터 처리를 진행할 수 있다.

 

깃허브 제공 코드

여기서 input_dir은 훈련용 데이터가 들어있는 폴더로, --input_dir = "폴더 위치" 를 입력해주면 된다. sequences_tfrecord는 데이터 프로세싱이 완료된 NoteSequences 파일을 생성할 폴더 위치를 의미한다. 보통 "./tmp/notesequences.tfrecord"로 넣어준다. 위 과정이 끝나면 input data 수와 관계없이 하나의 file로 아웃풋을 내준다. 

 

 

 

훈련용, 평가용 예제 만들기

NoteSequence 파일을 만들었다면 해당 데이터를 이용하여 훈련, 평가용 예제를 만들 수 있다. eval_ratio라는 패러미터를 사용하여 그 양을 조절할 수 있는데, 아래처럼 0.10을 주는 경우 90%는 훈련용, 10%는 평가용으로 분류된다. 

Improv RNN 중에서도 세 개의 모델로 나뉘어지는데, 그게 config에 작성된 모델들이다. 이 프로젝트에서는 chord_pitches_improv를 사용했으므로 --config = chord_pitches_improv 로 작성한다. 

 

깃허브 제공 코드

 

cmd창 실행 결과

 

훈련용과 평가용 예제가 만들어졌다면, 이제 모델 훈련으로 넘어간다. 

 

 

 

모델 훈련 및 평가

 

생성된 훈련용 데이터로 모델을 훈련하는 방법은 다음과 같다.  --hparams는 하이퍼 패러미터로, batch size, layer size, learning rate 등 다양한 패러미터가 들어있다. batch size의 default 값은 128이지만, 메모리 사용을 조금 더 줄이고 모델 훈련 속도를 올리기 위하여 64로 지정하였다. learning rate는 별다른 설정을 주지 않으면 0.001이다. 

 

improv_rnn_train \ --config=chord_pitches_improv \ --run_dir=./tmp/improv_rnn/logdir/run1 \
--sequence_example_file=./tmp/improv_rnn/sequence_examples/training_lead_sheets.tfrecord \
--hparams="batch_size=64,rnn_layer_sizes=[64,64]" \ --num_training_steps=20000

 

훈련하기 위해서는 최소 100개의 data가 필요하다(테스트용으로 25개의 midi를 사용하여 훈련을 시도해보았으나 에러를 출력함). 모델 훈련은 하루종일 걸리므로 가능하다면 텐서플로우 GPU를 설치한 후에 진행하는 것을 추천한다. evaluation 진행 코드는 sequence_example_file을 평가용 데이터로 지정해주고, 코드 마지막에 \ --eval을 붙여주면 된다. 

 

텐서플로우 보드를 통해 훈련 및 평가 데이터를 눈으로 확인할 수 있다. 

tensorboard --logdir=./tmp/improv_rnn/logdir
→http://localhost:6006

 

평가까지 완료되었다면, 이제 이 모델을 bundle format(모델의 체크포인트, 메타그래프, 메타데이터 등을 하나로 묶은 파일) 형식으로 묶어 저장해야한다. 마젠타는 .mag 파일 형식을 사용하고 있기 때문에 다음 코드를 이용하여 번들 파일을 생성한다.

이 코드에서 사용한 방식은 깃허브(https://github.com/magenta/magenta/blob/master/magenta/models/shared/sequence_generator.py)에서 제공하는 방법이다. 

 

improv_rnn_generate \ --config=chord_pitches_improv \ --run_dir=./tmp/improv_rnn/logdir/run1 \
--hparams="batch_size=64,rnn_layer_sizes=[64,64]" \ --bundle_file=./tmp/improv_rnn.mag \
--save_generator_bundle

 

 

 

작곡 진행 - 반주 코드 사용

 

깃허브 제공 코드

 

모델이 완성되었다면, 이제 작곡을 진행할 차례다. Improv RNN은 기본적으로 output의 갯수(num_output), 시작음(primer_melody, 한 음이 아니라 여러 음이어도 된다), 반주 코드를 input으로 넣게 된다. --steps_per_chord를 사용하여 하나의 반주 코드가 담당하는 step 수를 조절할 수 있는데, 기본적으로 16 steps다. 여기서 step이란 하나의 음을 재생할지, 끊을지 등을 의미하는 것으로, 이를 통해 16분 음표부터 더 긴 음표까지 생성할 수 있고 쉼표까지 만들어낸다.

 

1박 당 4개의 step이 해당 RNN의 기본 설정이므로 우리는 하나의 반주 코드가 4개의 4분 음표를 커버한다는 걸 알 수 있다. 따라서 반주 코드를 한 마디로 둘 때, 기본적으로 작곡되는 곡은 모두 4/4박자의 노래이다. 시작음은 MIDI에서 사용하는 Note numbers를 이용한다. 시작음의 default 값은 [60]으로, 5옥타브 C이다. 

 

MIDI에서 사용되는 note numbers

 

그럼 이제 곡을 만들어보자. 동요 산토끼의 반주 코드 "C C G C C C G7 C"와 시작음 [67]을 input 데이터로 준다. 다음 코드는 num_output=10으로 설정하였기 때문에 총 10개의 곡을 얻어낸다. 

 

improv_rnn_generate \ --config=chord_pitches_improv \
--bundle_file=./pre-trained_test/chord_pitches_improv.mag \ --output_dir=./tmp/improv_rnn/generated \
--num_outputs=10 \ --primer_melody=”[67]” \ --backing_chords=" C C G C C C G7 C" \ --render_chords

 

cmd창 실행 결과
코드 결과물 10개

이렇게 MIDI 파일 형식으로 원하는 갯수만큼 output을 얻을 수 있다. 아래는 만들어낸 결과물 중 일부로, 순서대로 악보 이미지와 MIDI다. 악보는 Musescore를 사용하여 만들었다. AI랑은 작곡과 작사를 동시에 진행하기 때문에, GPT3를 통해 얻어낸 가사를 결합하였다. 

 

악보 1
악보 1 MIDI - 산토끼 반주.mid
0.00MB

 

악보 2
악보 2 MIDI - 산토끼 반주.mid
0.00MB

 

악보 3
악보 3 MIDI - 산토끼 반주.mid
0.00MB

 

악보 4
악보 4 MIDI - 산토끼 반주.mid
0.00MB

 

 

MIDI 파일을 들어보면 모든 곡이 다 다른 느낌임을 알 수 있다. 또한, 입력한 반주 코드에 따라 성조 역시 잘 잡아내는 것을 확인할 수 있다. 곡을 생성하는 경우의 수가 상당히 많기 때문에(하나의 박자 당 4개의 step - 음 갯수 또한 다양하며, 음의 길이 또한 세분화할 수 있다) 수많은 output을 만들어도 겹치는 노래를 만들기는 어렵다. 

 

 

'프로젝트 > Ai랑' 카테고리의 다른 글

Magenta 사용 (2)  (0) 2021.01.18
마젠타 - Melody RNN  (0) 2021.01.17
Magenta 사용 (1)  (0) 2021.01.10
[AI랑] 작곡 (1)  (0) 2020.11.27

관련글 더보기

댓글 영역