Перейти к содержанию

Models Audiocraft

On this page AudioCraft: MusicGen преобразование текста в музыку, AudioGen преобразование текста в звук.

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

Источник Встроенный (установлен по умолчанию)
Путь skills/mlops/models/audiocraft
Версия 1.0.0
Автор Orchestra Research
Лицензия MIT
Зависимости audiocraft, torch>=2.0.0, transformers>=4.30.0
Теги Multimodal, Audio Generation, Text-to-Music, Text-to-Audio, MusicGen
## Справочник: полный SKILL.md
info
Ниже приведено полное определение навыка, которое Hermes загружает при его активации. Это те инструкции, которые видит агент, когда навык активен.
# AudioCraft: Генерация аудио
Исчерпывающее руководство по использованию AudioCraft от Meta для генерации музыки и звука из текста с помощью MusicGen, AudioGen и EnCodec.
## Когда использовать AudioCraft
Используйте AudioCraft, когда:
* Нужно сгенерировать музыку из текстовых описаний
* Создаются звуковые эффекты и окружающий аудиоконтент
* Строятся приложения для генерации музыки
* Нужна генерация музыки с conditioned мелодией
* Требуется стерео-аудио на выходе
* Необходима управляемая генерация музыки с переносом стиля

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

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

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

Установка

[code] # Из PyPI
pip install audiocraft

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

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

[/code]

Базовое преобразование текста в музыку (AudioCraft)

[code] 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)

[/code]

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

[code] 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())

[/code]

Преобразование текста в звук с AudioGen

[code] 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)

[/code]

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

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

[code] AudioCraft Architecture:
┌──────────────────────────────────────────────────────────────┐
│ Text Encoder (T5) │
│ │ │
│ Text Embeddings │
└────────────────────────┬─────────────────────────────────────┘

┌────────────────────────▼─────────────────────────────────────┐
│ Transformer Decoder (LM) │
│ Auto-regressively generates audio tokens │
│ Using efficient token interleaving patterns │
└────────────────────────┬─────────────────────────────────────┘

┌────────────────────────▼─────────────────────────────────────┐
│ EnCodec Audio Decoder │
│ Converts tokens back to audio waveform │
└──────────────────────────────────────────────────────────────┘

[/code]

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

Модель| Размер| Описание| Применение
|---|---|---|---
musicgen-small| 300M| Текст в музыку| Быстрая генерация
musicgen-medium| 1.5B| Текст в музыку| Сбалансированный вариант
musicgen-large| 3.3B| Текст в музыку| Наилучшее качество
musicgen-melody| 1.5B| Текст + мелодия| Учет мелодии
musicgen-melody-large| 3.3B| Текст + мелодия| Лучшая работа с мелодией
musicgen-stereo-*| Разный| Стерео-выход| Стерео-генерация
musicgen-style| 1.5B| Перенос стиля| Генерация по образцу
audiogen-medium| 1.5B| Текст в звук| Звуковые эффекты

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

Параметр| По умолчанию| Описание
|---|---|---
duration| 8.0| Длительность в секундах (1-120)
top_k| 250| Top-k сэмплирование
top_p| 0.0| Nucleus сэмплирование (0 = отключено)
temperature| 1.0| Температура сэмплирования
cfg_coef| 3.0| Classifier-free guidance (бесклассовое направление)

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

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

[code] 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)

[/code]

Генерация с conditioned мелодией

[code] 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)

[/code]

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

[code] 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 shape: [batch, 2, samples] для стерео  
print(f"Stereo shape: {wav.shape}")  # [1, 2, 480000]  
torchaudio.save("stereo.wav", wav[0].cpu(), sample_rate=32000)

[/code]

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

[code] 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)

[/code]

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

Генерация с conditioned стилем

[code] 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)

[/code]

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

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

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

[/code]

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

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

[code] 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)

[/code]

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

Сжатие аудио

[code] 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)

[/code]

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

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

[code] 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")

[/code]

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

[code] 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/")

[/code]

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

[code] 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"  
)

demo.launch()

[/code]

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

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

[code] # Используйте меньшую модель
model = MusicGen.get_pretrained('facebook/musicgen-small')

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

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

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

[/code]

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

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

# Вместо  
for desc in descriptions:  
    wav = model.generate([desc])  # Множественные пакеты (медленнее)

[/code]

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

Модель| FP32 VRAM| FP16 VRAM
|---|---|---
musicgen-small| ~4 ГБ| ~2 ГБ
musicgen-medium| ~8 ГБ| ~4 ГБ
musicgen-large| ~16 ГБ| ~8 ГБ

Часто встречающиеся проблемы

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

Ссылки

Ресурсы