Обучение TTS модели с нуля: гайд по KaniTTS2 Pretrain Code (FSDP, Flash Attention) | AiManual
AiManual Logo Ai / Manual.
14 Фев 2026 Гайд

Свой голос из ничего: как я тренировал TTS-модель с нуля на KaniTTS2 и не сошел с ума

Полное руководство по обучению своей TTS-модели с нуля на основе KaniTTS2 Pretrain Code. FSDP multi-GPU, Flash Attention 2, подготовка датасета, YAML-конфиги.

Зачем вообще это нужно? Или почему предобучение — это не fine-tuning

Вот представь. Ты берешь готовую модель вроде Sonya TTS или Qwen3 TTS и делаешь fine-tuning на своем голосе. Работает? Да. Но только если твой голос похож на то, что модель уже знает. А если ты хочешь научить ее говорить на языке, которого она никогда не слышала? Или с акцентом, которого нет в обучающих данных? Или просто создать модель с нуля для узкой задачи?

Fine-tuning — это как перекрасить машину. Предобучение — это построить двигатель с нуля. KaniTTS2 Pretrain Code дает именно эту возможность: собрать свою TTS-модель из атомов. И в 2026 году это редкий зверь — большинство проектов предлагают только дообучение, но не полный цикл.

💡
KaniTTS2 на февраль 2026 года — одна из немногих открытых архитектур, где выложен полный код предобучения с поддержкой современных оптимизаций: FSDP (Fully Sharded Data Parallel) для распределения модели по нескольким GPU и Flash Attention 2 для ускорения работы с attention-механизмами.

Что у тебя должно быть перед началом

Не начинай с пустыми руками. Тебе понадобится:

  • Сервер с GPU. Минимум 2 карты с 24GB памяти каждая (например, RTX 4090 или A10). FSDP будет распределять модель, но без объема памяти — никуда.
  • Около 100 часов чистого аудио речи. Меньше — и модель не научится нормально говорить. Больше — лучше, но подготовка данных займет вечность.
  • Терпение. Обучение с нуля — это не 2 часа, как в тренировке LoRA для VibeVoice. Это дни, а то и недели.
  • Базовое понимание Python и YAML. Конфигурация здесь — это не пара флагов в командной строке.

Не путай с Pocket TTS или другими легковесными решениями. Здесь мы строим полноценную модель, а не оптимизируем готовую для мобильных устройств.

1 Подготовка данных: где взять 100 часов речи и как не испортить их

Это самый скучный и самый важный этап. Ошибки здесь проявятся позже — модель будет говорить с артефактами, пропускать слова или просто молчать.

Идеальный датасет для TTS:

  • Один диктор (или несколько, но с четкой разметкой)
  • Чистый звук без фоновых шумов (SNR не ниже 30dB)
  • Монофонический, 16kHz или 24kHz
  • Текстовые транскрипции с точностью до знака препинания

Где взять? Если свой голос — начитай сам. Если для языка — ищи открытые корпуса вроде LibriTTS, Common Voice или специализированные для твоего языка. Помни про парадокс fine-tuning: иногда лучше меньше, но качественнее.

# Пример структуры папки с данными
dataset/
├── audio/
│   ├── speaker1/
│   │   ├── sample1.wav
│   │   └── sample2.wav
│   └── speaker2/
│       ├── sample1.wav
│       └── sample2.wav
└── metadata.csv

Формат metadata.csv:

audio_path|speaker|text
audio/speaker1/sample1.wav|speaker1|Привет, как дела?
audio/speaker1/sample2.wav|speaker1|Сегодня хорошая погода.

Самый частый косяк — несоответствие текста и аудио. Один лишний пробел, и модель учится говорить паузы там, где их нет.

2 Установка и настройка окружения: не доверяй requirements.txt

Клонируем репозиторий и смотрим, что там внутри:

git clone https://github.com/kani-ai/KaniTTS2-Pretrain
cd KaniTTS2-Pretrain

А теперь внимание. requirements.txt в таких проектах часто устаревает или содержит конфликтующие версии. Особенно с torch и flash-attn.

На февраль 2026 года актуальные версии:

Пакет Версия Зачем
torch 2.4.0+cu121 Без нее вообще ничего не работает
flash-attn 2.7.0 Ускорение attention в 3-5 раз
deepspeed 0.14.0 Для FSDP и оптимизаций памяти
transformers 4.45.0 Токенизаторы и утилиты

Устанавливаем через pip с указанием версий:

pip install torch==2.4.0+cu121 --index-url https://download.pytorch.org/whl/cu121
pip install flash-attn==2.7.0 --no-build-isolation
pip install deepspeed==0.14.0 transformers==4.45.0

Flash Attention 2 требует совместимости с архитектурой GPU. На картах NVIDIA с Ampere (RTX 30xx) и новее работает без проблем. На более старых (Volta, Turing) могут быть проблемы — проверяй документацию.

3 Конфигурация YAML: где настраивается вся магия

В KaniTTS2 конфиг — это сердце системы. Не тот config.yaml, который на 10 строк, а полноценный файл на 200+ строк. Основные секции:

# config_pretrain.yaml (упрощенная версия)
model:
  type: "kanitts2"
  hidden_size: 1024          # Размер скрытого слоя
  num_heads: 16              # Количество голов в attention
  num_layers: 24             # Глубина модели

data:
  train_dataset: "/path/to/your/metadata.csv"
  audio_sample_rate: 24000   # Частота дискретизации
  text_cleaners: ["basic_cleaners"]  # Как чистить текст

training:
  batch_size: 16             # На один GPU!
  num_epochs: 100
  learning_rate: 0.0001
  warmup_steps: 5000
  
