생성형 AI로 나만의 음악 만들기
- 글 컴퓨터공학부 3 심우진
- 편집 건설환경공학부 3 조한기
서문

최근 몇 년간 ChatGPT를 비롯한 생성형 AI가 많은 주목을 받고 있습니다. 얼마 전에는 강력한 오픈 소스 모델 Deepseek1)가 공개되어 장안의 화제가 되었죠. 생성형 AI 서비스들은 텍스트 기반의 자연어 처리를 확장해 이미지, 음성 등 여러 입출력 방식을 지원하는 방향으로 발전해 나가고 있습니다. 이번 기사에서는 생성형 AI를 사용해 음악을 만들어 보는 실습을 하겠습니다.
이번 기사에서 활용할 오픈 소스 라이브러리 Magenta는 Google Brain team의 프로젝트 중 하나로, 머신 러닝을 통해 음악과 미술 분야의 창작을 돕기 위해 만들어졌습니다. 현재 Magenta에서 Magenta Studio로 코드 없이도 사용할 수 있는 UI2)를 제공하고 있기는 하지만, 직접 코드를 짜 봅시다. 직접 개발 환경을 설정하고, 터미널 명령어3) 및 Python 코드를 작성하며 음악 파일이 다뤄지는 방법 등 기본적인 개념을 함께 살펴보도록 하겠습니다.
음성 파일의 저장: 웨이브 형식과 미디 형식
컴퓨터에서 음성 파일은 크게 두 가지 방식으로 저장됩니다. 바로 웨이브(WAV) 형식과 미디(MIDI) 형식입니다.

