예술가를 위한 머신러닝 – 음악가, 작가, 화가를 위한 딥러닝 1. 시리즈 개요와 AI 음악 🎵

[샵투월드 AI 연구소] 예술가를 위한 머신러닝 – 음악가, 작가, 화가를 위한 딥러닝

1. 시리즈 개요와 AI 음악

시작하면서.

AI는 예술가들의 창조성의 새로운 도구가 될 것입니다.

마치 19세기 전까지 화가들은 블루 색상 안료를 비싸고 귀한 청금석을 이용해야만 하다가 19세기 화학적 안료의 발명으로 누구나 사용할 수 있게 되었듯이,

또 전기의 발명으로 비디오 아트 , 디지털 아트 등의 범위가 넓어진 것처럼, 또  음악에선 레코딩 등 그 지평이 넓어진것 처럼 인공지능은 예술가들의 활동 범위를 넓히게 될 것입니다.

여러분은 저와 함께 딥러닝의 힘을 즐겨보도록 하겠습니다.

푸른색 안료의 사용을 위해 화가분께서 그 화학식을 이해할 필요 없듯이 여기서는 단순히 구글 콜랩을 이용해 여러분의 예술의 영역의 표현도구로 사용하는 데 촛점을 두고 진행하겠습니다. 여러분은 일부 매개 변수와, 값 및 소스를 변경하면서 , AI의 무한한 가능성을 즐기게 됩니다.

이 연재물은 음악가, 작가, 화가분들이 머신러닝의 직접적인 이해 없이도 접근할 수 있는 도구 제공의 목적으로 시작되었습니다.

만약 이런 도구 사용방법이 아닌 근본적인 머신러닝의 기초 부터 배우시고 싶으신 분은 샵투의 “왕초보 머신러닝 강좌“를 참고 하세요. 무료 입니다. 또한 머신러닝을 실제

적용하길 원하시는 분은 머신러닝 데이터 사이언스 웹앱 제작을 참고하세요.

작품 제목: 재벌된 꿈 꾼 후에 , 작가 : 인공지능 , 모델: 에이미

우리는 이 연재물에서 위와 같은 작업을 하게 됩니다. 위의 작품은

우리 인간이 연속된 패턴을 발견하는 뇌 신경의 속성을 적용하여 만들어진 작품으로

연재를 통해 살펴보는 내용 중 하나입니다. 여러분은 이런 패턴 구조 적용 방식을 머신러닝 알고리즘에 대한 이해 없이 사용할 수 있게 됩니다.

예술가들이 기술이 아닌 작품 자체에만 신경쓰면 되는 것이 이 연재의 목적입니다.

 

그럼 먼저 이번 시간에는 음악을 한번 AI로 접근해 보겠습니다.

 

 

Magenta: 마젠타: 변압기와 음악

마젠타(Magenta)는 구글의 오픈소스 프로젝트로서, 인공지능을 이용한 음악 창작을 지원하는 라이브러리와 툴킷입니다. Magenta를 사용하여 MIDI 파일 생성하는 코드는 다음과 같습니다.

# 필요한 라이브러리 설치
!pip install magenta

# Magenta에서 제공하는 예제 코드 사용
import magenta
from magenta.models.melody_rnn import melody_rnn_sequence_generator
from magenta.models.shared import sequence_generator_bundle
from magenta.protobuf import generator_pb2
from magenta.protobuf import music_pb2


# 모델 경로와 설정
BUNDLE_NAME = 'attention_rnn'
MODEL_NAME = 'attention_rnn'
BUNDLE_PATH = sequence_generator_bundle.read_bundle_file(f'./{BUNDLE_NAME}.mag')
CONFIG = BUNDLE_PATH.generator_details

# Sequence Generator 초기화
generator = melody_rnn_sequence_generator.MelodyRnnSequenceGenerator(
    model=sequence_generator_bundle.read_bundle_file(f'./{MODEL_NAME}.mag'),
    details=config.details,
    steps_per_quarter=config.steps_per_quarter,
    checkpoint=None)

# Sequence Generation을 위한 설정
generate_section = music_pb2.NoteSequence()
generate_section.ticks_per_quarter = 220
generate_section.tempos.add().qpm = 120

# 생성할 음악 정보 입력
generator_options = generator_pb2.GeneratorOptions()
generator_options.args['temperature'].float_value = 1.0
generator_options.generate_sections.add(start_time=0, end_time=30)

# 음악 생성
sequence = generator.generate(generate_section, generator_options)

이 코드는 Magenta에서 제공하는 예제 코드를 기반으로 하며, MelodyRNN 모델을 사용하여 MIDI 파일을 생성합니다. 코드 실행 전에 Magenta 라이브러리를 설치해야 합니다. MIDI 파일을 생성하면, 다양한 프로그램을 사용하여 연주하거나 WAV 파일로 변환할 수 있습니다.

 

 

