# Stable Audio

Генерируйте музыку и звуковые эффекты с помощью Stable Audio от Stability AI на GPU CLORE.AI.

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

## Почему Stable Audio?

* **Высокое качество** - Генерация стереозвука 44,1 кГц
* **Переменная длина** - Генерация до 95 секунд
* **Универсальный** - Музыка, звуковые эффекты, атмосферные звуки
* **Текст в аудио** - Опишите, что хотите услышать
* **Открытые веса** - Доступен Stable Audio Open

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

| Модель            | Длительность | Качество | VRAM | Лицензия     |
| ----------------- | ------------ | -------- | ---- | ------------ |
| Stable Audio Open | 47 сек       | Хорошо   | 8GB  | Откройте     |
| Stable Audio 2.0  | 3 мин        | Отлично  | 12GB | Коммерческое |

## Быстрое развертывание на CLORE.AI

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

```
pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
```

**Порты:**

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

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

```bash
pip install stable-audio-tools gradio && \
python -c "
import gradio as gr
import torch
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond
import soundfile as sf
import tempfile

model, model_config = get_pretrained_model('stabilityai/stable-audio-open-1.0')
model = model.to('cuda')

def generate(prompt, duration, steps, seed):
    conditioning = [{
        'prompt': prompt,
        'seconds_start': 0,
        'seconds_total': duration
    }]

    generator = torch.Generator('cuda').manual_seed(seed) if seed > 0 else None

    output = generate_diffusion_cond(
        model,
        conditioning=conditioning,
        steps=steps,
        cfg_scale=7,
        sample_size=model_config['sample_size'],
        sample_rate=model_config['sample_rate'],
        device='cuda',
        seed=seed if seed > 0 else None
    )

    audio = output[0].T.cpu().numpy()

    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as f:
        sf.write(f.name, audio, model_config['sample_rate'])
        return f.name

gr.Interface(
    fn=generate,
    inputs=[
        gr.Textbox(label='Prompt'),
        gr.Slider(1, 47, value=10, label='Duration (sec)'),
        gr.Slider(10, 150, value=100, label='Steps'),
        gr.Number(value=-1, label='Seed')
    ],
    outputs=gr.Audio(label='Generated Audio'),
    title='Stable Audio Open'
).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` в примерах ниже.

## Требования к оборудованию

| Модель            | Минимальная GPU | Рекомендуется |
| ----------------- | --------------- | ------------- |
| Stable Audio Open | RTX 3070 8GB    | RTX 3090 24GB |
| Stable Audio 2.0  | RTX 3090 12 ГБ  | RTX 4090 24GB |

## Установка

```bash
pip install stable-audio-tools torch torchaudio
```

## Базовое использование

### Текст в музыку

```python
import torch
import torchaudio
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond

# Загрузить модель
model, model_config = get_pretrained_model("stabilityai/stable-audio-open-1.0")
model = model.to("cuda")

sample_rate = model_config["sample_rate"]
sample_size = model_config["sample_size"]

# Определите, что вы хотите
conditioning = [{
    "prompt": "Задорная электронная танцевальная музыка с запоминающейся синтезаторной мелодией, 128 BPM",
    "seconds_start": 0,
    "seconds_total": 30
}]

# Генерация
output = generate_diffusion_cond(
    model,
    conditioning=conditioning,
    steps=100,
    cfg_scale=7,
    sample_size=sample_size,
    sample_rate=sample_rate,
    device="cuda"
)

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

### Звуковые эффекты

```python
conditioning = [{
    "prompt": "Гроза с сильным дождем и далёкими раскатами грома",
    "seconds_start": 0,
    "seconds_total": 20
}]

output = generate_diffusion_cond(
    model,
    conditioning=conditioning,
    steps=100,
    cfg_scale=7,
    sample_size=sample_size,
    sample_rate=sample_rate,
    device="cuda"
)

torchaudio.save("thunderstorm.wav", output[0].T.cpu(), sample_rate)
```

### Атмосферные звуки

```python
conditioning = [{
    "prompt": "Спокойная атмосфера леса с пением птиц и лёгким ветерком",
    "seconds_start": 0,
    "seconds_total": 45
}]

output = generate_diffusion_cond(
    model,
    conditioning=conditioning,
    steps=100,
    cfg_scale=7,
    sample_size=sample_size,
    sample_rate=sample_rate,
    device="cuda"
)

