AI-система AI-дубляжу та lip-sync для кіно

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
AI-система AI-дубляжу та lip-sync для кіно
Складний
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1120
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    588
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    855

Розробка AI-системи кінодубляжу із синхронізацією губ Lip-sync дубляж — найбільш технічно складне завдання аудіолокалізації: синтезована мова має збігатися з артикуляцією актора за формою рота, темпом та емоцією. Застосовується в кіно, серіалах, рекламі, що навчають відео з «головою, що говорить». ### Компоненти системи Wav2Lip — нейромережа для синтезу синхронізованих рухів губ:```python

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"  # high = Wav2Lip_GAN, standard = Wav2Lip
) -> 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 (2024)** — більш сучасна модель, краще справляється з профілями та екстремальними ракурсами:python 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 кінодубляжуpython import asyncio from pathlib import Path

class FilmDubbingPipeline: def init(self): self.stt = WhisperModel("large-v3", device="cuda") self.translator = GPT4Translator() self.tts = ElevenLabsTTS() # лучшая эмоциональная TTS 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)

    # 1. Диаризация — кто говорит когда
    diarization = await self.diarize(video_path)

    # 2. STT для каждого говорящего отдельно
    segments = await self.transcribe_segments(video_path, diarization)

    # 3. Перевод с учётом длительностей
    translated = await self.translate_for_lipsync(segments, target_language)

    # 4. Клонирование голосов (если нужно)
    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)

    # 5. TTS каждого сегмента с нужным голосом
    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})

    # 6. Сборка трека дубляжа
    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)

    # 7. Lip-sync
    lipsync_output = str(work_dir / "lipsync.mp4")
    self.lip_sync.sync_lips_to_audio(video_path, dubbing_track_path, lipsync_output)

    # 8. Финальная сборка с субтитрами
    await self.finalize(lipsync_output, dubbed_segments, output_path)

    return {
        "output": output_path,
        "segments_count": len(translated),
        "speakers": len(voice_profiles)
    }

### Обробка кількох розмовляючихpython class MultiSpeakerVoiceCloner: """ElevenLabs Voice Cloning API для клонирования голосов персонажей"""

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):
        # Извлекаем чистые фрагменты речи этого актёра (мин. 30 сек)
        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

### Метрики якості lip-sync | Метрика Опис | Добре значення | |---------|---------|-----------------| | LSE-D (Lip Sync Error Distance) Відстань між аудіо та відео | <7.0 | | LSE-C (Lip Sync Error Confidence) Впевненість детектора > 7.5 | | FID (Frechet Inception Distance) Візуальна якість особи <15 | | SSIM | Структурна подібність кадрів > 0.85 |python

Оценка LSE метрик через SyncNet

def evaluate_lipsync_quality(video_path: str) -> dict: result = subprocess.run([ "python", "SyncNet/run_pipeline.py", "--videofile", video_path, "--reference", "synchronization" ], capture_output=True, text=True)

# Парсим LSE-D и LSE-C из stdout
lines = result.stdout.split("\n")
metrics = {}
for line in lines:
    if "LSE-D" in line:
        metrics["lse_d"] = float(line.split(":")[-1].strip())
    if "LSE-C" in line:
        metrics["lse_c"] = float(line.split(":")[-1].strip())
return metrics
- Wav2Lip: ~8 хв на RTX 3090 (1080p), ~2 хв на A100 - LatentSync: ~15 хв на RTX 3090 (повільніше, вища якість) - GPU VRAM: мінімум 8 GB, рекомендується 24 GB Терміни: proof-of-concept pipeline для одного відео. Production-система з чергою, веб-інтерфейсом, мультиспікер підтримкою – 2-3 місяці.