> For the complete documentation index, see [llms.txt](https://docs.clore.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/audiocraft-music.md).

# Музыка AudioCraft

Создавайте музыку и аудио с помощью AudioCraft от Meta (MusicGen).

{% hint style="success" %}
Все примеры можно запускать на GPU-серверах, арендованных через [маркетплейс CLORE.AI](https://clore.ai/marketplace).
{% endhint %}

## Аренда на CLORE.AI

1. Перейдите на [маркетплейс CLORE.AI](https://clore.ai/marketplace)
2. Отфильтруйте по типу GPU, объёму VRAM и цене
3. Выберите **On-Demand** (фиксированная ставка) или **Spot** (цена ставки)
4. Настройте свой заказ:
   * Выберите Docker-образ
   * Установите порты (TCP для SSH, HTTP для веб-интерфейсов)
   * При необходимости добавьте переменные окружения
   * Введите команду запуска
5. Выберите способ оплаты: **CLORE**, **BTC**, или **USDT/USDC**
6. Создайте заказ и дождитесь развертывания

### Получите доступ к своему серверу

* Найдите данные для подключения в **Мои заказы**
* Веб-интерфейсы: используйте URL HTTP-порта
* SSH: `ssh -p <port> root@<proxy-address>`

## Что такое AudioCraft?

AudioCraft включает:

* **MusicGen** - Генерация музыки по тексту
* **AudioGen** - Генерация звуковых эффектов
* **EnCodec** - Сжатие аудио
* **MAGNeT** - Более быстрая генерация

## Размеры моделей

| Модель    | VRAM | Качество          | Скорость |
| --------- | ---- | ----------------- | -------- |
| маленькая | 4 ГБ | Хорошо            | Быстро   |
| средняя   | 8 ГБ | Отлично           | Средне   |
| большая   | 16GB | Лучше всего       | Медленно |
| мелодия   | 8 ГБ | Отлично + мелодия | Средне   |

## Быстрое развёртывание

**Docker-образ:**

```
pytorch/pytorch:2.11.0-cuda12.8-cudnn9-devel
```

**Порты:**

```
22/tcp
7860/http
```

**Команда:**

```bash
pip install audiocraft gradio scipy && \
python -c "
import gradio as gr
from audiocraft.models import MusicGen
import scipy.io.wavfile as wav
import tempfile

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

def generate(prompt, duration):
    model.set_generation_params(duration=duration)
    output = model.generate([prompt])
    audio = output[0].cpu().numpy().T
    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as f:
        wav.write(f.name, 32000, audio)
        return f.name

demo = gr.Interface(
    fn=generate,
    inputs=[gr.Textbox(label='Подсказка'), gr.Slider(5, 30, value=10, label='Длительность (с)')],
    outputs=gr.Audio(label='Сгенерированная музыка'),
    title='MusicGen'
)
demo.launch(server_name='0.0.0.0', server_port=7860)
"
```

## Доступ к вашему сервису

После развертывания найдите свой `http_pub` URL в **Мои заказы**:

1. Перейдите на **Мои заказы** страницу
2. Нажмите на свой заказ
3. Найдите `http_pub` URL (например, `abc123.clorecloud.net`)

Используйте `https://YOUR_HTTP_PUB_URL` вместо `localhost` в примерах ниже.

## Установка

```bash
pip install audiocraft
pip install scipy torchaudio
```

## MusicGen: текст в музыку

### Базовая генерация

```python
from audiocraft.models import MusicGen
import torchaudio

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

# Генерировать
prompt = "зажигательная электронная танцевальная музыка с мощным басом"
output = model.generate([prompt])

# Сохранить
audio = output[0].cpu()
torchaudio.save("music.wav", audio, sample_rate=32000)
```

### Несколько подсказок

```python
prompts = [
    "расслабляющий фортепианный джаз",
    "эпический оркестровый кинематографичный",
    "акустическая гитара, фолк-песня,",
    "агрессивный хэви-метал"
]

outputs = model.generate(prompts)

for i, output in enumerate(outputs):
    torchaudio.save(f"music_{i}.wav", output.cpu(), sample_rate=32000)
```

### Условие по мелодии

Используйте мелодию в качестве ориентира:

```python
from audiocraft.models import MusicGen
import torchaudio

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

# Загрузить эталонную мелодию
melody, sr = torchaudio.load("reference.wav")
melody = melody.unsqueeze(0).cuda()

# Генерация с мелодией
output = model.generate_with_chroma(
    ["джазовая версия для фортепиано"],
    melody,
    sr
)

torchaudio.save("jazz_version.wav", output[0].cpu(), sample_rate=32000)
```

### Продолжение

Продолжить из существующего аудио:

```python

# Загрузить аудио для продолжения
audio, sr = torchaudio.load("start.wav")
audio = audio.unsqueeze(0).cuda()

# Продолжить
output = model.generate_continuation(
    audio,
    prompt_sample_rate=sr,
    descriptions=["более энергично с барабанами"],
    progress=True
)

torchaudio.save("continued.wav", output[0].cpu(), sample_rate=32000)
```

## AudioGen: звуковые эффекты

```python
from audiocraft.models import AudioGen

# Загрузить модель
model = AudioGen.get_pretrained('facebook/audiogen-medium')
model.set_generation_params(duration=5)

# Сгенерировать звуки
prompts = [
    "лай собаки вдалеке",
    "дождь по окну",
    "запуск двигателя автомобиля",
    "толпа, аплодирующая на концерте"
]

outputs = model.generate(prompts)

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

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

```python
model.set_generation_params(
    duration=30,           # Длительность в секундах
    top_k=250,             # Сэмплирование top-k
    top_p=0.0,             # Нуклеус-выборка (0 = отключено)
    temperature=1.0,       # Случайность
    cfg_coef=3.0,          # Безклассовое руководство
    two_step_cfg=False,    # Двухэтапное CFG
)
```

### Эффекты параметров

| Параметр    | Низкое значение         | Высокое значение    |
| ----------- | ----------------------- | ------------------- |
| temperature | Консервативно           | Творчески           |
| top\_k      | Более сфокусировано     | Больше разнообразия |
| cfg\_coef   | Свободная интерпретация | Строго по подсказке |

## Пакетная обработка

```python
from audiocraft.models import MusicGen
import torchaudio
import os

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

prompts = [
    {"name": "intro", "prompt": "загадочное эмбиентное вступление, медленное развитие"},
    {"name": "verse", "prompt": "спокойный lo-fi хип-хоп бит"},
    {"name": "chorus", "prompt": "энергичный электронный поп-припев"},
    {"name": "outro", "prompt": "спокойное затухание фортепиано"},
]

output_dir = "./music_parts"
os.makedirs(output_dir, exist_ok=True)

for item in prompts:
    output = model.generate([item["prompt"]])
    torchaudio.save(
        os.path.join(output_dir, f"{item['name']}.wav"),
        output[0].cpu(),
        sample_rate=32000
    )
    print(f"Сгенерировано: {item['name']}")
```

## Стриминговая генерация

```python
from audiocraft.models import MusicGen
import torch

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

# Включить потоковую передачу
streamer = model.get_streaming_generator(
    "зажигательная поп-музыка",
    max_gen_len=256  # токены
)

all_tokens = []
for tokens in streamer:
    all_tokens.append(tokens)
    # Обработать фрагмент...

# Декодировать всё
audio = model.decode(torch.cat(all_tokens, dim=-1))
```

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

```python
from audiocraft.models import MusicGen

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

output = model.generate(["кинематографическая оркестровая партитура"])

# Формат вывода: [batch, 2, samples] для стерео

torchaudio.save("stereo_music.wav", output[0].cpu(), sample_rate=32000)
```

## API-сервер

```python
from fastapi import FastAPI
from fastapi.responses import FileResponse
from audiocraft.models import MusicGen
import torchaudio
import tempfile

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

@app.post("/generate")
async def generate_music(prompt: str, duration: int = 10):
    model.set_generation_params(duration=duration)
    output = model.generate([prompt])

    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        torchaudio.save(f.name, output[0].cpu(), sample_rate=32000)
        return FileResponse(f.name, media_type="audio/wav")

@app.post("/generate_with_melody")
async def generate_with_melody(prompt: str, melody_path: str, duration: int = 15):
    melody, sr = torchaudio.load(melody_path)

    model_melody = MusicGen.get_pretrained('facebook/musicgen-melody')
    model_melody.set_generation_params(duration=duration)

    output = model_melody.generate_with_chroma([prompt], melody.unsqueeze(0).cuda(), sr)

    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        torchaudio.save(f.name, output[0].cpu(), sample_rate=32000)
        return FileResponse(f.name, media_type="audio/wav")

# Запуск: uvicorn server:app --host 0.0.0.0 --port 8000
```

## Инженерия подсказок

### Эффективные подсказки

```python

# Жанр + инструменты + настроение
"зажигательный джаз с саксофоном и фортепиано, счастливый и энергичный"

# Ссылка на стиль
"lo-fi хип-хоп бит, спокойная музыка для учебы, треск винила"

# Кинематографично
"эпическая оркестровая трейлерная музыка, нарастающее напряжение, драматично"

# Конкретные элементы
"акустический рисунок перебора на гитаре, фолк-песня, атмосфера у костра"
```

### Плохие подсказки

```python

# Слишком расплывчато
"хорошая музыка"  # Недостаточно конкретно

# Текст песни
"С днем рождения тебя..."  # Не сработает

# Имена исполнителей
"как Beatles"  # Не понимает исполнителей
```

## Постобработка

### Объединить клипы

```python
from pydub import AudioSegment

intro = AudioSegment.from_wav("intro.wav")
verse = AudioSegment.from_wav("verse.wav")
chorus = AudioSegment.from_wav("chorus.wav")

# Кроссфейд
song = intro.append(verse, crossfade=1000)
song = song.append(chorus, crossfade=1000)

song.export("full_song.mp3", format="mp3")
```

### Добавить эффекты

```python
from pydub import AudioSegment
from pydub.effects import normalize, compress_dynamic_range

audio = AudioSegment.from_wav("generated.wav")

# Нормализовать громкость
audio = normalize(audio)

# Добавить сжатие
audio = compress_dynamic_range(audio)

# Плавное появление/затухание
audio = audio.fade_in(2000).fade_out(3000)

audio.export("processed.wav", format="wav")
```

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

```python
import torch
from audiocraft.models import MusicGen

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

# Включить выгрузку на CPU
model.to('cpu')

# Генерировать на GPU, сразу выгружать
with torch.cuda.amp.autocast():
    output = model.generate(["prompt"])
    output = output.cpu()
    torch.cuda.empty_cache()
```

## Производительность

| Модель    | GPU      | Генерация 30 с |
| --------- | -------- | -------------- |
| маленькая | RTX 3090 | \~10 с         |
| средняя   | RTX 3090 | \~25 с         |
| большая   | RTX 4090 | \~45с          |
| мелодия   | RTX 3090 | \~30с          |

## Сравнение

| Функция               | MusicGen | Stable Audio | Riffusion |
| --------------------- | -------- | ------------ | --------- |
| Качество              | Отлично  | Отлично      | Хорошо    |
| Длительность          | 30 с     | 90 с         | Цикл      |
| Ввод мелодии          | Да       | Нет          | Нет       |
| Открытый исходный код | Да       | Нет          | Да        |

## Устранение неполадок

### Недостаточно памяти

* Используйте модель меньшего размера (small вместо large)
* Уменьшите длительность
* Очистить кэш: `torch.cuda.empty_cache()`

### Низкое качество

* Используйте более конкретные подсказки
* Попробуйте модель medium или large
* Настройте temperature (0.8-1.2)

### Повторяющийся вывод

* Увеличьте top\_k
* Уменьшите cfg\_coef
* Попробуйте другие подсказки

## Оценка стоимости

Типичные цены на маркетплейсе CLORE.AI (по состоянию на 2024 год):

| GPU        | Почасовая ставка | Дневная ставка | 4-часовая сессия |
| ---------- | ---------------- | -------------- | ---------------- |
| RTX 3060   | \~$0.03          | \~$0.70        | \~$0.12          |
| RTX 3090   | \~$0.06          | \~$1.50        | \~$0.25          |
| RTX 4090   | \~$0.10          | \~$2.30        | \~$0.40          |
| A100 40 ГБ | \~$0.17          | \~$4.00        | \~$0.70          |
| A100 80 ГБ | \~$0.25          | \~$6.00        | \~$1.00          |

*Цены зависят от провайдера и спроса. Проверьте* [*маркетплейс CLORE.AI*](https://clore.ai/marketplace) *актуальные тарифы.*

**Сэкономьте деньги:**

* Используйте **Spot** рынок для прерываемых задач — примерно треть серверов оценивает spot-цены ниже on-demand (медиана \~13% скидки), остальные совпадают с ними
* Платите **CLORE** токенами
* Сравните цены у разных провайдеров

## Дальнейшие шаги

* [Bark TTS](/guides/guides_v2-ru/audio-i-golos/bark-tts.md) - Генерация голоса
* [Клонирование голоса RVC](/guides/guides_v2-ru/audio-i-golos/rvc-voice-clone.md) - Преобразование голоса
* [Разделение Demucs](/guides/guides_v2-ru/audio-i-golos/demucs-separation.md) - Разделение аудио


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/audiocraft-music.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
