Дообучение модели TTS на голосе заказчика
Fine-tuning TTS на голосе конкретного человека даёт более стабильный и качественный результат по сравнению с zero-shot клонированием. Подходит для создания масштабируемого брендового голоса с предсказуемым качеством.
Подготовка данных
Минимальный объём для заметного улучшения: 30–60 минут качественных записей.
Структура датасета:
dataset/
wavs/
001.wav # 5–15 секунд
002.wav
...
metadata.csv # filename|text
import pandas as pd
from pathlib import Path
import soundfile as sf
import numpy as np
def validate_dataset(dataset_dir: str) -> dict:
"""Проверяем датасет перед обучением"""
metadata = pd.read_csv(f"{dataset_dir}/metadata.csv",
sep="|", names=["file", "text"])
stats = {
"total_files": len(metadata),
"total_duration": 0,
"errors": []
}
for _, row in metadata.iterrows():
wav_path = f"{dataset_dir}/wavs/{row['file']}.wav"
if not Path(wav_path).exists():
stats["errors"].append(f"Missing: {wav_path}")
continue
audio, sr = sf.read(wav_path)
duration = len(audio) / sr
stats["total_duration"] += duration
if sr != 22050:
stats["errors"].append(f"Wrong SR {sr}: {wav_path}")
if duration < 1.0 or duration > 15.0:
stats["errors"].append(f"Bad duration {duration:.1f}s: {wav_path}")
stats["total_duration_min"] = stats["total_duration"] / 60
return stats
Fine-tuning XTTS v2
from trainer import Trainer, TrainerArgs
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
config = XttsConfig()
config.load_json("base_xtts_config.json")
# Параметры fine-tuning
config.audio.output_sample_rate = 24000
config.batch_size = 4
config.eval_batch_size = 2
config.num_loader_workers = 4
# Fine-tuning только decoder (быстрее, меньше данных)
config.trainer_args = {
"epochs": 100,
"save_step": 1000,
"print_step": 50,
"eval_split_size": 0.1
}
Оценка качества
MOS (Mean Opinion Score) — основная метрика:
- Baseline XTTS zero-shot: MOS ~3.8
- После fine-tuning 30 мин данных: MOS ~4.1–4.3
- После fine-tuning 60+ мин данных: MOS ~4.3–4.5
Объективные метрики:
- UTMOS: автоматическая оценка натуральности
- SECS (Speaker Embedding Cosine Similarity): сходство с оригиналом
- WER на обратном распознавании: разборчивость
Инфраструктура для обучения
| Конфигурация | Время обучения (30 мин данных) | Стоимость |
|---|---|---|
| 1x A100 80GB | ~3–4 часа | ~$15 (RunPod) |
| 1x A10G | ~6–8 часов | ~$8 |
| 1x RTX 4090 | ~8–12 часов | ~$5 (local) |
Сроки проекта
- Сбор и очистка датасета: 1–2 недели
- Обучение и оценка: 3–5 дней
- Интеграция и A/B тест: 3–5 дней
- Итого: 3–4 недели







