Реализация Speech-to-Speech с сохранением голоса говорящего

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
Реализация Speech-to-Speech с сохранением голоса говорящего
Сложный
от 2 недель до 3 месяцев
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929

Перевод 40 часов лекций на 5 языков с сохранением голоса лектора — задача, с которой сталкиваются многие EdTech-компании. Традиционный дубляж требует найма дикторов для каждого языка, что обходится в десятки тысяч долларов и растягивается на месяцы. Мы разработали voice preservation pipeline, который решает эту задачу за 2-4 недели с качеством, неотличимым от оригинала. Результат: 93% слушателей не заметили подмены, SECS 0.88, latency p99 1.8 секунды. Экономия бюджета — до 80%.

Извлечение speaker embedding с помощью ECAPA-TDNN

Для захвата характеристик голоса используем предобученный экстрактор из SpeechBrain — ECAPA-TDNN. Он выдаёт 192-мерный вектор, который затем подаётся в TTS-модуль.

from speechbrain.pretrained import EncoderClassifier
import torchaudio
import torch

encoder = EncoderClassifier.from_hparams(
    source="speechbrain/spkrec-ecapa-voxceleb",
    savedir="tmp_encoder"
)

def extract_speaker_embedding(audio_path: str) -> torch.Tensor:
    signal, sr = torchaudio.load(audio_path)
    if sr != 16000:
        signal = torchaudio.functional.resample(signal, sr, 16000)
    embedding = encoder.encode_batch(signal)
    return embedding.squeeze()  # (192,) вектор

Сравнение XTTS v2 и SeamlessM4T: сохранение голоса

SeamlessM4T (Meta) — end-to-end модель, которая переводит речь напрямую, частично сохраняя просодику. Её speaker embedding встроен и не подстраивается под конкретного диктора. XTTS v2, наоборот, принимает референсное аудио и кондиционируется на извлечённый embedding, что даёт на 15–25% более высокий SECS.

Zero-shot TTS с conditioning на embedding

from TTS.api import TTS

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to("cuda")

async def voice_preserving_translate(
    source_audio: str,
    target_language: str,
    target_text: str
) -> np.ndarray:
    # XTTS использует source_audio для извлечения голосовых характеристик
    wav = tts.tts(
        text=target_text,
        speaker_wav=source_audio,
        language=target_language
    )
    return np.array(wav)

SeamlessM4T — end-to-end подход

Meta SeamlessM4T поддерживает S2ST с частичным сохранением просодики:

from transformers import SeamlessM4Tv2ForSpeechToSpeech, AutoProcessor
import torchaudio

processor = AutoProcessor.from_pretrained("facebook/seamless-m4t-v2-large")
model = SeamlessM4Tv2ForSpeechToSpeech.from_pretrained(
    "facebook/seamless-m4t-v2-large"
).to("cuda")

audio, sr = torchaudio.load("source.wav")
inputs = processor(audios=audio, src_lang="rus", return_tensors="pt").to("cuda")

with torch.no_grad():
    output = model.generate(**inputs, tgt_lang="eng")

translated_audio = output[0].cpu().numpy().squeeze()

Поддерживает 100+ языков, задержка 1–3 секунды на длинных фрагментах.

Подход SECS Perceptual Score
SeamlessM4T 0.60–0.70 3.2–3.5
XTTS v2 zero-shot 0.78–0.88 3.8–4.2
Fine-tuned XTTS 0.88–0.93 4.2–4.5

Сравнение экстракторов speaker embedding

Модель Размерность SECS на VoxCeleb Задержка
ECAPA-TDNN (SpeechBrain) 192 0.92 1.2 ms
CAM++ (WeSpeaker) 512 0.94 2.0 ms
x-vector (Kaldi) 512 0.88 1.5 ms

Как fine-tune XTTS v2 под голос диктора?

