Перейти к основному содержимому

Audiocraft Audio Generation

AudioCraft: MusicGen text-to-music, AudioGen text-to-sound.

Метаданные навыка​

ИсточникВстроенный (установлен по умолчанию)
Путьskills/mlops/models/audiocraft
Версия1.0.0
АвторOrchestra Research
ЛицензияMIT
Зависимостиaudiocraft, torch>=2.0.0, transformers>=4.30.0
Платформыlinux, macos
ТегиMultimodal, Audio Generation, Text-to-Music, Text-to-Audio, MusicGen

Справочник: полный SKILL.md​

к сведению

Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Это те инструкции, которые видит агент, когда навык активен.

AudioCraft: Audio Generation

Подробное руководство по использованию Meta AudioCraft для генерации музыки и аудио из текста с помощью MusicGen, AudioGen и EnCodec.

Когда использовать AudioCraft​

Используйте AudioCraft, когда:

  • Нужно сгенерировать музыку из текстовых описаний
  • Создаются звуковые эффекты и фоновое аудио
  • Строятся приложения для генерации музыки
  • Требуется генерация музыки с условием по мелодии
  • Нужен стереовыход
  • Требуется управляемая генерация музыки с переносом стиля

Ключевые возможности:

  • MusicGen: генерация музыки из текста с условием по мелодии
  • AudioGen: генерация звуковых эффектов из текста
  • EnCodec: высококачественный нейронный аудиокодек
  • Несколько размеров моделей: от Small (300M) до Large (3.3B)
  • Поддержка стерео: полноценная генерация стереоаудио
  • Условие по стилю: MusicGen-Style для генерации на основе референса

Используйте альтернативы вместо:

  • Stable Audio: для более длительной коммерческой генерации музыки
  • Bark: для синтеза речи с музыкой/звуковыми эффектами
  • Riffusion: для генерации музыки на основе спектрограмм
  • OpenAI Jukebox: для генерации сырого аудио с текстом

Быстрый старт​

Установка​

# Из PyPI
pip install audiocraft

# Из GitHub (последняя версия)
pip install git+https://github.com/facebookresearch/audiocraft.git

# Или используйте HuggingFace Transformers
pip install transformers torch torchaudio

Базовый text-to-music (AudioCraft)​

import torchaudio
from audiocraft.models import MusicGen

# Загрузка модели
model = MusicGen.get_pretrained('facebook/musicgen-small')

# Установка параметров генерации
model.set_generation_params(
duration=8, # секунды
top_k=250,
temperature=1.0
)

# Генерация из текста
descriptions = ["happy upbeat electronic dance music with synths"]
wav = model.generate(descriptions)

# Сохранение аудио
torchaudio.save("output.wav", wav[0].cpu(), sample_rate=32000)

Использование HuggingFace Transformers​

from transformers import AutoProcessor, MusicgenForConditionalGeneration
import scipy

# Загрузка модели и процессора
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
model.to("cuda")

# Генерация музыки
inputs = processor(
text=["80s pop track with bassy drums and synth"],
padding=True,
return_tensors="pt"
).to("cuda")

audio_values = model.generate(
**inputs,
do_sample=True,
guidance_scale=3,
max_new_tokens=256
)

# Сохранение
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("output.wav", rate=sampling_rate, data=audio_values[0, 0].cpu().numpy())

Text-to-sound с AudioGen​

from audiocraft.models import AudioGen

# Загрузка AudioGen
model = AudioGen.get_pretrained('facebook/audiogen-medium')

model.set_generation_params(duration=5)

# Генерация звуковых эффектов
descriptions = ["dog barking in a park with birds chirping"]
wav = model.generate(descriptions)

torchaudio.save("sound.wav", wav[0].cpu(), sample_rate=16000)

Основные концепции​

Обзор архитектуры​

Архитектура AudioCraft:
┌──────────────────────────────────────────────────────────────┐
│ Текстовый энкодер (T5) │
│ │ │
│ Текстовые эмбеддинги │
└────────────────────────┬─────────────────────────────────────┘
│
┌────────────────────────▼─────────────────────────────────────┐
│ Декодер Transformer (LM) │
│ Авторегрессивно генерирует аудиотокены │
│ Используя эффективные паттерны чередования токенов │
└────────────────────────┬─────────────────────────────────────┘
│
┌────────────────────────▼─────────────────────────────────────┐
│ Аудиодекодер EnCodec │
│ Преобразует токены обратно в аудиоволну │
└──────────────────────────────────────────────────────────────┘

Варианты моделей​

МодельРазмерОписаниеСценарий использования
musicgen-small300MText-to-musicБыстрая генерация
musicgen-medium1.5BText-to-musicСбалансированный
musicgen-large3.3BText-to-musicЛучшее качество
musicgen-melody1.5BТекст + мелодияУсловие по мелодии
musicgen-melody-large3.3BТекст + мелодияЛучшая мелодия
musicgen-stereo-*РазныйСтереовыходСтереогенерация
musicgen-style1.5BПеренос стиляНа основе референса
audiogen-medium1.5BText-to-soundЗвуковые эффекты

