Зачем вообще это нужно? Или почему предобучение — это не fine-tuning
Вот представь. Ты берешь готовую модель вроде Sonya TTS или Qwen3 TTS и делаешь fine-tuning на своем голосе. Работает? Да. Но только если твой голос похож на то, что модель уже знает. А если ты хочешь научить ее говорить на языке, которого она никогда не слышала? Или с акцентом, которого нет в обучающих данных? Или просто создать модель с нуля для узкой задачи?
Fine-tuning — это как перекрасить машину. Предобучение — это построить двигатель с нуля. KaniTTS2 Pretrain Code дает именно эту возможность: собрать свою TTS-модель из атомов. И в 2026 году это редкий зверь — большинство проектов предлагают только дообучение, но не полный цикл.
Что у тебя должно быть перед началом
Не начинай с пустыми руками. Тебе понадобится:
- Сервер с 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 на коммуникацию.
5 Мониторинг и отладка: что смотреть кроме loss
Loss падает — это хорошо. Но для TTS этого недостаточно. Нужно слушать сэмплы. KaniTTS2 генерирует их во время обучения (обычно раз в 1000 шагов).
Что должно насторожить:
- Голос «робит» или звучит механически — возможно, слишком высокий learning rate
- Слова пропускаются или сливаются — проблемы с выравниванием текста и аудио
- Посторонние шумы в тишине — модель не научилась генерировать silence
- Интонация плоская — недостаточно данных или слишком простая архитектура
Используй 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+ часах. Сэкономишь кучу времени и нервов. И электричества тоже.