> 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/styletss2.md).

# StyleTTS2

Запустите text-to-speech уровня человека StyleTTS2 через style diffusion на GPU Clore.ai

StyleTTS2 достигает оценок естественности, выставленных людьми, выше, чем у эталонных записей на бенчмарках LJSpeech и LibriTTS (MOS 4,55 против 4,23 у эталона). Он использует **диффузию стиля** и **состязательное обучение** для моделирования стилей речи как распределения скрытой переменной, что позволяет выразительный синтез и адаптацию к новому диктору по короткому эталонному фрагменту.

В отличие от традиционных TTS-систем, StyleTTS2 может обобщаться на невиданных дикторов по короткому эталонному аудиофрагменту, создавая речь, сопоставимую с работой профессиональных актёров озвучивания. На нескольких наборах данных он показал оценки естественности выше, чем у людей, — это впервые для open-source TTS.

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

* **Естественность на уровне человека** — превосходит человеческие оценки MOS на LJSpeech
* **Адаптация к новому диктору без обучения** — клонируйте любой голос по короткому аудиосемплу
* **Диффузия стиля** — выразительная, разнообразная просодия и стиль речи
* **Поддержка нескольких дикторов** — обучен на LibriTTS (более 2 300 дикторов)
* **Лёгкий инференс** — эффективно работает на потребительских GPU

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

***

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

| Параметр | Минимум                | Рекомендуется           |
| -------- | ---------------------- | ----------------------- |
| GPU      | NVIDIA RTX 3070 (8 ГБ) | NVIDIA RTX 4090 (24 ГБ) |
| VRAM     | 6 ГБ                   | 12–24 ГБ                |
| ОЗУ      | 16 ГБ                  | 32 ГБ                   |
| CPU      | 4 ядра                 | 8+ ядер                 |
| Диск     | 15 ГБ                  | 30 ГБ                   |
| ОС       | Ubuntu 20.04+          | Ubuntu 22.04            |
| CUDA     | 11.7+                  | 12.1+                   |
| Python   | 3.8+                   | 3.10                    |
| Порты    | 22, 7860               | 22, 7860                |

{% hint style="info" %}
StyleTTS2 относительно лёгкий — RTX 3070 или 3080 легко справляется с инференсом в реальном времени. Для пакетной обработки или обслуживания одновременных пользователей используйте 4090 или A100.
{% endhint %}

***

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

StyleTTS2 требует пользовательской сборки Docker, так как официального готового образа не существует. Настройка занимает около 10 минут.

### 1. Найдите подходящий сервер

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

* **VRAM**: ≥ 6 ГБ
* **GPU**: RTX 3070, 3080, 3090, 4080, 4090, A100
* **Диск**: ≥ 20 ГБ

### 2. Настройте своё развёртывание

**Docker-образ (базовый):**

```
nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
```

**Сопоставление портов:**

```
22   → доступ по SSH
7860 → веб-интерфейс Gradio
```

**Команда запуска:**

```bash
bash -c "apt-get update && apt-get install -y git python3 python3-pip ffmpeg espeak-ng && \
  git clone https://github.com/yl4579/StyleTTS2 /workspace/StyleTTS2 && \
  cd /workspace/StyleTTS2 && pip install -r requirements.txt && \
  python app.py"
```

### 3. Откройте интерфейс

```
http://<your-clore-server-ip>:7860
```

***

## Пошаговая настройка

### Шаг 1: Подключитесь к серверу по SSH

```bash
ssh root@<your-clore-server-ip> -p <ssh-port>
```

### Шаг 2: Установите системные зависимости

```bash
apt-get update && apt-get install -y \
  git \\
  python3 \
  python3-pip \
  python3-venv \
  ffmpeg \
  espeak-ng \
  libsndfile1 \
  build-essential \\
  wget \\
  curl
```

### Шаг 3: Клонируйте репозиторий StyleTTS2

```bash
cd /workspace
git clone https://github.com/yl4579/StyleTTS2.git
cd StyleTTS2
```

### Шаг 4: Создайте виртуальное окружение Python

```bash
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
```

### Шаг 5: Установите зависимости

```bash
pip install -r requirements.txt

# При необходимости установите дополнительные зависимости
pip install phonemizer gruut
```

### Шаг 6: Скачайте предобученные модели