Параметры генерации​

ПараметрПо умолчаниюОписание
duration8.0Длина в секундах (1-120)
top_k250Top-k сэмплирование
top_p0.0Nucleus сэмплирование (0 = отключено)
temperature1.0Температура сэмплирования
cfg_coef3.0Бесклассовое направляющее воздействие

Использование MusicGen​

Генерация музыки из текста​

from audiocraft.models import MusicGen
import torchaudio

model = MusicGen.get_pretrained('facebook/musicgen-medium')

# Настройка генерации
model.set_generation_params(
duration=30, # До 30 секунд
top_k=250, # Разнообразие сэмплирования
top_p=0.0, # 0 = использовать только top_k
temperature=1.0, # Креативность (выше = разнообразнее)
cfg_coef=3.0 # Приверженность тексту (выше = строже)
)

# Генерация нескольких образцов
descriptions = [
"epic orchestral soundtrack with strings and brass",
"chill lo-fi hip hop beat with jazzy piano",
"energetic rock song with electric guitar"
]

# Генерация (возвращает [batch, channels, samples])
wav = model.generate(descriptions)

# Сохранение каждого
for i, audio in enumerate(wav):
torchaudio.save(f"music_{i}.wav", audio.cpu(), sample_rate=32000)

Генерация с условием по мелодии​

from audiocraft.models import MusicGen
import torchaudio

# Загрузка модели мелодии
model = MusicGen.get_pretrained('facebook/musicgen-melody')
model.set_generation_params(duration=30)

# Загрузка аудио мелодии
melody, sr = torchaudio.load("melody.wav")

# Генерация с условием по мелодии
descriptions = ["acoustic guitar folk song"]
wav = model.generate_with_chroma(descriptions, melody, sr)

torchaudio.save("melody_conditioned.wav", wav[0].cpu(), sample_rate=32000)

Стереогенерация​

from audiocraft.models import MusicGen

# Загрузка стереомодели
model = MusicGen.get_pretrained('facebook/musicgen-stereo-medium')
model.set_generation_params(duration=15)

descriptions = ["ambient electronic music with wide stereo panning"]
wav = model.generate(descriptions)

# Форма wav: [batch, 2, samples] для стерео
print(f"Форма стерео: {wav.shape}") # [1, 2, 480000]
torchaudio.save("stereo.wav", wav[0].cpu(), sample_rate=32000)

Продолжение аудио​

from transformers import AutoProcessor, MusicgenForConditionalGeneration

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

# Загрузка аудио для продолжения
import torchaudio
audio, sr = torchaudio.load("intro.wav")

# Обработка с текстом и аудио
inputs = processor(
audio=audio.squeeze().numpy(),
sampling_rate=sr,
text=["continue with a epic chorus"],
padding=True,
return_tensors="pt"
)

# Генерация продолжения
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=512)

Использование MusicGen-Style​

Генерация с условием по стилю​

from audiocraft.models import MusicGen

# Загрузка модели стиля
model = MusicGen.get_pretrained('facebook/musicgen-style')

# Настройка генерации со стилем
model.set_generation_params(
duration=30,
cfg_coef=3.0,
cfg_coef_beta=5.0 # Влияние стиля
)

# Настройка кондиционера стиля
model.set_style_conditioner_params(
eval_q=3, # RVQ квантователи (1-6)
excerpt_length=3.0 # Длина фрагмента стиля
)

# Загрузка референса стиля
style_audio, sr = torchaudio.load("reference_style.wav")

# Генерация с текстом + стилем
descriptions = ["upbeat dance track"]
wav = model.generate_with_style(descriptions, style_audio, sr)

Генерация только по стилю (без текста)​

# Генерация в соответствии со стилем без текстового промпта
model.set_generation_params(
duration=30,
cfg_coef=3.0,
cfg_coef_beta=None # Отключение двойного CFG для только стиля
)

wav = model.generate_with_style([None], style_audio, sr)

Использование AudioGen​

Генерация звуковых эффектов​

from audiocraft.models import AudioGen
import torchaudio

model = AudioGen.get_pretrained('facebook/audiogen-medium')
model.set_generation_params(duration=10)

# Генерация различных звуков
descriptions = [
"thunderstorm with heavy rain and lightning",
"busy city traffic with car horns",
"ocean waves crashing on rocks",
"crackling campfire in forest"
]

wav = model.generate(descriptions)

for i, audio in enumerate(wav):
torchaudio.save(f"sound_{i}.wav", audio.cpu(), sample_rate=16000)

Использование EnCodec​

Сжатие аудио​

from audiocraft.models import CompressionModel
import torch
import torchaudio

# Загрузка EnCodec
model = CompressionModel.get_pretrained('facebook/encodec_32khz')

# Загрузка аудио
wav, sr = torchaudio.load("audio.wav")

# Проверка правильности частоты дискретизации
if sr != 32000:
resampler = torchaudio.transforms.Resample(sr, 32000)
wav = resampler(wav)

# Кодирование в токены
with torch.no_grad():
encoded = model.encode(wav.unsqueeze(0))
codes = encoded[0] # Аудиотокены

