Интеграция MusicGen (Meta) для генерации музыки
MusicGen от Meta — open-source модель с MIT-совместимой лицензией для коммерческого использования. Генерирует инструментальную музыку до 30 секунд (или дольше через chunking) по текстовому описанию или с учётом мелодии-референса.
Установка и базовое использование
from audiocraft.models import MusicGen
import torchaudio
import torch
import io
# Размеры: small (300M params), medium (1.5B), large (3.3B), melody
model = MusicGen.get_pretrained("facebook/musicgen-large")
model.set_generation_params(
duration=30, # секунды
temperature=1.0, # разнообразие (0.5–1.5)
top_k=250,
cfg_coef=3.0 # adherence to text prompt (1–10)
)
def generate_music(
description: str,
duration: int = 30,
cfg_coef: float = 3.0
) -> bytes:
model.set_generation_params(duration=duration, cfg_coef=cfg_coef)
wav = model.generate(
descriptions=[description],
progress=True
)
buf = io.BytesIO()
torchaudio.save(buf, wav[0].cpu(), sample_rate=32000, format="mp3")
return buf.getvalue()
MusicGen Melody — генерация по мотивам
melody_model = MusicGen.get_pretrained("facebook/musicgen-melody")
def generate_variation(reference_audio: bytes, style_description: str) -> bytes:
melody_wav, sr = torchaudio.load(io.BytesIO(reference_audio))
melody_model.set_generation_params(duration=30)
wav = melody_model.generate_with_chroma(
descriptions=[style_description],
melody_wavs=melody_wav.unsqueeze(0),
melody_sample_rate=sr,
progress=True
)
buf = io.BytesIO()
torchaudio.save(buf, wav[0].cpu(), sample_rate=32000, format="mp3")
return buf.getvalue()
Промпты по жанрам
MUSICGEN_STYLE_PROMPTS = {
"corporate": "uplifting corporate background, piano, strings, positive mood, no drums",
"lofi": "lofi hip hop, relaxing, vinyl crackle, mellow piano, slow beat",
"epic": "epic orchestral, cinematic, strings, brass, powerful drums, intense",
"ambient": "ambient electronic, atmospheric, pads, soft synths, meditative",
"jazz": "smooth jazz, saxophone, double bass, brushed drums, relaxed",
"acoustic": "acoustic guitar, warm, folk style, fingerpicking, natural reverb",
}
Длинные треки через chunking
def generate_long_music(description: str, total_duration: int = 120) -> bytes:
"""Генерируем музыку длиннее 30 секунд через перекрывающиеся чанки"""
chunk_duration = 30
overlap = 5
chunks = []
# Первый чанк
model.set_generation_params(duration=chunk_duration)
wav = model.generate([description]).cpu()
chunks.append(wav[0])
# Последующие чанки с conditioned на предыдущем
while sum(w.shape[-1] for w in chunks) / 32000 < total_duration - overlap:
continuation = model.generate_continuation(
chunks[-1][:, :, -int(overlap * 32000):],
prompt_sample_rate=32000,
descriptions=[description]
)
chunks.append(continuation[0].cpu())
# Конкатенируем с crossfade
full_wav = torch.cat(chunks, dim=-1)[:, :int(total_duration * 32000)]
buf = io.BytesIO()
torchaudio.save(buf, full_wav, sample_rate=32000, format="mp3")
return buf.getvalue()
MusicGen large на A100 генерирует 30 сек за ~20 сек реального времени. На RTX 3090 — ~45 сек. MIT лицензия позволяет коммерческое использование без роялти. Сроки деплоя REST API — 1 день.







