# Клонирование голоса Zonos TTS

Zonos от [Zyphra](https://www.zyphra.com/) — это 0.4B-параметрическая модель текст-в-речь с открытыми весами, обученная на более чем 200 тыс. часов многоязычной речи. Она выполняет нулевое клонирование голоса по всего 2–30 секундам эталонного аудио и предоставляет тонкую настройку эмоций, скорости речи, вариации тона и качества аудио. Выходной звук — высококачественное аудио 44 кГц. Доступны два варианта модели: Transformer (лучшее качество) и Hybrid/Mamba (быстрее при инференсе).

**GitHub:** [Zyphra/Zonos](https://github.com/Zyphra/Zonos) **HuggingFace:** [Zyphra/Zonos-v0.1-transformer](https://huggingface.co/Zyphra/Zonos-v0.1-transformer) **Лицензия:** Apache 2.0

## Ключевые особенности

* **Клонирование голоса по 2–30 секундам** — тонкой дообучения не требуется
* **Выход 44 кГц высокого качества** — студийное качество звука
* **Управление эмоциями** — радость, печаль, гнев, страх, удивление, отвращение через 8D-вектор
* **Скорость речи и тон** — независимый тонконастраиваемый контроль
* **Входные аудио-префиксы** — позволяет имитировать шёпот и другие трудноклонируемые поведения
* **Мультиязычность** — английский, японский, китайский, французский, немецкий
* **Две архитектуры** — Transformer (качество) и Hybrid/Mamba (скорость, \~2× реального времени на RTX 4090)
* **Apache 2.0** — бесплатно для личного и коммерческого использования

## Требования

| Компонент | Минимум            | Рекомендуется  |
| --------- | ------------------ | -------------- |
| GPU       | RTX 3080 10 ГБ     | RTX 4090 24 ГБ |
| VRAM      | 6 ГБ (Transformer) | 10 ГБ+         |
| ОЗУ       | 16 ГБ              | 32 ГБ          |
| Диск      | 10 ГБ              | 20 ГБ          |
| Python    | 3.10+              | 3.11           |
| CUDA      | 11.8+              | 12.4           |
| Система   | espeak-ng          | —              |

**Рекомендация Clore.ai:** RTX 3090 (~~$0.30–1.00/день) для комфортного запаса. RTX 4090 (~~$0.50–2.00/день) для модели Hybrid и максимально быстрого инференса.

## Установка

```bash
# Установите системную зависимость
apt-get install -y espeak-ng

# Клонировать и установить
git clone https://github.com/Zyphra/Zonos.git
cd Zonos
pip install -e .

# Для Hybrid-модели (требуется GPU Ampere+ — т.е. серия RTX 3000 или новее)
pip install -e ".[compile]"

# Проверка
python -c "from zonos.model import Zonos; print('Zonos ready')"
```

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

```python
import torch
import torchaudio
from zonos.model import Zonos
from zonos.conditioning import make_cond_dict

# Загрузить модель (веса скачиваются при первом запуске)
model = Zonos.from_pretrained("Zyphra/Zonos-v0.1-transformer", device="cuda")

# Загрузите эталонное аудио для клонирования голоса
wav, sr = torchaudio.load("reference_speaker.wav")
speaker = model.make_speaker_embedding(wav, sr)

# Построить кондиционирование
cond_dict = make_cond_dict(
    text="Hello from Clore.ai! This is a voice cloning demonstration.",
    speaker=speaker,
    language="en-us",
)
conditioning = model.prepare_conditioning(cond_dict)

# Генерация
torch.manual_seed(42)
codes = model.generate(conditioning)
wavs = model.autoencoder.decode(codes).cpu()

torchaudio.save("output.wav", wavs[0], model.autoencoder.sampling_rate)
print(f"Saved output.wav at {model.autoencoder.sampling_rate} Hz")
```

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

### Управление эмоциями

Zonos принимает 8-мерный вектор эмоций: `[радость, печаль, отвращение, страх, удивление, гнев, другое, нейтральный]`.

```python
import torch
import torchaudio
from zonos.model import Zonos
from zonos.conditioning import make_cond_dict

model = Zonos.from_pretrained("Zyphra/Zonos-v0.1-transformer", device="cuda")

wav, sr = torchaudio.load("speaker_ref.wav")
speaker = model.make_speaker_embedding(wav, sr)

text = "I can't believe what just happened today!"

emotions = {
    "happy":   [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    "sad":     [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    "angry":   [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0],
    "fearful": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
    "neutral": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
}

for name, emo_vec in emotions.items():
    cond_dict = make_cond_dict(
        text=text,
        speaker=speaker,
        language="en-us",
        emotion=torch.tensor(emo_vec).unsqueeze(0),
    )
    conditioning = model.prepare_conditioning(cond_dict)
    codes = model.generate(conditioning)
    audio = model.autoencoder.decode(codes).cpu()
    torchaudio.save(f"emotion_{name}.wav", audio[0], model.autoencoder.sampling_rate)
    print(f"Создано: {name}")
```

### Управление скоростью речи и тоном

```python
import torch
import torchaudio
from zonos.model import Zonos
from zonos.conditioning import make_cond_dict

model = Zonos.from_pretrained("Zyphra/Zonos-v0.1-transformer", device="cuda")

wav, sr = torchaudio.load("speaker_ref.wav")
speaker = model.make_speaker_embedding(wav, sr)

# Медленно и спокойно
cond_slow = make_cond_dict(
    text="Take your time. There is no rush at all.",
    speaker=speaker,
    language="en-us",
    speaking_rate=torch.tensor([8.0]),   # меньше = медленнее
    pitch_std=torch.tensor([20.0]),      # меньше = более монотонно
)
codes = model.generate(model.prepare_conditioning(cond_slow))
audio = model.autoencoder.decode(codes).cpu()
torchaudio.save("slow_calm.wav", audio[0], model.autoencoder.sampling_rate)

# Быстро и энергично
cond_fast = make_cond_dict(
    text="Hurry up! We need to go right now!",
    speaker=speaker,
    language="en-us",
    speaking_rate=torch.tensor([22.0]),  # больше = быстрее
    pitch_std=torch.tensor([80.0]),      # больше = более выразительно
)
codes = model.generate(model.prepare_conditioning(cond_fast))
audio = model.autoencoder.decode(codes).cpu()
torchaudio.save("fast_energetic.wav", audio[0], model.autoencoder.sampling_rate)
```

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

```bash
cd Zonos
python gradio_interface.py
# Или с uv:
# uv run gradio_interface.py
```

Открыть порт `7860/http` в вашем заказе Clore.ai и открыть `http_pub` URL для доступа к интерфейсу.

## Советы для пользователей Clore.ai

* **Выбор модели** — Transformer для лучшего качества, Hybrid для примерно в 2× более быстрого инференса (требуется GPU серии RTX 3000+)
* **Эталонное аудио** — 10–30 секунд чистой речи дают лучшие результаты; более короткие клипы (2–5 с) работают, но с меньшей точностью
* **Настройка Docker** — используйте `pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime`, добавьте `apt-get install -y espeak-ng` в автозагрузку
* **Проброс портов** — откройте `7860/http` для интерфейса Gradio, `8000/http` для сервера API
* **Контроль сидирования (seed)** — установите `torch.manual_seed()` перед генерацией для воспроизводимого результата
* **Параметр качества аудио** — экспериментируйте с полем `audio_quality` в conditioning для более чистого вывода

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

| Проблема                               | Решение                                                                                                   |
| -------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `espeak-ng не найден`                  | Запустите `apt-get install -y espeak-ng` (требуется для фонемизации)                                      |
| `CUDA — недостаточно памяти`           | Используйте модель Transformer (меньше, чем Hybrid); уменьшите длину текста на вызов                      |
| Hybrid-модель не запускается           | Требуется GPU Ampere+ (серия RTX 3000 или новее) и `pip install -e ".[compile]"`                          |
| Клонированный голос звучит неправильно | Используйте более длинный эталонный фрагмент (15–30 с) с чёткой речью и минимальным фоновым шумом         |
| Медленная генерация                    | Нормально для Transformer (\~0.5× реального времени); Hybrid достигает \~2× реального времени на RTX 4090 |
| `ModuleNotFoundError: zonos`           | Убедитесь, что вы установили из исходников: `cd Zonos && pip install -e .`                                |