```bash
# Скачайте модель LJSpeech (один диктор, высокое качество)
mkdir -p Models/LJSpeech
wget -O Models/LJSpeech/epoch_2nd_00100.pth \
  "https://huggingface.co/yl4579/StyleTTS2-LJSpeech/resolve/main/Models/LJSpeech/epoch_2nd_00100.pth"

wget -O Models/LJSpeech/config.yml \
  "https://huggingface.co/yl4579/StyleTTS2-LJSpeech/resolve/main/Models/LJSpeech/config.yml"

# Скачайте модель LibriTTS (многодикторная, zero-shot)
mkdir -p Models/LibriTTS
wget -O Models/LibriTTS/epochs_2nd_00020.pth \
  "https://huggingface.co/yl4579/StyleTTS2-LibriTTS/resolve/main/Models/LibriTTS/epochs_2nd_00020.pth"

wget -O Models/LibriTTS/config.yml \
  "https://huggingface.co/yl4579/StyleTTS2-LibriTTS/resolve/main/Models/LibriTTS/config.yml"
```

### Шаг 7: Соберите и запустите Dockerfile

```bash
# Создайте Dockerfile
cat > Dockerfile << 'EOF'
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \\
    git python3 python3-pip python3-venv \
    ffmpeg espeak-ng libsndfile1 build-essential wget curl \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /workspace
RUN git clone https://github.com/yl4579/StyleTTS2.git
WORKDIR /workspace/StyleTTS2
RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 7860
CMD ["python3", "app.py", "--share"]
EOF

docker build -t styletts2:local .
docker run -d --name styletts2 --gpus all \
  -p 7860:7860 \\
  -v /workspace/models:/workspace/StyleTTS2/Models \
  styletts2:local
```

### Шаг 8: Запустите демо Gradio напрямую

```bash
source venv/bin/activate
python app.py
```

Доступ по адресу `http://<server-ip>:7860`

***

## Примеры использования

### Пример 1: Базовый TTS через Python API

```python
import torch
import soundfile as sf
import numpy as np
from models import *
from utils import *
import yaml

# Загрузите конфиг
config = yaml.safe_load(open("Models/LJSpeech/config.yml"))

# Инициализируйте модель
model = build_model(recursive_munch(config['model_params']), "cpu")
params = torch.load("Models/LJSpeech/epoch_2nd_00100.pth", map_location='cpu')
model = load_F0_models(model)

# Переместите на GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
for key in model:
    model[key] = model[key].to(device)

print(f"Модель загружена на: {device}")
print(f"Использовано VRAM: {torch.cuda.memory_allocated()/1e9:.2f} ГБ")
```

***

### Пример 2: Клонирование голоса zero-shot

```python
import torch
import torchaudio
import soundfile as sf
from inference import StyleTTS2Inference

# Инициализируйте движок инференса
tts = StyleTTS2Inference(
    model_path="Models/LibriTTS/epochs_2nd_00020.pth",
    config_path="Models/LibriTTS/config.yml",
    device="cuda"
)

# Загрузите эталонное аудио (лучше всего работает 10–30 секунд)
reference_audio, sr = torchaudio.load("reference_voice.wav")

# Сгенерируйте речь эталонным голосом
text = "Clore.ai предоставляет мощную GPU-инфраструктуру для ИИ-приложений, включая синтез речи."

audio = tts.synthesize(
    text=text,
    reference_audio=reference_audio,
    reference_sr=sr,
    diffusion_steps=10,    # Больше = лучшее качество, медленнее
    embedding_scale=1.5,   # Управляет силой стиля
    alpha=0.3,             # Вес акустического стиля
    beta=0.7,              # Вес просодического стиля
)

sf.write("cloned_voice_output.wav", audio, 24000)
print("Результат клонированного голоса сохранён!")
```

***

### Пример 3: Управление выразительным стилем

```python
from inference import StyleTTS2Inference
import soundfile as sf

tts = StyleTTS2Inference(
    model_path="Models/LibriTTS/epochs_2nd_00020.pth",
    config_path="Models/LibriTTS/config.yml",
    device="cuda"
)

text = "Добро пожаловать на нашу презентацию о GPU-вычислениях с Clore.ai."

# Поэкспериментируйте с различными параметрами стиля
style_configs = [
    {"name": "neutral",    "alpha": 0.3, "beta": 0.7, "diffusion_steps": 5},
    {"name": "expressive", "alpha": 0.5, "beta": 0.9, "diffusion_steps": 15},
    {"name": "fast",       "alpha": 0.1, "beta": 0.3, "diffusion_steps": 3},
    {"name": "slow_deep",  "alpha": 0.7, "beta": 0.5, "diffusion_steps": 20},
]

for cfg in style_configs:
    audio = tts.synthesize(
        text=text,
        diffusion_steps=cfg["diffusion_steps"],
        alpha=cfg["alpha"],
        beta=cfg["beta"],
    )
    filename = f"style_{cfg['name']}.wav"
    sf.write(filename, audio, 24000)
    print(f"Сгенерировано: {filename}")
```

***

### Пример 4: Веб-интерфейс Gradio

