Разработка AI-системы генерации видеоуроков с виртуальным преподавателем

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

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

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

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

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

Разработка AI-системы генерации видеоуроков с виртуальным преподавателем

AI-виртуальный преподаватель автоматически генерирует видеоуроки с аватаром, озвучкой и иллюстрациями из текстового скрипта или темы. Применяется в онлайн-школах, корпоративном e-learning, EdTech-платформах для быстрого масштабирования курсов.

Компоненты системы

Текстовый контент / тема
    ↓ GPT-4o: генерация структурированного скрипта
    ↓ TTS: озвучка (ElevenLabs / Azure Neural TTS)
    ↓ AI Avatar: видео с говорящей головой (D-ID / HeyGen / Synthesia)
    ↓ AI Illustrations: генерация слайдов/иллюстраций (DALL-E 3 / SDXL)
    ↓ Video Assembly: сборка финального видео (ffmpeg / MoviePy)
    ↓ Готовый видеоурок

Генерация скрипта урока

from openai import AsyncOpenAI
import json

client = AsyncOpenAI()

async def generate_lesson_script(
    topic: str,
    duration_minutes: int = 10,
    level: str = "beginner",
    style: str = "conversational"
) -> dict:
    response = await client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "system",
            "content": f"""Ты — методолог и сценарист видеоуроков.
            Создай скрипт видеоурока для говорящей головы (аватара).
            Длительность: {duration_minutes} минут (~150 слов/мин = {duration_minutes * 150} слов).
            Уровень аудитории: {level}.
            Стиль подачи: {style}.

            Скрипт состоит из сегментов. Для каждого сегмента:
            - voiceover: текст для озвучки (без пометок, только речь)
            - slide_prompt: промпт для генерации иллюстрации/слайда
            - duration_sec: предполагаемая длительность
            - visual_type: diagram, illustration, text_slide, code_example

            Верни JSON: {{
                title: "...",
                segments: [{{
                    id: 1,
                    section: "intro|main|summary",
                    voiceover: "...",
                    slide_prompt: "...",
                    duration_sec: 30,
                    visual_type: "..."
                }}]
            }}"""
        }, {
            "role": "user",
            "content": f"Тема урока: {topic}"
        }],
        response_format={"type": "json_object"}
    )
    return json.loads(response.choices[0].message.content)

D-ID API — генерация видео аватара

import httpx
import asyncio
import base64

class DIDVideoGenerator:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.d-id.com"

    async def create_talking_head_video(
        self,
        presenter_image_url: str,  # URL фото спикера или AI-аватара
        audio_url: str,            # URL аудиофайла с озвучкой
        script_text: str = ""      # Альтернатива audio_url: текст для TTS
    ) -> str:
        """Создаём видео говорящей головы"""
        payload = {
            "source_url": presenter_image_url,
            "script": {
                "type": "audio" if audio_url else "text",
                "audio_url": audio_url,
                "ssml": False,
            } if audio_url else {
                "type": "text",
                "input": script_text,
                "provider": {
                    "type": "elevenlabs",
                    "voice_id": "21m00Tcm4TlvDq8ikWAM"
                }
            }
        }

        async with httpx.AsyncClient() as client:
            resp = await client.post(
                f"{self.base_url}/talks",
                headers={"Authorization": f"Basic {base64.b64encode(self.api_key.encode()).decode()}"},
                json=payload
            )
            talk_id = resp.json()["id"]
            return await self.wait_for_video(client, talk_id)

    async def wait_for_video(self, client, talk_id: str) -> str:
        for _ in range(60):
            await asyncio.sleep(5)
            resp = await client.get(
                f"{self.base_url}/talks/{talk_id}",
                headers={"Authorization": f"Basic {base64.b64encode(self.api_key.encode()).decode()}"}
            )
            talk = resp.json()
            if talk["status"] == "done":
                return talk["result_url"]
            elif talk["status"] == "error":
                raise RuntimeError(f"D-ID error: {talk.get('error')}")
        raise TimeoutError("D-ID generation timeout")

Генерация слайдов

from diffusers import StableDiffusionXLPipeline
from PIL import Image, ImageDraw, ImageFont
import torch
import io

class SlideGenerator:
    def __init__(self):
        self.image_gen = SDXL_or_DALLE_client()

    async def generate_illustration_slide(
        self,
        prompt: str,
        title: str = ""
    ) -> bytes:
        # Генерируем иллюстрацию
        illustration = await self.image_gen.generate(
            f"{prompt}, educational illustration, clean, professional, {SLIDE_STYLE}",
            width=1920, height=1080
        )

        # Добавляем заголовок если нужен
        if title:
            img = Image.open(io.BytesIO(illustration))
            draw = ImageDraw.Draw(img)
            # Полупрозрачный фон для текста
            draw.rectangle([0, 0, 1920, 120], fill=(0, 0, 0, 180))
            try:
                font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 60)
            except:
                font = ImageFont.load_default()
            draw.text((40, 30), title, fill="white", font=font)

            buf = io.BytesIO()
            img.save(buf, format="PNG")
            return buf.getvalue()

        return illustration

Полный pipeline сборки урока

class VideoLessonPipeline:
    async def create_lesson(self, topic: str, duration_min: int = 10) -> str:
        # 1. Генерируем скрипт
        script = await generate_lesson_script(topic, duration_min)

        # 2. Параллельно: TTS + иллюстрации
        tts_tasks = [synthesize_segment(seg["voiceover"]) for seg in script["segments"]]
        slide_tasks = [self.slides.generate_illustration_slide(seg["slide_prompt"]) for seg in script["segments"]]

        audio_segments, slide_images = await asyncio.gather(
            asyncio.gather(*tts_tasks),
            asyncio.gather(*slide_tasks)
        )

        # 3. Собираем видео сегментами
        segment_videos = []
        for i, seg in enumerate(script["segments"]):
            # D-ID для каждого сегмента ИЛИ сборка через MoviePy (дешевле)
            seg_video = await self.assemble_segment(
                audio=audio_segments[i],
                slide=slide_images[i],
                duration=seg["duration_sec"]
            )
            segment_videos.append(seg_video)

        # 4. Конкатенируем все сегменты
        return self.concat_segments(segment_videos, output_path=f"/output/{topic}.mp4")

Сравнение AI-аватар платформ

Платформа Качество API Стоимость Кастомизация
D-ID Хорошее Да $0.01–0.05/сек Средняя
HeyGen Отличное Да $0.05–0.15/мин Высокая
Synthesia Профессиональное Enterprise $30+/мин Высокая
Hedra Хорошее Да $0.03–0.08/сек Средняя

Сроки: pipeline скрипт → TTS → слайды → сборка видео — 2–3 недели. Платформа с D-ID аватаром, библиотекой тем и LMS-экспортом — 6–8 недель.