아이랑AIRang
모두를 위한 딥러닝 기반 동요 작곡 작사 서비스
작곡
위 프로젝트에서는 구글에서 제공하는 Magenta Project를 사용하여 작곡을 진행하였다.
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 로 작성한다.
훈련용과 평가용 예제가 만들어졌다면, 이제 모델 훈련으로 넘어간다.
생성된 훈련용 데이터로 모델을 훈련하는 방법은 다음과 같다. --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이다.
그럼 이제 곡을 만들어보자. 동요 산토끼의 반주 코드 "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
이렇게 MIDI 파일 형식으로 원하는 갯수만큼 output을 얻을 수 있다. 아래는 만들어낸 결과물 중 일부로, 순서대로 악보 이미지와 MIDI다. 악보는 Musescore를 사용하여 만들었다. AI랑은 작곡과 작사를 동시에 진행하기 때문에, GPT3를 통해 얻어낸 가사를 결합하였다.
MIDI 파일을 들어보면 모든 곡이 다 다른 느낌임을 알 수 있다. 또한, 입력한 반주 코드에 따라 성조 역시 잘 잡아내는 것을 확인할 수 있다. 곡을 생성하는 경우의 수가 상당히 많기 때문에(하나의 박자 당 4개의 step - 음 갯수 또한 다양하며, 음의 길이 또한 세분화할 수 있다) 수많은 output을 만들어도 겹치는 노래를 만들기는 어렵다.
Magenta 사용 (2) (0) | 2021.01.18 |
---|---|
마젠타 - Melody RNN (0) | 2021.01.17 |
Magenta 사용 (1) (0) | 2021.01.10 |
[AI랑] 작곡 (1) (0) | 2020.11.27 |
댓글 영역