torchaudio.save("forest.wav", output[0].T.cpu(), sample_rate)
```

## Примеры подсказок

### Жанры музыки

```python
prompts = {
    "electronic": "Энергичный EDM-трек с глубоким басом, синтезаторными арпеджио и драйвовым битом, 130 BPM",
    "jazz": "Мягкий джазовый фортепианный трио с контрабасом и барабанами с щетками, расслабленный темп",
    "rock": "Тяжёлый рок-риф на гитаре с дисторшном, барабанами и басом, мощно и энергично",
    "classical": "Оркестровая пьеса со струнными и деревянными духами, драматично и кинематографично",
    "ambient": "Атмосферный эмбиент с падовыми звуками и тонкими текстурами, мечтательно",
    "hiphop": "Лоу-фай хип-хоп бита с шумом винила, спокойным фортепиано и расслабленными ударными, 85 BPM"
}
```

### Звуковые эффекты

```python
prompts = {
    "explosion": "Мощный взрыв с обломками и огнём, кинематографично",
    "footsteps": "Шаги по гравию, медленный шаговой темп",
    "car": "Рев двигателя спортивного автомобиля и разгон",
    "water": "Брызги воды и капание в пещере",
    "wind": "Сильный ветер, завывающий по горам",
    "fire": "Трещащий костёр с потрескиванием дров"
}
```

### Атмосфера/Фон

```python
prompts = {
    "cafe": "Атмосфера кофейни с тихими разговорами и работой кофемашины",
    "ocean": "Океанские волны на песчаном пляже, чайки вдалеке",
    "city": "Оживлённая городская улица с движением, гудками и пешеходами",
    "rain": "Нежный дождь по окну с редкими раскатами грома",
    "space": "Гул и сигналы внутри научно-фантастического космического корабля"
}
```

## Дополнительные параметры

### Управление генерацией

```python
output = generate_diffusion_cond(
    model,
    conditioning=conditioning,
    steps=150,              # Больше шагов = лучшее качество
    cfg_scale=7,            # Соответствие подсказке (5-10)
    sample_size=sample_size,
    sample_rate=sample_rate,
    device="cuda",
    seed=42                 # Воспроизводимые результаты
)
```

### Переменная длина

```python
# Короткий звуковой эффект (5 секунд)
conditioning = [{
    "prompt": "Дверь медленно скрипит при открывании",
    "seconds_start": 0,
    "seconds_total": 5
}]

# Средний клип (30 секунд)
conditioning = [{
    "prompt": "Задорная рок-музыка",
    "seconds_start": 0,
    "seconds_total": 30
}]

# Максимальная длина (47 секунд для Open)
conditioning = [{
    "prompt": "Атмосферная электронная музыка с развивающимися текстурами",
    "seconds_start": 0,
    "seconds_total": 47
}]
```

## Пакетная генерация

```python
import os

prompts = [
    "Energetic drum and bass track",
    "Calm piano melody",
    "Sci-fi laser sound effects",
    "Rain on a tin roof"
]

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

for i, prompt in enumerate(prompts):
    conditioning = [{
        "prompt": prompt,
        "seconds_start": 0,
        "seconds_total": 15
    }]

    output = generate_diffusion_cond(
        model,
        conditioning=conditioning,
        steps=100,
        cfg_scale=7,
        sample_size=sample_size,
        sample_rate=sample_rate,
        device="cuda"
    )

    torchaudio.save(f"{output_dir}/audio_{i}.wav", output[0].T.cpu(), sample_rate)
    print(f"Generated: {prompt[:30]}...")

    torch.cuda.empty_cache()
```

## Веб-интерфейс Gradio

```python
import gradio as gr
import torch
import torchaudio
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond
import tempfile

model, model_config = get_pretrained_model("stabilityai/stable-audio-open-1.0")
model = model.to("cuda")

sample_rate = model_config["sample_rate"]
sample_size = model_config["sample_size"]

def generate_audio(prompt, duration, steps, cfg_scale, seed):
    conditioning = [{
        "prompt": prompt,
        "seconds_start": 0,
        "seconds_total": duration
    }]

    generator_seed = seed if seed > 0 else None

    output = generate_diffusion_cond(
        model,
        conditioning=conditioning,
        steps=steps,
        cfg_scale=cfg_scale,
        sample_size=sample_size,
        sample_rate=sample_rate,
        device="cuda",
        seed=generator_seed
    )

    audio = output[0].T.cpu()

    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        torchaudio.save(f.name, audio, sample_rate)
        return f.name