# Декодирование обратно в аудио
with torch.no_grad():
decoded = model.decode(codes)

torchaudio.save("reconstructed.wav", decoded[0].cpu(), sample_rate=32000)

Типовые рабочие процессы​

Рабочий процесс 1: Конвейер генерации музыки​

import torch
import torchaudio
from audiocraft.models import MusicGen

class MusicGenerator:
def __init__(self, model_name="facebook/musicgen-medium"):
self.model = MusicGen.get_pretrained(model_name)
self.sample_rate = 32000

def generate(self, prompt, duration=30, temperature=1.0, cfg=3.0):
self.model.set_generation_params(
duration=duration,
top_k=250,
temperature=temperature,
cfg_coef=cfg
)

with torch.no_grad():
wav = self.model.generate([prompt])

return wav[0].cpu()

def generate_batch(self, prompts, duration=30):
self.model.set_generation_params(duration=duration)

with torch.no_grad():
wav = self.model.generate(prompts)

return wav.cpu()

def save(self, audio, path):
torchaudio.save(path, audio, sample_rate=self.sample_rate)

# Использование
generator = MusicGenerator()
audio = generator.generate(
"epic cinematic orchestral music",
duration=30,
temperature=1.0
)
generator.save(audio, "epic_music.wav")

Рабочий процесс 2: Пакетная обработка звукового дизайна​

import json
from pathlib import Path
from audiocraft.models import AudioGen
import torchaudio

def batch_generate_sounds(sound_specs, output_dir):
"""
Генерация нескольких звуков по спецификациям.

Args:
sound_specs: список {"name": str, "description": str, "duration": float}
output_dir: путь к выходной директории
"""
model = AudioGen.get_pretrained('facebook/audiogen-medium')
output_dir = Path(output_dir)
output_dir.mkdir(exist_ok=True)

results = []

for spec in sound_specs:
model.set_generation_params(duration=spec.get("duration", 5))

wav = model.generate([spec["description"]])

output_path = output_dir / f"{spec['name']}.wav"
torchaudio.save(str(output_path), wav[0].cpu(), sample_rate=16000)

results.append({
"name": spec["name"],
"path": str(output_path),
"description": spec["description"]
})

return results

# Использование
sounds = [
{"name": "explosion", "description": "massive explosion with debris", "duration": 3},
{"name": "footsteps", "description": "footsteps on wooden floor", "duration": 5},
{"name": "door", "description": "wooden door creaking and closing", "duration": 2}
]

results = batch_generate_sounds(sounds, "sound_effects/")

Рабочий процесс 3: Демо в Gradio​

import gradio as gr
import torch
import torchaudio
from audiocraft.models import MusicGen

model = MusicGen.get_pretrained('facebook/musicgen-small')

def generate_music(prompt, duration, temperature, cfg_coef):
model.set_generation_params(
duration=duration,
temperature=temperature,
cfg_coef=cfg_coef
)

with torch.no_grad():
wav = model.generate([prompt])

# Сохранение во временный файл
path = "temp_output.wav"
torchaudio.save(path, wav[0].cpu(), sample_rate=32000)
return path

demo = gr.Interface(
fn=generate_music,
inputs=[
gr.Textbox(label="Описание музыки", placeholder="upbeat electronic dance music"),
gr.Slider(1, 30, value=8, label="Длительность (секунды)"),
gr.Slider(0.5, 2.0, value=1.0, label="Температура"),
gr.Slider(1.0, 10.0, value=3.0, label="Коэффициент CFG")
],
outputs=gr.Audio(label="Сгенерированная музыка"),
title="Демо MusicGen"
)

demo.launch()

Оптимизация производительности​

Оптимизация памяти​

# Использование меньшей модели
model = MusicGen.get_pretrained('facebook/musicgen-small')

# Очистка кэша между генерациями
torch.cuda.empty_cache()

# Генерация более коротких длительностей
model.set_generation_params(duration=10) # Вместо 30

# Использование половинной точности
model = model.half()

Эффективность пакетной обработки​

# Обработка нескольких промптов за раз (эффективнее)
descriptions = ["prompt1", "prompt2", "prompt3", "prompt4"]
wav = model.generate(descriptions) # Один батч

# Вместо
for desc in descriptions:
wav = model.generate([desc]) # Несколько батчей (медленнее)

Требования к памяти GPU​

МодельFP32 VRAMFP16 VRAM
musicgen-small~4GB~2GB
musicgen-medium~8GB~4GB
musicgen-large~16GB~8GB

Частые проблемы​

ПроблемаРешение
CUDA OOMИспользуйте меньшую модель, уменьшите длительность
Плохое качествоУвеличьте cfg_coef, улучшите промпты
Слишком короткая генерацияПроверьте настройку максимальной длительности
Артефакты аудиоПопробуйте другую температуру
Стерео не работаетИспользуйте вариант стереомодели

Ссылки​

  • Расширенное использование — Обучение, дообучение, развертывание
  • Устранение неполадок — Частые проблемы и решения

Ресурсы​