fsdp:
  enable: true               # Включаем распределение
  sharding_strategy: "FULL_SHARD"  # Полное шардирование
  cpu_offload: false         # Не выгружаем на CPU (медленно)

flash_attention:
  enable: true               # Включаем Flash Attention 2
  causal: false              # Для TTS не нужно causal attention

Самая частая ошибка новичков — batch_size. Они ставят 64, забывая что это на GPU. А с FSDP реальный batch будет умножен на количество GPU. При 4 картах и batch_size=16 реальный размер батча — 64. Поставь 64 в конфиге — получишь 256 и словишь OOM (Out Of Memory).

4 Запуск обучения: когда включать FSDP, а когда нет

Команда для запуска выглядит страшно, но разберем по частям:

torchrun --nnodes=1 --nproc_per_node=4 \
  --rdzv_backend=c10d --rdzv_endpoint=localhost:29500 \
  train.py \
  --config config_pretrain.yaml \
  --output_dir ./checkpoints \
  --resume_from_checkpoint latest \
  --fp16 \
  --fsdp "full_shard" \
  --flash_attention

Что здесь происходит:

  • --nproc_per_node=4 — используем 4 GPU на одном сервере
  • --fp16 — mixed precision training, ускоряет в 2-3 раза
  • --fsdp "full_shard" — полное шардирование параметров, градиентов и оптимизатора
  • --flash_attention — включаем оптимизированные attention-слои

FSDP — не серебряная пуля. Он отлично работает когда:

  • Модель не помещается на одну GPU
  • У тебя однородные GPU (одинаковая память и архитектура)
  • Сеть между GPU быстрая (InfiniBand или хотя бы 100GbE)

Если модель помещается на одну карту, но ты хочешь ускорить обучение — используй обычный DataParallel или даже DDP (DistributedDataParallel). FSDP добавляет overhead на коммуникацию.

💡
Наблюдай за потреблением памяти в процессе обучения. Если видишь, что память заполняется на 95% и начинается свопинг на GPU — уменьшай batch_size. Медленное обучение лучше, чем падение с ошибкой OOM на 50-й эпохе.

5 Мониторинг и отладка: что смотреть кроме loss

Loss падает — это хорошо. Но для TTS этого недостаточно. Нужно слушать сэмплы. KaniTTS2 генерирует их во время обучения (обычно раз в 1000 шагов).

Что должно насторожить:

  1. Голос «робит» или звучит механически — возможно, слишком высокий learning rate
  2. Слова пропускаются или сливаются — проблемы с выравниванием текста и аудио
  3. Посторонние шумы в тишине — модель не научилась генерировать silence
  4. Интонация плоская — недостаточно данных или слишком простая архитектура

Используй TensorBoard или Weights & Biases для визуализации:

tensorboard --logdir ./checkpoints/tensorboard

Смотри не только на loss, но и на:

  • Duration loss (длительность фонем)
  • Pitch loss (высота тона)
  • Energy loss (энергия, громкость)
  • Grad norm (норма градиентов — если взрывается, уменьшай LR)

Частые ошибки и как их избежать

Я собрал топ-5 ошибок, которые совершают почти все, кто впервые тренирует TTS с нуля:

Ошибка Симптомы Решение
Неправильная частота дискретизации Голос как из бочки или писклявый Конвертируй все аудио в одну частоту (24000 Hz)
Пропуск нормализации текста Цифры "123" произносятся как "сто двадцать три" Используй text_cleaners в конфиге
Слишком большой learning rate Loss скачет, модель не сходится Начни с 1e-4, используй warmup
Нехватка разнообразных данных Модель хорошо говорит только определенные фразы Добавь данные с разной интонацией, эмоциями
Игнорирование overfitting На validation loss растет, на train падает Ранняя остановка, регуляризация

Что делать после обучения

Модель обучена. Чекпоинты лежат в папке. Что дальше?

1. Экспорт в формат для инференса. Обучаемые чекпоинты содержат много лишнего для инференса. Нужно выгрузить только weights:

import torch
from model import KaniTTS2

checkpoint = torch.load("checkpoints/epoch_100.pth")
model = KaniTTS2(config)
model.load_state_dict(checkpoint['model_state_dict'])

# Сохраняем только веса для инференса
torch.save(model.state_dict(), "kanitts2_final_weights.pth")

2. Оптимизация для продакшена. Если планируешь использовать на слабом железе, посмотри в сторону Soprano-Factory или техник квантизации. Но помни — качество обычно страдает.

3. Интеграция в пайплайн. TTS редко работает изолированно. Обычно это часть системы: текст -> нормализация -> TTS -> постобработка. Подготовь скрипты для батч-обработки или real-time инференса.

Стоило ли оно того?

Обучение TTS с нуля в 2026 году — все еще нишевая задача. Большинству хватит fine-tuning существующих моделей из сравнения open-source моделей.

Но если тебе нужно:

  • Язык, которого нет в предобученных моделях
  • Контроль над каждым аспектом генерации
  • Исследовательская задача (например, понять как работает акустическое моделирование)
  • Коммерческий продукт с уникальными требованиями

— тогда да, это того стоит. KaniTTS2 Pretrain Code дает редкую возможность: не просто использовать чужую модель, а понять как она устроена изнутри. И возможно, улучшить ее так, как не смогли бы авторы оригинальной реализации.

Последний совет? Начни с маленького датасета (5-10 часов) и упрощенной архитектуры. Пойми как все работает, отлади пайплайн. И только потом запускай полномасштабное обучение на 100+ часах. Сэкономишь кучу времени и нервов. И электричества тоже.