Разработка 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 недель.







