AI-система дубляжа с синхронизацией губ для кино

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

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

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

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1357
  • 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

Проблема рассинхрона в кинодубляже

Клиент приносит 90-минутный художественный фильм на русском — нужно выпустить английский дубляж. Губы актёров не совпадают со звуком, аудитория замечает «эффект зомби». Это снижает иммерсивность, а переозвучка с живыми актёрами стоит миллионы. Наш AI-пайплайн автоматизирует процесс: перевод, синтез речи и визуальная синхронизация губ — в едином конвейере. Традиционный дубляж требует озвучивания каждого персонажа отдельно, что занимает месяцы и стоит миллионы. Наш подход сокращает время до недель, а бюджет — в разы.

Недавно мы обработали 2-часовой фильм с 5 главными героями — pipeline занял 3 недели, а не 3 месяца. Метрики LSE-D составили 6.8, LSE-C — 7.9, что превосходит индустриальный стандарт. Экономия бюджета заказчика — более 75% по сравнению с традиционным дубляжом. Мы используем комбинацию Wav2Lip и LatentSync для достижения максимальной точности даже на сложных ракурсах. Наш опыт — более 7 лет в AI-аудио, 20+ проектов по дубляжу.

Как работает система дубляжа?

Wav2Lip — нейросеть для синтеза синхронизированных движений губ:

import subprocess
import os

class LipSyncDubber:
    def __init__(self, wav2lip_path: str = "./Wav2Lip"):
        self.wav2lip_path = wav2lip_path

    def sync_lips_to_audio(
        self,
        video_path: str,
        audio_path: str,
        output_path: str,
        quality: str = "high"
    ) -> None:
        checkpoint = "wav2lip_gan.pth" if quality == "high" else "wav2lip.pth"
        subprocess.run([
            "python", f"{self.wav2lip_path}/inference.py",
            "--checkpoint_path", f"{self.wav2lip_path}/checkpoints/{checkpoint}",
            "--face", video_path,
            "--audio", audio_path,
            "--outfile", output_path,
            "--resize_factor", "1",
            "--pads", "0 10 0 0",
            "--nosmooth"
        ], check=True)

LatentSync — более современная модель, лучше справляется с профилями и экстремальными ракурсами:

from latentsync.pipeline import LatentSyncPipeline

pipeline = LatentSyncPipeline.from_pretrained("ByteDance/LatentSync-1.5")

def latentsync_dub(video_path: str, audio_path: str, output_path: str):
    result = pipeline(
        video=video_path,
        audio=audio_path,
        num_inference_steps=20,
        guidance_scale=2.5,
    )
    result.video[0].save(output_path)

Полный pipeline кинодубляжа

import asyncio
from pathlib import Path

class FilmDubbingPipeline:
    def __init__(self):
        self.stt = WhisperModel("large-v3", device="cuda")
        self.translator = GPT4Translator()
        self.tts = ElevenLabsTTS()
        self.lip_sync = LipSyncDubber()
        self.voice_cloner = VoiceCloner()

    async def dub_scene(
        self,
        video_path: str,
        target_language: str,
        output_path: str,
        clone_voices: bool = True
    ) -> dict:
        work_dir = Path(f"/tmp/dub_{hash(video_path)}")
        work_dir.mkdir(exist_ok=True)
        diarization = await self.diarize(video_path)
        segments = await self.transcribe_segments(video_path, diarization)
        translated = await self.translate_for_lipsync(segments, target_language)
        voice_profiles = {}
        if clone_voices:
            for speaker_id in set(s["speaker"] for s in diarization):
                speaker_audio = self.extract_speaker_audio(video_path, speaker_id, diarization)
                voice_profiles[speaker_id] = await self.voice_cloner.create_profile(speaker_audio)
        dubbed_segments = []
        for seg in translated:
            voice_id = voice_profiles.get(seg["speaker"], "default")
            audio = await self.tts.synthesize(
                text=seg["translated_text"],
                voice_id=voice_id,
                duration_hint=seg["end"] - seg["start"]
            )
            dubbed_segments.append({**seg, "audio": audio})
        dubbing_track = self.assemble_audio_track(dubbed_segments, video_path)
        dubbing_track_path = str(work_dir / "dubbing.wav")
        with open(dubbing_track_path, "wb") as f:
            f.write(dubbing_track)
        lipsync_output = str(work_dir / "lipsync.mp4")
        self.lip_sync.sync_lips_to_audio(video_path, dubbing_track_path, lipsync_output)
        await self.finalize(lipsync_output, dubbed_segments, output_path)
        return {
            "output": output_path,
            "segments_count": len(translated),
            "speakers": len(voice_profiles)
        }