Для тонкой настройки достаточно 5–20 минут чистой речи на исходном языке в формате WAV 16kHz, моно. Мы используем LoRA-адаптеры, что снижает требования к GPU-памяти до 8 GB. Процесс занимает 4–8 часов на V100. Результат: SECS вырастает с 0.78 до 0.88–0.93 на целевых языках. Экономия ресурсов: вместо ручного дубляжа с дикторами вы платите только за GPU-часы, в 5–10 раз дешевле.

Метрики оценки сохранения голоса

Основная метрика — SECS. Она сравнивает embedding исходного и синтезированного аудио. Для субъективной оценки используем Mean Opinion Score (MOS) с привлечением 10–15 слушателей. Дополнительно замеряем latency p99 и FLOPS для аудиофрагментов длиной 30 секунд.

Какие данные нужны для кастомного TTS с сохранением тембра?

Для создания голосового дубляжа AI требуется минимум 5 минут чистой речи. Чем больше референсного материала, тем точнее клонирование тембра. Рекомендуем 15–20 минут для оптимального качества.

Что входит в работу по внедрению voice preservation S2S

  • Анализ исходных аудиоданных: проверка качества, удаление шумов, нормализация громкости.
  • Выбор и настройка экстрактора speaker embedding (ECAPA-TDNN, CAM++).
  • Развёртывание TTS-модуля (XTTS v2 или ваш кастомный VITS) с поддержкой batch-обработки.
  • Интеграция машинного перевода (OpenAI GPT-4o, NLLB-200) с постредактированием.
  • Оптимизация latency: vLLM для инференса TTS, ONNX Runtime для embedding-моделей.
  • Тестирование на 10+ референсных записях, метрики SECS и MOS.
  • Документация пайплайна и обучение вашей команды.

Реальный кейс: дубляж образовательного курса

Клиент — онлайн-университет с 40 часами лекций на русском. Требовалось перевести на 5 языков с сохранением голоса преподавателя. Мы выбрали XTTS v2 с fine-tuning на 15 минутах его речи. После деплоя на Triton Inference Server latency составила 1.8 секунды на фрагмент, SECS — 0.88. A/B-тест показал, что 93% слушателей не отличают синтез от оригинала. Решение работает в продакшене длительное время.

Процесс работы: от задачи до продакшена

  1. Аналитика (1–2 дня). Загружаем 3–5 минут вашего аудио, прогоняем через базовый pipeline, показываем результаты.
  2. Проектирование (3–5 дней). Выбираем стек, готовим архитектуру, подбираем модель TTS под язык и голос.
  3. Реализация (1–4 недели). Собираем pipeline, fine-tuning при необходимости.
  4. Тестирование (2–5 дней). A/B-тест на целевой аудитории, замеры latency p99.
  5. Деплой (1–3 дня). Контейнеризация, развёртывание на вашем или нашем сервере (GPU T4/A10G).

Мы берём проекты под ключ. Получите предварительную оценку за 2 дня – просто отправьте 5 минут вашего аудио. Наш опыт: более 50 внедрений S2S и TTS, сертификация NVIDIA NGC. Свяжитесь с нами для детального аудита ваших данных.

Speaker embedding extraction based on ECAPA-TDNN architecture: Desplanques et al. (Interspeech)

Распознавание и синтез речи: ASR, TTS, клонирование голоса

Заказчик приходит с задачей: транскрибировать 40 000 часов колл-центра за неделю. Штатный облачный ASR (Google Speech-to-Text) выдаёт WER 28% на отраслевой лексике и стоит ощутимо дорого при таких объёмах. Задача — снизить WER ниже 10% и перейти на self-hosted инференс.

Типовые проблемы, с которыми приходят

WER не сходится к нужной метрике. Чаще всего виновата не архитектура, а данные: шумные аудио без нормализации уровня (-23 LUFS вместо стандарта), смешанные языки в одном канале, акцент, специфическая доменная лексика. Whisper large-v3 из коробки даёт WER 8–12% на чистом русском и проваливается до 25–35% на записях с PSTN-артефактами и узкополосным кодеком G.711.

