# Разговорный TTS ChatTTS

ChatTTS — это генеративная речевая модель на 300 млн параметров, оптимизированная для диалоговых сценариев, таких как ассистенты на базе LLM, чат-боты и интерактивные голосовые приложения. Она воспроизводит естественно звучащую речь с реалистичными паузами, смехом, заполняющими словами и интонацией — характеристиками, которые большинству систем TTS трудно воспроизвести. Модель поддерживает английский и китайский языки и генерирует аудио с частотой 24 кГц.

**GitHub:** [2noise/ChatTTS](https://github.com/2noise/ChatTTS) (30K+ звезд) **Лицензия:** AGPLv3+ (код), CC BY-NC 4.0 (веса модели — некоммерческое использование)

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

* **Разговорная просодия** — естественные паузы, заполняющие слова и интонация, настроенные для диалога
* **Метки тонкого управления** — `[oral_0-9]`, `[laugh_0-2]`, `[break_0-7]`, `[uv_break]`, `[lbreak]`
* **Многоабонентность** — выбор случайных голосов или повторное использование встраиваний говорящего для согласованности
* **Температура / top-P / top-K** — управление разнообразием генерации
* **Пакетное инференсирование** — синтез нескольких текстов в одном вызове
* **Легковесность** — \~300M параметров, работает на 4 ГБ видеопамяти

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

| Компонент | Минимум                  | Рекомендуется       |
| --------- | ------------------------ | ------------------- |
| GPU       | RTX 3060 (4 ГБ свободно) | RTX 3090 / RTX 4090 |
| VRAM      | 4 ГБ                     | 8 ГБ+               |
| ОЗУ       | 8 ГБ                     | 16 ГБ               |
| Диск      | 5 ГБ                     | 10 ГБ               |
| Python    | 3.9+                     | 3.11                |
| CUDA      | 11.8+                    | 12.1+               |

**Рекомендация Clore.ai:** RTX 3060 (~~$0.15–0.30/день) комфортно обрабатывает ChatTTS. Для массового производства или меньшей задержки выберите RTX 3090 (~~$0.30–1.00/день).

## Установка

```bash
# Установить из PyPI
pip install ChatTTS torch torchaudio

# Или установите из исходников для получения последних функций
git clone https://github.com/2noise/ChatTTS.git
cd ChatTTS
pip install -r requirements.txt

# Проверить GPU
python -c "import torch; print(torch.cuda.get_device_name(0))"
```

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

```python
import ChatTTS
import torch
import torchaudio

# Инициализируйте и загрузите модель (веса загружаются при первом запуске)
chat = ChatTTS.Chat()
chat.load(compile=False)  # Установите compile=True для более быстрой работы после прогрева

texts = [
    "Привет! Как проходит твой день?",
    "Я работал над этим проектом всё утро. Всё неплохо продвигается.",
]

wavs = chat.infer(texts)

for i, wav in enumerate(wavs):
    audio_tensor = torch.from_numpy(wav)
    if audio_tensor.dim() == 1:
        audio_tensor = audio_tensor.unsqueeze(0)
    torchaudio.save(f"output_{i}.wav", audio_tensor, 24000)
    print(f"Сохранено output_{i}.wav")
```

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

### Согласованный голос говорящего

Выберите случайное встраивание говорящего и повторно используйте его для нескольких генераций для согласованного голоса:

```python
import ChatTTS
import torch
import torchaudio

chat = ChatTTS.Chat()
chat.load(compile=False)

# Выбор говорящего — сохраните эту строку, чтобы использовать позже
rand_spk = chat.sample_random_speaker()

params_infer_code = ChatTTS.Chat.InferCodeParams(
    spk_emb=rand_spk,
    temperature=0.3,
    top_P=0.7,
    top_K=20,
)

params_refine_text = ChatTTS.Chat.RefineTextParams(
    prompt='[oral_2][laugh_0][break_4]',
)

texts = ["Добро пожаловать в сегодняшний эпизод. Позвольте рассказать вам кое-что захватывающее."]

wavs = chat.infer(
    texts,
    params_refine_text=params_refine_text,
    params_infer_code=params_infer_code,
)

audio = torch.from_numpy(wavs[0])
if audio.dim() == 1:
    audio = audio.unsqueeze(0)
torchaudio.save("consistent_speaker.wav", audio, 24000)
```

### Метки управления на уровне слов

Вставляйте управляющие метки прямо в текст для точной просодии:

```python
import ChatTTS
import torch
import torchaudio

chat = ChatTTS.Chat()
chat.load(compile=False)

# Метки: [uv_break] = короткая пауза, [laugh] = смех, [lbreak] = длинная пауза
text = 'Какова [uv_break]твоя любимая еда?[laugh][lbreak]'

rand_spk = chat.sample_random_speaker()
params = ChatTTS.Chat.InferCodeParams(spk_emb=rand_spk, temperature=0.3)

# skip_refine_text=True сохраняет ваши ручные управляющие метки
wavs = chat.infer(text, skip_refine_text=True, params_infer_code=params)

audio = torch.from_numpy(wavs[0])
if audio.dim() == 1:
    audio = audio.unsqueeze(0)
torchaudio.save("controlled_output.wav", audio, 24000)
```

### Пакетная обработка через WebUI

ChatTTS поставляется с веб-интерфейсом Gradio для интерактивного использования:

```bash
cd ChatTTS
python examples/web/webui.py --server_name 0.0.0.0 --server_port 7860
```

Откройте `http_pub` URL из панели заказов Clore.ai, чтобы получить доступ к интерфейсу.

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

* **Используйте `compile=True`** после первоначального тестирования — компиляция PyTorch добавляет время запуска, но значительно ускоряет повторные инференсы
* **Проброс портов** — откройте порт `7860/http` при развертывании с WebUI
* **Docker-образ** — используйте `pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime` в качестве основы
* **Сохранение говорящего** — сохраните `rand_spk` строки в файл, чтобы вы могли повторно использовать голоса между сессиями без повторной выборки
* **Группируйте запросы** — `chat.infer()` принимает список текстов и обрабатывает их вместе, что эффективнее, чем по одному вызову
* **Некоммерческая лицензия** — веса модели распространяются по CC BY-NC 4.0; проверьте требования лицензирования для вашего случая использования

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

| Проблема                             | Решение                                                                                                                    |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
| `CUDA — недостаточно памяти`         | Уменьшите размер батча или используйте GPU с ≥ 6 ГБ видеопамяти                                                            |
| Модель медленно скачивается          | Предварительно скачайте с HuggingFace: `huggingface-cli download 2Noise/ChatTTS`                                           |
| Аудио содержит статику/шум           | Это сделано намеренно в открытой модели (мера против злоупотреблений); используйте `compile=True` для более чистого вывода |
| `torchaudio.save` ошибка размерности | Убедитесь, что тензор 2D: `audio.unsqueeze(0)` при необходимости                                                           |
| Искажённый китайский вывод           | Убедитесь, что входной текст закодирован в UTF-8; установите `WeTextProcessing` для лучшей нормализации                    |
| Медленный первый инференс            | Нормально — компиляция модели и загрузка весов происходят при первом вызове; последующие вызовы быстрее                    |