둘 중 더 많이 쓰이는 형식인 웨이브 형식부터 알아봅시다. 웨이브(WAV)는 Waveform Audio Format의 준말로, 음성의 파동을 파일 속 전기 신호의 높낮이로 기록하는 방식입니다. 웨이브 형식으로 저장된 음성 파일은 원본과 같은 음색을 재현할 수 있기 때문에, 통화 녹음이나 방송국 등에서 사용합니다. 수십 분의 1초마다 1바이트4), 2바이트 등으로 정해진 저장 공간을 사용하므로, 웨이브 형식의 음성 파일은 용량이 매우 큽니다. 따라서 최적화가 중요한 음악 스트리밍 등에는 웨이브 파일을 압축한 형태의 저장 형식을 사용하며, 이 중 우리에게 익숙한 MP3 형식도 포함됩니다.
웨이브 형식과 달리 미디 형식의 음성 파일은 소리 자체를 저장하지 않고 어느 악기가 어떤 음을 얼마나 내야 하는지를 저장합니다. 컴퓨터를 위한 악보라고도 할 수 있겠습니다. 그렇기에 미디 파일은 웨이브 형식에 비해 용량이 작지만, 재생되기 위해서는 파일을 재생하는 기기에 음악에 필요한 악기의 소리 리소스가 따로 있어야 합니다. 미디 파일은 소리가 아닌 음에 대한 정보만을 기록하기 때문이죠. 같은 미디 파일이라고 해도 실행 환경의 악기 소리 리소스에 따라 다른 음악이 될 수 있죠. 한 악보를 그랜드 피아노와 전자 피아노에서 각각 연주하는 상황을 상상하면 되겠습니다.
요약하자면, 웨이브 형식 파일은 원본 오디오를 바로 재생할 수 있으며, 미디 형식으로 저장된 파일은 음표 하나하나를 식별하고 편집하기 용이합니다. 이번 기사에서는 Magenta를 사용하여 미디 파일을 생성한 후, 이를 Python으로 편집하여 웨이브 형식 음원을 만들어 보겠습니다.
개발 환경 설정: virtualenv를 이용해 프로젝트별 환경 만들기
직접 코딩 프로젝트를 진행해 본, 특히나 다른 사람의 라이브러리를 사용해 본 독자님들이라면 같은 언어의 코드라도 라이브러리들의 버전이 서로 호환되지 않으면 제대로 실행할 수 없다는 것을 알 것입니다. Magenta Python 라이브러리도 이와 같은 이유로 몇몇 환경 조성이 필요해, miniconda를 이용해 Python 버전을 3.8로 낮추고 프로젝트를 진행했습니다. Python과 miniconda가 제공하는 가상 환경을 이용하면, 여러 프로젝트가 서로 다른 버전의 라이브러리를 필요로 할 때 구분된 환경을 만들어 사용할 수 있습니다.
먼저 pip와 wget 커맨드로 virtualenv와 miniconda 설치 파일을 각각 내려받은 뒤, miniconda 설치 스크립트를 실행시킵니다. 설치가 완료되면 conda를 실행해 Python 3.8을 설치합니다.
# 필요한 파일 내려받기
!pip install virtualenv
!virtualenv myenv
!wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-x86_64.sh
# miniconda 설치 파일에 실행 권한 부여
!chmod +x Miniconda3-py38_23.11.0-2-Linux-x86_64.sh
# miniconda 설치 파일 실행
!./Miniconda3-py38_23.11.0-2-Linux-x86_64.sh -b -f -p /usr/local
# conda에서 Python 3.8 설치
!conda install -q -y --prefix /usr/local python=3.8 ujson
설치가 완료되면 설치한 Python 3.8 파일을 시스템이 찾을 수 있도록 환경 변수에 추가하고, 가상 환경을 활성화합니다. 예시 코드는 Google Colab에서 실행했기 때문에, 설치가 완료된 후 Python의 os와 sys 라이브러리를 사용해 환경 변수를 편집하고 가상 환경을 활성화했습니다.
# 설치한 가상환경을 PATH에 추가
import sys
sys.path.append('/usr/local/lib/python3.8/site-packages/')
# conda 환경 활성화
import os
os.environ['CONDA_PREFIX'] = '/usr/local/envs/myenv'
!python --version
음악 생성하기: 알맞은 모델과 매개변수를 선택하자
이제 pip 커맨드로 Magenta 라이브러리를 설치합니다.
!pip install magenta
Magenta의 공식 Github 리포지토리에서는 다양한 목적으로 훈련된 음악 생성 RNN 모델을 제공하고 있습니다. 이번 기사에서는 Magenta 개발팀이 미리 미디 파일로 훈련시킨 멜로디 생성 LSTM5) 모델을 사용하겠습니다. 모델을 사용하기 위해서는 .mag 확장자의 번들 파일이 필요한데요, 여기서 내려받을 수 있습니다:
https://github.com/magenta/magenta/tree/main/magenta/models/melody_rnn
이제 터미널에서 melody_rnn_generate 커맨드로 멜로디에 해당하는 미디 파일을 생성해 봅시다. 터미널에서의 코드는 생소할 수 있는데, '--' 기호로 표시된 이름에 '=' 기호로 필요한 값들을 넣어 주면 됩니다. Java나 Python 코드에서 함수의 매개변수에 값을 할당하는 것과 같은 원리입니다.
!melody_rnn_generate \
--config=basic_rnn \
--bundle_file=./basic_rnn.mag \
--output_dir=./melody_generated_basic \
--num_outputs=5 \
--num_steps=128 \
--primer_melody="[60]"