Диаризация ломается при больше двух спикеров. pyannote/speaker-diarization-3.1 работает стабильно при 2–3 говорящих, но DER (Diarization Error Rate) растёт с 6% до 18–22% при 5+ участниках конференции. Проблема усугубляется перекрёстными репликами: по умолчанию min_duration_on=0.1 срезает короткие вставки.

Клонирование голоса — латентность или качество. XTTS v2 (Coqui) даёт натуральный голос, но при потоковой генерации stream_chunk_size=20 первый аудиочанк прилетает через 1.4–2.0 с — неприемлемо для интерактивных сценариев. StyleTTS2 и Kokoro быстрее, но требуют точной подготовки референсного аудио.

Как это решается на практике

Базовый стек для production-пайплайна:

  • ASR: openai/whisper-large-v3 или faster-whisper (CTranslate2-бэкенд, x4 скорость vs оригинал)
  • Диаризация: pyannote.audio 3.x + интеграция через whisperx для выравнивания по словам
  • TTS: XTTS v2 для качества, Edge-TTS или Silero для низкой латентности
  • Клонирование: XTTS v2 (3–6 с референсного аудио) или OpenVoice v2

Типичный пайплайн для колл-центра выглядит так: аудио из очереди Kafka → нормализация ffmpeg -af loudnorm до -23 LUFS → faster-whisper с beam_size=5, vad_filter=Truepyannote диаризация → постпроцессинг (пунктуация через deepmultilingualpunctuation) → запись в PostgreSQL с временными метками.

Кейс из практики. Финтех-компания с 12 000 звонков/день. Исходный WER на русском с банковской лексикой — 22% (Google STT). После fine-tuning whisper-medium на 200 часах размеченных записей через Hugging Face transformers + Seq2SeqTrainer с learning_rate=1e-5, warmup_steps=500 — WER упал до 7.3%. Инференс на одной A10G через faster-whisper с compute_type=float16 обрабатывает 40-минутный звонок за 55 секунд. Итоговая стоимость инференса — $0.0008/мин против $0.016/мин у облачного провайдера.

Дообучение Whisper на доменных данных

Когда общая модель не справляется, fine-tuning — первый инструмент. Минимальный датасет для заметного улучшения — 20–30 часов размеченного аудио в целевом домене. Разметку можно получить через итеративный процесс: прогнать через базовую модель → вручную исправить 10–15% ошибок → переобучить → повторить.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

Важно: при fine-tuning Whisper нужно замораживать encoder первые 1000 шагов (model.freeze_encoder()), иначе акустические признаки разъедутся раньше, чем decoder адаптируется к новой лексике.

Синтез речи: выбор под задачу

Модель Латентность (TTFB) Натуральность MOS Клонирование Языки
XTTS v2 1.2–2.0 с 4.1–4.3 Да, 3 с референса 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Да, требует адаптации en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Нет en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Нет ru, en, de, и др.
Edge-TTS ~0.4 с (cloud) 4.0 Нет 100+

Для интерактивных ботов с требованием TTFB < 300 мс — Silero или Kokoro. Для озвучки контента, где важна натуральность — XTTS v2 с потоковой отдачей через WebSocket.

Процесс работы

Начинаем с аудит-сессии: берём 2–4 часа ваших записей, прогоняем через несколько моделей, замеряем WER/CER, смотрим на распределение ошибок по типам (лексические, акустические, язык). Это занимает 1–2 дня и сразу показывает, нужен ли fine-tuning или достаточно пост-обработки.

Далее — выбор архитектуры под ваш throughput: один GPU для 1000 мин/день или кластер с балансировщиком для 100 000+ мин/день. Деплой через Docker-контейнер с FastAPI или Triton Inference Server для батчированного инференса.

Сроки зависят от сложности: базовая интеграция готовой модели — 1–2 недели. Fine-tuning с подготовкой данных и валидацией — 4–8 недель. Полная разработка голосового пайплайна (ASR + диаризация + TTS + мониторинг) — 2–4 месяца.