```python
import gradio as gr
import soundfile as sf
import numpy as np
from inference import StyleTTS2Inference
import tempfile

tts = StyleTTS2Inference(
    model_path="Models/LibriTTS/epochs_2nd_00020.pth",
    config_path="Models/LibriTTS/config.yml",
    device="cuda"
)

def synthesize(text, reference_audio, diffusion_steps, alpha, beta):
    if reference_audio is not None:
        sr, audio_data = reference_audio
        # Преобразуйте в ожидаемый формат
        ref_audio = audio_data.astype(np.float32) / 32768.0
    else:
        ref_audio = None
        sr = None

    output = tts.synthesize(
        text=text,
        reference_audio=ref_audio,
        reference_sr=sr,
        diffusion_steps=int(diffusion_steps),
        alpha=alpha,
        beta=beta,
    )

    # Сохраните во временный файл
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        sf.write(f.name, output, 24000)
        return f.name

demo = gr.Interface(
    fn=synthesize,
    inputs=[
        gr.Textbox(label="Входной текст", lines=4),
        gr.Audio(label="Эталонный голос (необязательно)", type="numpy"),
        gr.Slider(1, 30, value=10, label="Шаги диффузии"),
        gr.Slider(0.0, 1.0, value=0.3, label="Alpha (акустический стиль)"),
        gr.Slider(0.0, 1.0, value=0.7, label="Beta (просодический стиль)"),
    ],
    outputs=gr.Audio(label="Сгенерированная речь"),
    title="StyleTTS2 на GPU Clore.ai",
    description="TTS уровня человека с диффузией стиля"
)

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

***

### Пример 5: Пакетная генерация аудиокниги

```python
import soundfile as sf
import numpy as np
from pathlib import Path
from inference import StyleTTS2Inference

tts = StyleTTS2Inference(
    model_path="Models/LibriTTS/epochs_2nd_00020.pth",
    config_path="Models/LibriTTS/config.yml",
    device="cuda"
)

# Разделите текст на абзацы
book_text = """
Глава первая: Революция GPU

Историю искусственного интеллекта невозможно отделить от эволюции 
графических процессоров. То, что начиналось как специализированное оборудование для отрисовки пикселей, 
стало двигателем современной революции ИИ.

Глава вторая: Распределённые вычисления

По мере роста моделей обучение на одном GPU уступило место распределённым системам. 
Платформы вроде Clore.ai появились, чтобы демократизировать доступ к этой вычислительной мощности, 
делая GPU-инфраструктуру уровня enterprise доступной отдельным пользователям и стартапам.
""".strip()

paragraphs = [p.strip() for p in book_text.split('\n\n') if p.strip()]
output_dir = Path("audiobook_output")
output_dir.mkdir(exist_ok=True)

audio_segments = []
for i, paragraph in enumerate(paragraphs):
    print(f"Обработка абзаца {i+1}/{len(paragraphs)}...")
    audio = tts.synthesize(
        text=paragraph,
        diffusion_steps=10,
        alpha=0.3,
        beta=0.7,
    )
    segment_path = output_dir / f"segment_{i+1:03d}.wav"
    sf.write(str(segment_path), audio, 24000)
    audio_segments.append(audio)
    print(f"  ✓ Сохранено {segment_path}")

# Объедините все сегменты с короткой тишиной
silence = np.zeros(int(24000 * 0.5))  # 0,5 секунды тишины
full_audio = []
for seg in audio_segments:
    full_audio.append(seg)
    full_audio.append(silence)

combined = np.concatenate(full_audio)
sf.write("audiobook_complete.wav", combined, 24000)
print(f"\nПолная аудиокнига: {len(combined)/24000:.1f} секунд")
```

***

## Конфигурация

### Ключевые параметры config.yml

```yaml
model_params:
  dim_in: 64
  hidden_dim: 512
  max_conv_dim: 512
  n_layer: 3
  n_mels: 80

diffusion:
  timesteps: 1000
  beta_schedule: "squaredcos_cap_v2"

training:
  batch_size: 16
  epochs: 100
  save_freq: 10
```

### Параметры инференса

| Параметр          | Диапазон | По умолчанию | Эффект                                     |
| ----------------- | -------- | ------------ | ------------------------------------------ |
| `diffusion_steps` | 1–30     | 10           | Компромисс между качеством и скоростью     |
| `alpha`           | 0.0–1.0  | 0.3          | Вес акустического стиля из эталона         |
| `beta`            | 0.0–1.0  | 0.7          | Вес просодического стиля из эталона        |
| `embedding_scale` | 1.0–3.0  | 1.5          | Общая интенсивность стиля                  |
| `t`               | 0.6–1.0  | 0.7          | Уровень шума (выше = больше вариативность) |

***

## Советы по производительности

### 1. Оптимизируйте число шагов диффузии

Значение по умолчанию — 10 шагов — обеспечивает баланс между качеством и скоростью. Для приложений в реальном времени используйте 5 шагов; для максимального качества — 20–30.

```python
# В реальном времени (быстро)
audio = tts.synthesize(text, diffusion_steps=5)

