오늘도 어김없이 HuggingFace를 둘러보다가 재미난 것을 발견했다.
텍스트로 음악을 생성할 수 있는 모델로 meta에서 만들걸로 보인다. 모델은 Transformer를 사용했으며 2024년에 발표된 논문으로 생각보다 최근에 발표된 모델이었다. 논문을 간단하게만 살펴보니 음악 생성 모델을 만드는게 생각보다 어려운 문제라고 한다. 자연어, 텍스트와 다르게 악보는 음표, 박자, 연주법 등 보이는 양보다 많은 정보가 담겨있기 때문에 이것을 숫자로 표현하는 것이 간단한 문제가 아니라고 한다.
https://github.com/facebookresearch/audiocraft/blob/main/docs/MUSICGEN.md
audiocraft/docs/MUSICGEN.md at main · facebookresearch/audiocraft
Audiocraft is a library for audio processing and generation with deep learning. It features the state-of-the-art EnCodec audio compressor / tokenizer, along with MusicGen, a simple and controllable...
github.com
Huggingface, github 공식 설명에 따라서 python 음악 생성 코드를 작성했다. 모델 크기에 따라 small, medium, melody 모델이 있는데 small 모델은 정말 간단한 음악을 생성해주었고 melody 음악을 사용하면 적당히 들어줄 만한 음악이 생성되었다.
# Load model directly
from transformers import AutoTokenizer, AutoModelForTextToWaveform
import torch
# tokenizer = AutoTokenizer.from_pretrained("facebook/musicgen-melody")
# model = AutoModelForTextToWaveform.from_pretrained("facebook/musicgen-melody")
# tokenizer = AutoTokenizer.from_pretrained("facebook/musicgen-medium")
# model = AutoModelForTextToWaveform.from_pretrained("facebook/musicgen-medium")
tokenizer = AutoTokenizer.from_pretrained("facebook/musicgen-stereo-melody")
model = AutoModelForTextToWaveform.from_pretrained("facebook/musicgen-stereo-melody")
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model.to(device)
inputs = tokenizer(
text=["high quality", "clear sound", "how Ludwig van Beethoven felt when he realize that he is deaf"],
padding=True,
return_tensors="pt",
).to(device)
audio_values = model.generate(**inputs, max_new_tokens=1000)
import scipy
audio_values = audio_values.detach().cpu()
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out_stereo_melody.wav", rate=sampling_rate, data=audio_values[0, 0].numpy())