# Разговорная речь 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` для лучшей нормализации                    |
| Медленный первый инференс            | Нормально — компиляция модели и загрузка весов происходят при первом вызове; последующие вызовы быстрее                    |


---

# Agent Instructions: 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:

```
GET https://docs.clore.ai/guides/guides_v2-ru/audio-i-golos/chattts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