# Высокое качество (медленно)
audio = tts.synthesize(text, diffusion_steps=20)
```

### 2. Используйте torch.compile (PyTorch 2.0+)

```python
import torch
model = torch.compile(model, mode="reduce-overhead")
```

### 3. Инференс с mixed precision

```python
with torch.autocast(device_type="cuda", dtype=torch.float16):
    audio = tts.synthesize(text, diffusion_steps=10)
```

### 4. Обрабатывайте несколько предложений пакетом

По возможности обрабатывайте несколько предложений вместе, чтобы максимально загрузить GPU и уменьшить накладные расходы.

### 5. Кэшируйте эмбеддинги эталонного диктора

```python
# Вычислите один раз, используйте много раз
speaker_embedding = tts.compute_speaker_embedding(reference_audio, sr)

# Переиспользуйте для нескольких высказываний
for text in texts:
    audio = tts.synthesize_with_embedding(text, speaker_embedding)
```

***

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

### Проблема: espeak-ng не найден

```bash
apt-get install -y espeak-ng espeak-ng-data
# Проверьте установку
espeak-ng --version
```

### Проблема: сбой Phonemizer

```bash
pip install phonemizer
# Проверка
python3 -c "from phonemizer import phonemize; print(phonemize('hello world'))"
```

### Проблема: нехватка памяти CUDA

```bash
# Уменьшите размер батча или используйте выгрузку на CPU
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:256
# Или переключитесь на FP16
```

### Проблема: плохое качество звука

* Увеличьте `diffusion_steps` до 15–20
* Убедитесь, что эталонное аудио чистое, минимум 16 кГц
* Попробуйте скорректировать `alpha` и `beta` параметры
* Используйте более длинный эталонный аудиофрагмент (15–30 секунд)

### Проблема: не удаётся скачать модель с Hugging Face

```bash
pip install huggingface_hub
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('yl4579/StyleTTS2-LibriTTS', local_dir='Models/LibriTTS')
"
```

***

## Рекомендации по GPU для Clore.ai

StyleTTS2 — лёгкая модель: чекпойнт LibriTTS весит около 300 МБ, инференс быстрый даже на скромных GPU.

| GPU        | VRAM  | Цена Clore.ai                               | Скорость инференса       | Лучше всего для                       |
| ---------- | ----- | ------------------------------------------- | ------------------------ | ------------------------------------- |
| только CPU | —     | \~$0.02/ч                                   | \~0.5× реального времени | Разработка, тестирование              |
| RTX 3090   | 24 ГБ | $0.07–0.21/ч                                | \~15× реального времени  | Production API, клонирование голоса   |
| RTX 4090   | 24 ГБ | $0.14–0.42/ч                                | \~25× реального времени  | API с высокой конкуренцией            |
| A100 40 ГБ | 40 ГБ | [голое железо](https://clore.ai/bare-metal) | \~40× реального времени  | Генерация аудиокниг большими пакетами |

{% hint style="info" %}
**RTX 3090 за $0.07–0.21/ч** — оптимальный выбор для StyleTTS2. Модель достаточно мала, так что вы почти не тратите время GPU — полный час синтезированного аудио обходится менее чем в $0,01 по аренде GPU. Для производства аудиокниг или сервисов клонирования голоса это крайне экономично.
{% endhint %}

**Совет по качеству клонирования голоса zero-shot:** Предоставьте 15–30 секунд чистого эталонного аудио с частотой 22 кГц или 24 кГц. Модулю диффузии стиля нужно достаточно аудио, чтобы точно уловить стиль речи, темп и просодию. Шумные или слишком короткие эталоны значительно ухудшают качество вывода.

***

## Ссылки

* **GitHub**: <https://github.com/yl4579/StyleTTS2>
* **Статья (arXiv)**: <https://arxiv.org/abs/2306.07691>
* **Hugging Face (LJSpeech)**: <https://huggingface.co/yl4579/StyleTTS2-LJSpeech>
* **Hugging Face (LibriTTS)**: <https://huggingface.co/yl4579/StyleTTS2-LibriTTS>
* **Демо-пространство**: <https://huggingface.co/spaces/styletts2/styletts2>
* **маркетплейс CLORE.AI**: <https://clore.ai/marketplace>


---

# 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/styletss2.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.