각 매개변수를 하나씩 살펴봅시다. config와 bundle_file에는 사용할 모델 파일의 유형과 저장 공간 내 위치가 들어갑니다. output_dir에는 생성된 미디 파일을 저장할 위치를 선택해 넣어 줍니다. num_outputs와 num_steps는 각각 생성할 파일의 개수와 그 길이를 지정합니다.
primer_melody는 멜로디의 시작음을 정하기 위해 필요한 매개변수입니다. 앞서 미디 파일은 연주할 음의 길이와 시점을 기록하는 악보 같은 형식이라고 설명했죠? 디지털 데이터는 결국 전부 숫자이므로 미디 파일의 각 음과 길이도 일정한 규칙에 따라 숫자로 인코딩됩니다(그림3). 예시 코드에서는 시작음을 60번, 가온 도로 설정했습니다.
음악을 재생하고 변환하자: Python으로 미디 파일 다루기
Magenta 라이브러리를 이용해 미디 파일을 편집해 보았는데요, 이제 AI가 생성할 음악을 들어 볼 차례겠죠? 앞서 미디 파일을 재생하기 위해서는 연주할 음에 해당하는 소리의 리소스가 필요하다고 언급했습니다. 이 기사에서는 fluidsynth 라이브러리의 리소스를 사용해 미디 파일을 재생하되, music21 라이브러리를 이용해 미디와 fluidsynth를 연결해 주었습니다. 미디 파일이 악보라고 하면 fluidsynth는 악기, music21은 연주자가 되는 것이죠.
!apt-get install -qq libfluidsynth3 fluid-soundfont-gm
!pip install pyfluidsynth music21
우선 소리 리소스에 해당하는 libfluidsynth3를 설치합니다. 그 후 Magenta 때와 마찬가지로 pip 커맨드를 사용하여 pyfluidsynth와 music21을 설치합니다. pyfluidsynth는 libfluidsynth를 Python에서 사용하도록 도와주는 라이브러리입니다.
이제 아래와 같은 Python 코드를 실행시켜 Colab notebook에서 미디 파일을 재생해 봅시다. iPython의 Audio를 이용하면 .ipynb 환경에서 바로 음성을 재생할 수 있습니다.
import fluidsynth
print(fluidsynth.__file__)
from IPython.display import Audio
from music21 import converter
def playMidi(path):
# music21로 미디 파일 열기
s = converter.parse(path)
# fluidsynth로 미디 재생을 위한 음성 라이브러리 가져오기
fl = fluidsynth.synth()
sfid = fl.sfload("/usr/share/sounds/sf2/FluidR3_GM.sf2")
fl.program_select(0, sfid, 0, 0)
# MIDI 정보로 음성(웨이브 형식) 만들기
audio_data = []
for event in s.flat.notes:
fl.noteon(0, event.pitch.midi, int(event.volume.velocity))
audio_data.extend(fl.get_samples(int(event.duration.quarterLength * 44100)))
fl.noteoff(0, event.pitch.midi)
# Colab 노트북에서 음성 재생
audio_data = np.array(audio_data, dtype="int16")
audio_data = audio_data / (2**15 - 1)
return Audio(audio_data, rate=44100)
playMidi("./melody_generated_basic/1.mid") # 생성한 미디 파일 주소를 넣는다
이번 기사에서는 오픈 소스 라이브러리 Magenta를 이용해 음악을 생성해 보았습니다. 저는 음악 전문 교육을 받은 적이 전혀 없는데도, 듣기에 그럴싸한 음악이 만들어졌습니다. 이처럼 강력한 생성형 AI가 등장하면서 인간 창작자의 자리가 위협받는다는 우려가 많습니다. 실제로 게임이나 광고 등에 일러스트레이터나 작곡가를 채용하는 대신 AI로 생성된 결과물을 사용하는 사례가 늘고 있죠.
그러나 생성형 AI가 우리 사회를 어떻게 바꾸어 나갈지는 AI의 본질보다는 그 활용에 따라 결정됩니다. 즉, AI가 어떤 원리로 움직이느냐보다는, 우리가 AI를 어떤 식으로 사용하느냐, 방향성에 따라 미래가 달라진다는 것입니다. 이번 기사에서처럼 음악 비전문가가 Magenta라는 도구를 사용하여 적당히 들어줄 만한 음악을 만드는 데서 그칠 수도 있습니다. 반면 전문 지식을 가진 사람, 예를 들어 화성학에 대한 이해가 있는 사람이 코드 배열을 먼저 하고 AI를 사용해 멜로디를 채운다면 더 질 높은 음악을 만들 수 있겠죠. 그리고 사회 구성원 누구나 AI 사용의 방향성에 대해 의견을 제시할 수 있습니다. 공대상상 독자님들이 기술이 세상을 어떻게 바꾸어야 하는지 고민해 보고, 자신의 자리에서 할 수 있는 일을 해 보시면 좋겠습니다.
참고
- 1) 중국의 환팡퀀트에서 2024년 12월 공개한 LLM. 최첨단 하드웨어 없이 적은 비용으로 ChatGPT 등 기존 LLM과 비슷한 성능에 도달해 화제가 되었다.
- 2) User Interface. 사용자와 컴퓨터 프로그램의 상호작용을 매개한다.
- 3) 사용자가 운영체제에 지시 사항을 전달할 때 사용하는 텍스트 기반 인터페이스. 이 기사에서는 파일 설치, 실행 권한 부여 등 매우 간단한 작업만을 수행한다.
- 4) Byte. 디지털 정보의 저장 단위 중 하나. 0 혹은 1을 저장하는 비트(bit)가 8개 모인 단위이다.
- 5) Long Short-Term Memory. RNN에 긴 입력 데이터를 투입할 때 이전 정보를 오래 기억하지 못하는 문제를 해결하는 방법론이다.