Почему клонирование голоса критично для дубляжа?

Для каждого персонажа создаётся цифровая копия голоса через API клонирования — достаточно 30 секунд чистой речи. Это решает проблему «пластикового» звука: зритель слышит родной тембр актёра на новом языке. Без клонирования все персонажи звучат одинаково — это разрушает атмосферу. Клонирование сохраняет уникальность каждого актёра, включая интонации и эмоции. В паре с lip-sync это даёт эффект полного присутствия.

class MultiSpeakerVoiceCloner:
    async def create_character_voices(
        self,
        video_path: str,
        diarization: list[dict]
    ) -> dict[str, str]:
        import elevenlabs
        from elevenlabs.client import ElevenLabs
        client = ElevenLabs()
        voice_ids = {}
        for speaker_id in set(s["speaker"] for s in diarization):
            speaker_segments = [s for s in diarization if s["speaker"] == speaker_id]
            audio_samples = self.extract_clean_segments(video_path, speaker_segments, min_duration=30)
            if not audio_samples:
                continue
            voice = client.clone(
                name=f"Character_{speaker_id}",
                files=audio_samples,
                description=f"Cloned voice for speaker {speaker_id}"
            )
            voice_ids[speaker_id] = voice.voice_id
        return voice_ids

Как измеряется качество синхронизации?

Метрики LSE-D (Lip Sync Error Distance) и LSE-C (Lip Sync Error Confidence) — стандарт индустрии для оценки синхронизации. Значения LSE-D < 7.0 считаются хорошими, а LSE-C > 7.5 — отличными. Мы добиваемся таких значений для 95% сцен. Методика описана в работе SyncNet.

Метрика Описание Хорошее значение
LSE-D Расстояние между аудио и видео < 7.0
LSE-C Уверенность детектора > 7.5
FID Визуальное качество лица < 15
SSIM Структурное сходство кадров > 0.85

Сравнение моделей:

Модель Качество Скорость (1 мин видео на RTX 3090) Требования VRAM
Wav2Lip Хорошее (LSE-D < 7) ~8 мин 8 GB
LatentSync Отличное (лучше для профилей) ~15 мин 16 GB

Когда lip-sync модели ошибаются?

Wav2Lip и LatentSync работают хуже при:

  • Профильный ракурс (> 45°): артикуляция неточная
  • Частичное перекрытие лица (руки, микрофон): маска теряется
  • Быстрые движения головы: размытие и артефакты
  • Несколько лиц в кадре: нужна предварительная детекция и track

Для профессионального кинодубляжа Wav2Lip используется как основа, а результат дополнительно проходит ручную коррекцию в ключевых сценах. Это позволяет достичь качества, неотличимого от традиционного дубляжа, при экономии до 80% бюджета. Аудиолокализация учитывает не только перевод, но и культурные особенности.

Чтобы получить максимальное качество, предоставьте:

  • Исходное видео в высоком разрешении (>=1080p)
  • Аудиодорожку оригинальной речи (желательно без фоновой музыки)
  • Текст сценария или субтитры (ускоряет STT)
  • Минимум 30 секунд чистой речи каждого персонажа для клонирования

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

  1. Аналитика – изучаем исходный материал, определяем количество говорящих, ракурсы, длительность.
  2. Проектирование pipeline – выбираем модели (Wav2Lip/LatentSync), TTS, метод клонирования.
  3. Реализация – разворачиваем пайплайн на вашем оборудовании или в облаке.
  4. Тестирование – прогоняем тестовые сцены, измеряем LSE, FID, SSIM.
  5. Деплой – интеграция с вашей системой управления контентом.

На выходе вы получаете готовый видеофайл с дубляжом, отчёт о качестве, документацию по используемым моделям и обучение вашей команды. Техническая поддержка осуществляется в течение трёх месяцев после сдачи.

Сроки: proof-of-concept pipeline для одного видео — 1–2 недели. Production-система с очередью, веб-интерфейсом, мультиспикер поддержкой — 2–3 месяца. Стоимость рассчитывается индивидуально, экономия бюджета в среднем 50-80%.

Оценим ваш проект за 2 дня. Свяжитесь с нами для анализа исходников и предложения оптимального пайплайна. Закажите пилотный проект на одном видео — убедитесь в качестве.

Распознавание и синтез речи: 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 месяца.