마젠타 홈페이지

https://magenta.tensorflow.org/

 

여러분은 아래의 “실습해 보기” 링크를 통해 간단하게 실행해 볼 수 있습니다.

다만 구글 콜랩을 한번도 안해 보신 분이면 먼저 딱 4분 15초만 시간을 내 주셔서

다음의 동영상 강좌를 봐 주시고 시작하세요.  또는 이미 하실 줄 아시는 분은 아래의 실습해 보기로 바로 가 주시기 바랍니다.

 

실습해 보기

인공지능 작가 만들기

텐서플로우는 구글이 개발한 딥러닝 프레임워크로, 인공지능 모델을 쉽게 구현할 수 있도록 해줍니다. 이 예시 프로그램은 텐서플로우를 이용하여 인공지능 작가를 만드는 방법을 보여줍니다.
텐서플로우를 이용하여 LSTM(Long Short-Term Memory) 모델을 학습시켜 텍스트를 생성하는 예시 프로그램입니다. 이 예시 프로그램은 셰익스피어의 작품을 학습하여 새로운 텍스트를 생성합니다.

import tensorflow as tf
import numpy as np
import os
import time

# 데이터 로드
path_to_file = tf.keras.utils.get_file('shakespeare.txt', 'https://storage.googleapis.com/download.tensorflow.org/data/shakespeare.txt')
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')

# 고유한 문자 수 계산
vocab = sorted(set(text))
vocab_size = len(vocab)

# 문자에서 숫자로 매핑
char_to_idx = {u:i for i, u in enumerate(vocab)}
idx_to_char = np.array(vocab)

text_as_int = np.array([char_to_idx[c] for c in text])

# 학습 데이터 생성
seq_length = 100
examples_per_epoch = len(text)//(seq_length+1)

char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)

sequences = char_dataset.batch(seq_length+1, drop_remainder=True)

def split_input_target(chunk):
    input_text = chunk[:-1]
    target_text = chunk[1:]
    return input_text, target_text

dataset = sequences.map(split_input_target)

BATCH_SIZE = 64
BUFFER_SIZE = 10000

dataset = dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)

# 모델 생성
embedding_dim = 256
rnn_units = 1024

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
    model = tf.keras.Sequential([
        tf.keras.layers.Embedding(vocab_size, embedding_dim, batch_input_shape=[batch_size, None]),
        tf.keras.layers.LSTM(rnn_units, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'),
        tf.keras.layers.Dense(vocab_size)
    ])
    return model

model = build_model(vocab_size, embedding_dim, rnn_units, BATCH_SIZE)

# 모델 컴파일
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))

# 체크포인트 콜백 설정
checkpoint_dir = './training_checkpoints'
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")

checkpoint_callback=tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_prefix,
    save_weights_only=True)

# 모델 학습
EPOCHS = 30

history = model.fit(dataset, epochs=EPOCHS, callbacks=[checkpoint_callback])

# 체크포인트로부터 가중치 복원
model = build_model(vocab_size, embedding_dim, rnn_units, batch_size=1)

model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))

model.build(tf.TensorShape([1, None]))

# 텍스트 생성
def generate_text(model, start_string):
    num_generate = 1000

    input_eval = [char_to_idx[s] for s in start_string]
    input_eval = tf.expand_dims(input_eval, 0)

    text_generated = []
    temperature = 1.0

    model.reset_states()
    for i in range(num_generate):
        predictions = model(input_eval)
        predictions = tf.squeeze(predictions, 0)

        predictions = predictions / temperature
        predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()

        input_eval = tf.expand_dims([predicted_id], 0)

        text_generated.append(idx_to_char[predicted_id])

    return (start_string + ''.join(text_generated))

먼저, 예시로 사용될 텍스트 데이터를 불러옵니다. 이번 예시에서는 ‘The Complete Works of William Shakespeare’이라는 셰익스피어의 작품 모음집을 사용합니다.

다음으로, 데이터 전처리를 수행합니다. 이 과정에서는 텍스트 데이터를 문자 단위로 분리하고, 각 문자를 숫자로 인코딩합니다. 이렇게 처리된 데이터는 모델이 학습할 수 있는 형태로 변환됩니다.

학습을 위한 모델은 LSTM(Long Short-Term Memory)을 사용합니다. LSTM은 순환 신경망(RNN)의 일종으로, 텍스트 데이터와 같은 시퀀스 데이터를 다룰 때 효과적입니다.

모델이 학습된 후, 생성된 텍스트를 만들어내는 함수를 정의합니다. 이 함수는 모델과 시작 문자열을 인자로 받아서, 시작 문자열을 기반으로 새로운 텍스트를 생성합니다.