Path: blob/master/site/ko/tutorials/audio/music_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
RNN으로 음악 생성
이 튜토리얼은 간단한 순환 신경망(RNN)을 사용하여 음표를 생성하는 방법을 보여줍니다. MAESTRO 데이터세트의 피아노 MIDI 파일 컬렉션을 사용하여 모델을 훈련합니다. 음표 시퀀스가 주어지면 모델은 시퀀스의 다음 음표를 예측하는 방법을 학습합니다. 모델을 반복적으로 호출하여 더 긴 음표 시퀀스를 생성할 수 있습니다.
이 튜토리얼에는 MIDI 파일을 구문 분석하고 생성하는 전체 코드가 포함되어 있습니다. RNN으로 텍스트 생성하기 튜토리얼에서 RNN의 작동 방식에 대해 자세히 알아볼 수 있습니다.
설정
이 튜토리얼은 사용 pretty_midi
만들고 MIDI 파일 및 구문 분석 라이브러리 pyfluidsynth
Colab에서 오디오 재생을 생성합니다.
Maestro 데이터 세트 다운로드
데이터 세트에는 약 1,200개의 MIDI 파일이 포함되어 있습니다.
MIDI 파일 처리
먼저, pretty_midi
를 사용하여 단일 MIDI 파일을 구문 분석하고 음표 형식을 검사합니다. 아래 MIDI 파일을 다운로드하여 컴퓨터에서 재생하려면 colab에서 files.download(sample_file)
을 작성하여 다운로드할 수 있습니다.
샘플 MIDI 파일에 대한 PrettyMIDI
개체를 생성합니다.
샘플 파일을 재생합니다. 재생 위젯을 로드하는 데 몇 초가 걸릴 수 있습니다.
MIDI 파일을 검사하십시오. 어떤 종류의 악기가 사용됩니까?
메모 추출
모델을 훈련할 때 음표를 나타내기 위해 세 가지 변수(pitch
, step
및 duration
)를 사용합니다. 피치는 MIDI 음표 번호로서의 사운드의 지각적 품질입니다. step
는 트랙의 이전 음표 또는 시작 부분에서 경과된 시간입니다. duration
은 음표가 재생되는 시간(초)이며 음표 종료 시간과 음표 시작 시간의 차이입니다.
샘플 MIDI 파일에서 음표를 추출합니다.
음높이보다는 음표 이름을 해석하는 것이 더 쉬울 수 있으므로 아래 기능을 사용하여 숫자 음높이 값에서 음표 이름으로 변환할 수 있습니다. 음표 이름은 음표 유형, 우발적 및 옥타브 번호(예: C#4)를 나타냅니다.
악곡을 시각화하려면 트랙 길이(즉, 피아노 롤)에 걸쳐 음표 피치, 시작 및 끝을 플롯합니다. 처음 100개의 메모로 시작
전체 트랙에 대한 메모를 플로팅합니다.
각 음표 변수의 분포를 확인하십시오.
MIDI 파일 생성
아래 기능을 사용하여 음표 목록에서 자신만의 MIDI 파일을 생성할 수 있습니다.
생성된 MIDI 파일을 재생하여 차이점이 있는지 확인합니다.
이전과 마찬가지로 files.download(example_file)
를 작성하여 이 파일을 다운로드하고 재생할 수 있습니다.
훈련 데이터 세트 생성
MIDI 파일에서 메모를 추출하여 교육 데이터 세트를 만듭니다. 적은 수의 파일을 사용하여 시작하고 나중에 더 많은 파일로 실험할 수 있습니다. 몇 분 정도 걸릴 수 있습니다.
다음으로, 구문 분석된 메모에서 tf.data.Dataset을 만듭니다.
모델에 음표 시퀀스 배치에 대한 내용을 학습시킵니다. 각 예제는 일련의 음표가 입력 특성으로, 다음 음표가 레이블로 구성됩니다. 이런 식으로 모델은 시퀀스의 다음 음표를 예측하도록 훈련됩니다. 이 과정과 자세한 내용을 설명하는 다이어그램은 RNN을 사용한 텍스트 분류에서 확인할 수 있습니다.
크기가 seq_length
편리한 창 함수를 사용하여 이 형식으로 기능과 레이블을 만들 수 있습니다.
각 예의 시퀀스 길이를 설정합니다. 다른 길이(예: 50, 100, 150)로 실험하여 어느 것이 데이터에 가장 적합한지 확인하거나 초 매개변수 조정을 사용합니다. 어휘 (크기 vocab_size
)에 의해 지원되는 모든 피치 나타내는 128로 설정 pretty_midi
.
데이터 세트의 모양은 (100,1)
. 즉, 모델은 100개의 메모를 입력으로 사용하고 다음 메모를 출력으로 예측하는 방법을 학습합니다.
예제를 일괄 처리하고 성능을 위해 데이터 세트를 구성합니다.
모델 생성 및 학습
모델에는 각 음표 변수에 대해 하나씩 3개의 출력이 있습니다. step
및 duration
의 경우 모델이 음이 아닌 값을 출력하도록 권장하는 평균 제곱 오차를 기반으로 하는 사용자 정의 손실 함수를 사용합니다.
model.evaluate
함수를 테스트하면 pitch
step
및 duration
손실보다 훨씬 큰 것을 알 수 있습니다. loss
은 다른 모든 손실을 합산하여 계산된 총 손실이며 현재 pitch
손실이 지배합니다.
이 균형을 유지하는 한 가지 방법은 loss_weights
인수를 사용하여 컴파일하는 것입니다.
loss
후 개별 손실의 가중 합이된다.
모델을 훈련시킵니다.
메모 생성
모델을 사용하여 메모를 생성하려면 먼저 메모의 시작 순서를 제공해야 합니다. 아래 함수는 일련의 음표에서 하나의 음표를 생성합니다.
음표 피치의 경우 모델로 생성힌 음표의 소프트맥스 분포에서 샘플을 추출하며 단순히 가장 높은 확률의 음표를 선택하지 않습니다. 항상 가장 높은 확률의 음표를 선택하면 음표 시퀀스가 반복적으로 생성될 수 있습니다.
temperature
매개변수는 생성된 음표의 무작위성을 제어하는 데 사용할 수 있습니다. RNN을 사용한 텍스트 생성 에서 온도에 대한 자세한 내용을 찾을 수 있습니다.
이제 몇 가지 메모를 생성합니다. next_notes
에서 온도와 시작 순서를 가지고 놀고 무슨 일이 일어나는지 볼 수 있습니다.
아래 두 줄을 추가하여 오디오 파일을 다운로드할 수도 있습니다.
생성된 메모를 시각화합니다.
pitch
, step
, duration
의 분포 를 확인 하십시오 .
위의 플롯에서 음표 변수 분포의 변화를 확인할 수 있습니다. 모델의 출력과 입력 사이에 피드백 루프가 있기 때문에 모델은 손실을 줄이기 위해 유사한 출력 시퀀스를 생성하는 경향이 있습니다. 이는 특히 MSE 손실을 사용하는 step
및 duration
과 관련이 있습니다. pitch
의 경우 predict_next_note
에서 temperature
를 높여 임의성을 높일 수 있습니다.
다음 단계
이 튜토리얼은 RNN을 사용하여 MIDI 파일 데이터 세트에서 일련의 음표를 생성하는 방법을 보여주었습니다. 자세히 알아보려면 추가 다이어그램과 설명이 포함 된 RNN 자습서로 밀접하게 관련된 텍스트 생성을 방문하세요.
음악 생성에 RNN을 사용하는 대안 중 하나는 GAN을 사용하는 것입니다. GAN 기반 접근 방식은 오디오를 생성하는 대신 전체 시퀀스를 병렬로 생성할 수 있습니다. Magenta 팀은 GANSynth를 사용하여 이 접근 방식에 대한 인상적인 작업을 수행했습니다. Magenta 프로젝트 웹사이트에서 멋진 음악 및 예술 프로젝트와 오픈 소스 코드를 많이 확인할 수도 있습니다.