Реализация Zero-Shot Voice Cloning
Zero-shot voice cloning клонирует голос из нескольких секунд аудио без предварительного обучения — модель «понимает» голос в inference-time. Современные системы достигают SECS > 0.85 (cosine similarity с оригиналом) при 5 секундах референса.
Современные zero-shot модели
XTTS v2 — лучший open-source выбор:
from TTS.api import TTS
import torch
model = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to("cuda")
wav = model.tts(
text="Это синтез с нулевым обучением.",
speaker_wav="reference_3sec.wav", # минимум 3 секунды
language="ru"
)
YourTTS — предшественник XTTS, но поддерживает русский:
model = TTS("tts_models/multilingual/multi-dataset/your_tts").to("cuda")
Tortoise TTS (английский, высшее качество):
# pip install tortoise-tts
from tortoise.api import TextToSpeech
tts = TextToSpeech()
gen = tts.tts_with_preset("Hello world", voice_samples=[...], preset="ultra_fast")
Влияние длины референса на качество
| Референс | SECS | MOS |
|---|---|---|
| 3 секунды | 0.75–0.80 | 3.5–3.8 |
| 6 секунд | 0.82–0.87 | 3.8–4.1 |
| 15 секунд | 0.87–0.91 | 4.0–4.3 |
| 30+ секунд | 0.90–0.94 | 4.2–4.5 |
Оптимизация референсного аудио
import librosa
import soundfile as sf
import numpy as np
def prepare_reference_audio(input_path: str, output_path: str):
"""Оптимизируем референс для лучшего клонирования"""
audio, sr = librosa.load(input_path, sr=22050)
# Нормализация громкости
audio = audio / np.max(np.abs(audio)) * 0.95
# Подавление шума через spectral gating
import noisereduce as nr
audio = nr.reduce_noise(y=audio, sr=sr)
# Обрезаем тишину в начале/конце
audio, _ = librosa.effects.trim(audio, top_db=20)
sf.write(output_path, audio, sr)
return len(audio) / sr # длина в секундах
Batch-клонирование для масштабирования
async def clone_voice_batch(
texts: list[str],
reference_audio: str
) -> list[np.ndarray]:
"""Параллельная генерация нескольких фраз одним голосом"""
tasks = [
asyncio.get_event_loop().run_in_executor(
None,
lambda t=text: model.tts(t, speaker_wav=reference_audio, language="ru")
)
for text in texts
]
return await asyncio.gather(*tasks)
Сроки: zero-shot клонирование с API — 1–2 дня. Система с управлением голосовыми профилями — 1 неделя.







