MusicGen

MusicGen

MusicGen은 Meta(페이스북 AI Research)가 공개한 오디오 생성 라이브러리 AudioCraft에 포함된, 텍스트로 음악을 생성하는 최첨단 AI 모델이에요. 32kHz로 샘플링된 EnCodec 토크나이저 위에서 동작하는 단일 단계(auto-regressive) Transformer 모델이며, 4개의 코드북을 50Hz로 샘플링해 사용해요. MusicLM 같은 기존 방식과 달리 자기지도 학습 기반의 의미 표현이 필요 없고, 4개 코드북을 한 번에 생성해요. 코드북 사이에 작은 지연(delay)을 도입해 병렬로 예측할 수 있어서, 오디오 1초당 자동회귀(autoregressive) 단계가 50개뿐이에요. 학습에는 승인된 라이선스 음악 2만 시간(내부 고품질 음악 트랙 1만 개 + ShutterStock·Pond5 음악 데이터)을 사용했어요.

출처: 문서

본문

모델 계열 (Model Card)

MusicGen은 미리 학습된(pre-trained) 모델 10개를 제공해요. 주요 파라미터는 다음과 같아요.

  • facebook/musicgen-small: 300M 파라미터, 텍스트 → 음악만 지원
  • facebook/musicgen-medium: 1.5B 파라미터, 텍스트 → 음악만 지원
  • facebook/musicgen-melody: 1.5B 파라미터, 텍스트 → 음악 + 텍스트·멜로디 → 음악 지원
  • facebook/musicgen-large: 3.3B 파라미터, 텍스트 → 음악만 지원
  • facebook/musicgen-melody-large: 3.3B 파라미터, 텍스트 → 음악 + 텍스트·멜로디 → 음악 지원
  • facebook/musicgen-stereo-*: 위 모델들을 스테레오 생성용으로 파인튜닝한 버전 (small/medium/large/melody/melody-large)

품질과 연산 비용의 균형이 가장 좋은 모델은 facebook/musicgen-medium 또는 facebook/musicgen-melody예요. 로컬에서 MusicGen을 사용하려면 GPU가 반드시 필요하고, 16GB 메모리를 권장해요. 더 작은 GPU에서는 짧은 시퀀스나 facebook/musicgen-small 모델로 더 긴 시퀀스를 생성할 수 있어요.

설치 (Installation)

AudioCraft는 Python 3.9, PyTorch 2.1.0이 필요해요. 설치 방법은 다음과 같아요.

# Best to make sure you have torch installed first, in particular before installing xformers.
# Don't run this if you already have PyTorch installed.
python -m pip install 'torch==2.1.0'
# You might need the following before trying to install the packages
python -m pip install setuptools wheel
# Then proceed to one of the following
python -m pip install -U audiocraft  # stable release
python -m pip install -U git+https://[email protected]/facebookresearch/audiocraft#egg=audiocraft  # bleeding edge
python -m pip install -e .  # or if you cloned the repo locally (mandatory if you want to train).
python -m pip install -e '.[wm]'  # if you want to train a watermarking model

ffmpeg 설치도 권장해요.

sudo apt-get install ffmpeg
# Or if you are using Anaconda or Miniconda
conda install "ffmpeg<5" -c conda-forge

중간 크기 모델(~1.5B 파라미터)로 추론(inference)하려면 16GB 이상의 GPU 메모리가 필요해요.

사용 예시 (API)

AudioCraft의 간단한 API로 10개의 사전학습 모델을 사용할 수 있어요. 기본 API 사용 예시는 다음과 같아요.

import torchaudio
from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write

model = MusicGen.get_pretrained('facebook/musicgen-melody')
model.set_generation_params(duration=8)  # generate 8 seconds.
wav = model.generate_unconditional(4)    # generates 4 unconditional audio samples
descriptions = ['happy rock', 'energetic EDM', 'sad jazz']
wav = model.generate(descriptions)  # generates 3 samples.

melody, sr = torchaudio.load('./assets/bach.mp3')
# generates using the melody from the given audio and the provided descriptions.
wav = model.generate_with_chroma(descriptions, melody[None].expand(3, -1, -1), sr)

for idx, one_wav in enumerate(wav):
    # Will save under {idx}.wav, with loudness normalization at -14 db LUFS.
    audio_write(f'{idx}', one_wav.cpu(), model.sample_rate, strategy="loudness", loudness_compressor=True)
  • model.generate_unconditional(4): 4개의 무조건적(unconditional) 오디오 샘플 생성
  • model.generate(descriptions): 주어진 텍스트 설명으로 음악 생성
  • model.generate_with_chroma(descriptions, melody, sr): 주어진 오디오의 멜로디 + 텍스트 설명으로 생성 (멜로디 가이드)

🤗 Transformers 사용법

MusicGen은 🤗 Transformers 라이브러리 4.31.0 버전부터 사용할 수 있어요. 먼저 라이브러리를 설치해요.

pip install git+https://github.com/huggingface/transformers.git

텍스트 조건부 오디오 샘플을 생성하는 코드는 다음과 같아요.

from transformers import AutoProcessor, MusicgenForConditionalGeneration


processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

inputs = processor(
    text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
    padding=True,
    return_tensors="pt",
)

audio_values = model.generate(**inputs, max_new_tokens=256)

.wav 파일로 저장하려면 다음과 같이 해요.

import scipy

sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].numpy())

파라미터와 샘플링

생성 단계에서는 조건부/무조건부 샘플 생성과 (프롬프트 기반) 오디오 이어가기(continuation)를 지원해요. 현재 greedy sampling(argmax), 주어진 temperature로 softmax 샘플링, top-K, top-P(nucleus) 샘플링을 지원해요. 생성 파라미터는 generate.lm에 정의돼요.

# control sampling parameters
dora run solver=musicgen/debug generate.lm.gen_duration=10 generate.lm.use_sampling=true generate.lm.top_k=15

학습 (Training)

학습 파이프라인은 MusicGenSolver가 담당하며, 사전학습된 EnCodec 모델에서 추출한 여러 개의 이산 토큰 스트림 위에서 자동회귀 언어모델링 태스크를 정의해요. 3가지 스케일(small 300M / medium 1.5B / large 3.3B)이 제공되며, 텍스트-음악용 musicgen_base_32khz와 크로마그램(chromagram) 조건화를 지원하는 musicgen_melody_32khz 두 가지 solver 설정을 제공해요.

# text-to-music
dora grid musicgen.musicgen_base_32khz --dry_run --init
# melody-guided music generation
dora grid musicgen.musicgen_melody_base_32khz --dry_run --init
# Remove the `--dry_run --init` flags to actually schedule the jobs once everything is setup.

학습에 사용한 데이터셋은 제공하지 않으며, 설명용 더미 데이터셋만 포함돼 있어요. 기존 사전학습 모델로 파인튜닝하려면 continue_from 인자를 사용해요.

# Using pretrained MusicGen model.
dora run solver=musicgen/musicgen_base_32khz model/lm/model_scale=medium continue_from=//pretrained/facebook/musicgen-medium conditioner=text2music

라이선스

이 저장소의 코드는 MIT 라이선스, 모델 가중치는 CC-BY-NC 4.0 라이선스로 공개되어 있어요 (비상업적 사용만 허용).

더 알아보기 (Learn more)