demo = gr.Interface(
    fn=generate_audio,
    inputs=[
        gr.Textbox(label="Prompt", placeholder="Опишите желаемое аудио..."),
        gr.Slider(1, 47, value=15, step=1, label="Длительность (секунды)"),
        gr.Slider(20, 200, value=100, step=10, label="Шаги"),
        gr.Slider(1, 15, value=7, step=0.5, label="CFG Scale"),
        gr.Number(value=-1, label="Seed (-1 для случайного)")
    ],
    outputs=gr.Audio(label="Сгенерированное аудио", type="filepath"),
    title="Stable Audio Open - Текст в аудио",
    description="Генерируйте музыку и звуковые эффекты по текстовым описаниям. Запуск на CLORE.AI.",
    examples=[
        ["Задорная электронная танцевальная музыка с синтезаторами, 128 BPM", 20, 100, 7, 42],
        ["Гроза с сильным дождём", 15, 100, 7, 123],
        ["Спокойная фортепианная мелодия, эмоциональная", 30, 100, 7, 456]
    ]
)

demo.launch(server_name="0.0.0.0", server_port=7860)
```

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

| Длительность | Шаги | GPU      | Время |
| ------------ | ---- | -------- | ----- |
| 10 сек       | 100  | RTX 3090 | \~15с |
| 10 сек       | 100  | RTX 4090 | \~10с |
| 30 сек       | 100  | RTX 3090 | \~40с |
| 30 сек       | 100  | RTX 4090 | \~25с |
| 47 сек       | 100  | RTX 4090 | \~40с |

## Советы по качеству

### Лучше для музыки

```python
# Указывайте темп и стиль
prompt = "Энергичная рок-музыка, электрогитара, барабаны, бас, 140 BPM, высокий уровень энергии"

# Будьте конкретны насчёт инструментов
prompt = "Соло на акустической гитаре фингерпик, фолковый стиль, тёпло и интимно"

# Опишите настроение
prompt = "Меланхоличная фортепианная пьеса, минорная тональность, медленный темп, эмоционально и печально"
```

### Лучше для звуковых эффектов

```python
# Будьте конкретны
prompt = "Одиночный выстрел из винтовки, на улице, эхо"

# Указывайте окружение
prompt = "Шаги по деревянному полу, внутри помещения, медленный темп, скрип"

# Опишите текстуру
prompt = "Потрескивание огня, большой костёр, треск дров, искры"
```

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

Типичные расценки на маркетплейсе CLORE.AI:

| GPU           | Почасовая ставка | \~30-сек фрагментов/час |
| ------------- | ---------------- | ----------------------- |
| RTX 3060 12GB | \~$0.03          | \~50                    |
| RTX 3090 24GB | \~$0.06          | \~90                    |
| RTX 4090 24GB | \~$0.10          | \~140                   |
| A100 40GB     | \~$0.17          | \~200                   |

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

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

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

```python
# Уменьшите длительность
conditioning = [{
    "prompt": prompt,
    "seconds_total": 15  # Вместо 47
}]

# Или включите выгрузку на CPU
model.enable_model_cpu_offload()
```

### Плохое качество вывода

* Увеличьте количество шагов (150-200)
* Отрегулируйте CFG scale (попробуйте 5-10)
* Будьте более конкретны в подсказке
* Попробуйте другие seed'ы

### Нет звука / тишина

* Проверьте, достаточно ли подробна подсказка
* Избегайте очень абстрактных описаний
* Сначала попробуйте рабочие известные подсказки

### Аудио-артефакты

* Увеличьте количество шагов
* Уменьшите CFG scale
* Сократите длительность
* Проверьте троттлинг GPU из-за температуры

## Stable Audio vs Другие

| Функция      | Stable Audio | AudioCraft | Bark   |
| ------------ | ------------ | ---------- | ------ |
| Музыка       | Отлично      | Отлично    | Плохо  |
| SFX          | Отлично      | Хорошо     | Плохо  |
| Речь         | Нет          | Нет        | Да     |
| Длительность | 47с / 3мин   | 30с        | 15с    |
| Качество     | 44,1 кГц     | 32 кГц     | 24 кГц |
| Откройте     | Частично     | Да         | Да     |

**Используйте Stable Audio когда:**

* Генерация музыки высокого качества
* Звуковые эффекты для игр/видео
* Фоновая музыка
* Атмосферные звуковые пейзажи

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

* [AudioCraft](https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/audiocraft-music) - Генерация музыки от Meta
* [Bark TTS](https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/bark-tts) - Синтез речи
* [Demucs](https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/demucs-separation) - Разделение аудио
* [Whisper](https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/whisper-transcription) - Распознавание речи
