Кожна третя відповідь вашого голосового асистента звучить неприродно — тремтіння тембру, пропуски фонем. Ми вирішуємо цю проблему донавчанням TTS-моделі на голос замовника. Після fine-tuning на 30–60 хвилинах запису модель стабільно читає будь-який текст: MOS підіймається до 4.3+ проти 3.8 у zero-shot, а WER зворотного розпізнавання падає на 5–10%. Результат — асистент перестає 'заїкатися' навіть на складних запитах.
Чому fine-tuning краще zero-shot?
Zero-shot клонування (наприклад, XTTSv2 у режимі speaker encoder) дає прийнятний результат, але страждає від тремтіння тембру, артефактів на рідкісних фонемах та нестабільності на довгих текстах. Fine-tuning на 30–60 хвилинах цільового голосу фіксує акустичний простір диктора, знижує WER зворотного розпізнавання на 5–10% та підіймає UTMOS на 0.3–0.5. Основні переваги: передбачувана якість на будь-яких входах, можливість аугментації даних (шум, реверберація) та контроль над інтонацією через conditioning.
Що входить у підготовку датасету для TTS fine-tuning?
Мінімальний об'єм — 30 хвилин чистих записів. Оптимально — 1–2 години. Вимоги до аудіо: частота дискретизації 22050 або 24000 Гц, рівень сигналу –18…–12 dBFS, співвідношення сигнал/шум >30 дБ, довжина фрагментів 3–15 секунд.
Кроки підготовки:
- Запис у студії або тихому приміщенні (перевірте на фоновий шум).
- Чистка шумів: використовуйте HPSS-фільтр або spectral subtraction.
- Розмітка по реченнях: force alignment за допомогою Montreal Forced Aligner.
- Валідація тривалості та якості: проганяйте через скрипт перевірки.
Приклад скрипту валідації датасету
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 — стек і конфігурація
Ми використовуємо офіційний репозиторій Coqui TTS з модифікаціями під комерційні завдання. Нижче — конфіг для fine-tuning тільки декодера (швидше, менше шуму).
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 } Варіації: можна fine-tune весь encoder+decoder при датасеті >2 годин, але це збільшує час навчання в 2–3 рази і потребує обережності з overfitting.
Як оцінити якість синтезованого голосу?
Основна метрика — MOS (Mean Opinion Score) за стандартом ITU-T P.800. Ми використовуємо власну панель із 10–15 слухачів, кожен оцінює 50–80 зразків. Результати:
| Конфігурація | MOS (95% CI) |
|---|---|
| XTTS zero-shot | 3.7–3.9 |
| Fine-tuned 30 хв | 4.1–4.3 |
| Fine-tuned 60+ хв | 4.3–4.5 |
Об'єктивні метрики:
- UTMOS: автоматична оцінка натуральності (модель MOS-predictor)
- SECS (Speaker Embedding Cosine Similarity): схожість з голосом-донором >0.95
- WER на зворотному розпізнаванні: не більше 5% при середньому темпі
Інфраструктура та вартість навчання
Вибір GPU залежить від бюджету та необхідної швидкості. Ми рекомендуємо конфігурації з мінімальним FLOPS:
| Конфігурація | Час (30 хв даних) | Примітка |
|---|---|---|
| 1x A100 80GB | ~3–4 години | Оптимально для batch size 8 |
| 1x A10G | ~6–8 годин | Баланс ціна/якість |
| 1x RTX 4090 | ~8–12 годин | Локальне навчання |
Вартість навчання залежить від обраної конфігурації та обсягу даних. Економія порівняно з покупкою готового TTS-рішення може досягати 30–50%. Ми допомагаємо підібрати конфігурацію під ваш бюджет.
Що входить у наш проект з донавчання TTS?
- Аудит вихідного матеріалу — оцінка якості записів, шумів, дикції.
- Підготовка датасету — чистка, нормалізація гучності, розмітка (force alignment).
- Навчання моделі — вибір архітектури (XTTS, IhreTTS, YourTTS), підбір гіперпараметрів.
- Оцінка якості — MOS, UTMOS, SECS, WER.
- Експорт моделі — ONNX / TorchScript для інференсу.
- Інтеграція — API-обгортка, тестування у вашому продукті.
- Документація та навчання команди — як оновлювати голос, продовжувати fine-tuning.
Гарантуємо: підсумковий MOS не нижче 4.0 при датасеті від 30 хвилин. При невідповідності — доопрацьовуємо за свій рахунок.
Строки орієнтовно
| Етап | Строк |
|---|---|
| Збір та очищення датасету | 1–2 тижні |
| Навчання та evaluation | 3–5 днів |
| Інтеграція та тестування | 3–5 днів |
| Разом | 3–4 тижні |
Як уникнути типових проблем при fine-tuning
Записи з фоновим шумом — головний ворог якості. Ми застосовуємо HPSS-фільтр та сегментацію по VAD. Дисбаланс фонем (наприклад, відсутність глухих або свистячих) компенсується спеціальним скриптом для створення збалансованого датасету. На малому обсязі даних (менше 30 хвилин) допомагає L2-регуляризація та early stopping. Всі ці заходи дозволяють отримати стабільний результат без перенавчання.
Якщо у вас залишилися питання щодо датасету, архітектури або бюджету — зв'яжіться з нами для консультації. Замовте розрахунок вартості вашого проекту — ми підберемо оптимальне рішення під ваші завдання.







