Перейти к содержимому

Генерация видео с ИИ — Runway, Kling, Sora

Генерация видео с ИИ: Runway, Kling, Sora, Pika

2026 год — это момент, когда AI-генерация видео перешла из “вау, прикольная демка” в рабочий инструмент. Уже сейчас YouTube-каналы используют Runway для B-roll, маркетологи создают рекламные ролики за часы вместо недель, а инди-разработчики делают трейлеры для игр без единого дня съёмок.

Для разработчика и контент-мейкера это открывает возможности:

  • B-roll для YouTube — красивая подложка под озвучку без съёмки
  • Промо-ролики и трейлеры — анонсы продуктов и приложений
  • Интро/аутро — уникальная заставка для каждого видео
  • Маркетинг и реклама — персонализированный визуальный контент в масштабе
  • Прототипирование видео — покажи стейкхолдерам концепцию до полноценного производства

Главные игроки на арене: Runway Gen-4, Kling AI 2.0, Sora (OpenAI), Pika 2.2. У каждого своя ниша.


Runway — самый известный AI-видеогенератор с API, который используют профессионалы в Голливуде и крупных студиях. Флагманская модель — Gen-4 Turbo (начало 2026).

  • Text-to-Video — видео до 10 секунд из текстового описания
  • Image-to-Video — анимация статичных изображений
  • Video-to-Video — изменение стиля существующего видео
  • Motion Brush — рисуешь направление движения объектов
  • Camera Controls — программируешь движение камеры (pan, zoom, tilt, orbit)
  • Character Consistency — сохранение внешности персонажа между сценами
  • Multi-Frame Reference — создание видео с несколькими референсными изображениями
ПланrЦенаКредиты/месСекунды видео
Free$0125~25–50 сек
Standard$15/мес625~125–250 сек
Pro$35/мес2250~450–900 сек
Unlimited$95/мес∞ (720p)Без лимита
EnterpriseCustomCustom4K, приоритет

Runway предоставляет официальный REST API для text-to-video и image-to-video генерации.

import os
import time
import requests
RUNWAY_API_KEY = os.environ["RUNWAY_API_KEY"]
BASE_URL = "https://api.runwayml.com/v1"
HEADERS = {
"Authorization": f"Bearer {RUNWAY_API_KEY}",
"Content-Type": "application/json",
"X-Runway-Version": "2024-11-06"
}
def text_to_video(
prompt: str,
duration: int = 5, # 5 или 10 секунд
ratio: str = "1280:720", # "1280:720", "720:1280", "1104:832"
model: str = "gen4_turbo"
) -> str:
"""Генерация видео из текста. Возвращает URL результата."""
payload = {
"model": model,
"promptText": prompt,
"duration": duration,
"ratio": ratio,
}
# Запускаем задачу
response = requests.post(
f"{BASE_URL}/image_to_video", # Endpoint для gen4
json=payload,
headers=HEADERS
)
response.raise_for_status()
task = response.json()
task_id = task["id"]
print(f"Задача запущена: {task_id}")
return poll_task(task_id)
def image_to_video(
image_url: str,
prompt: str = "",
duration: int = 5,
ratio: str = "1280:720"
) -> str:
"""Анимация статичного изображения."""
payload = {
"model": "gen4_turbo",
"promptImage": image_url, # URL или base64
"promptText": prompt, # Описание движения (опционально)
"duration": duration,
"ratio": ratio,
}
response = requests.post(
f"{BASE_URL}/image_to_video",
json=payload,
headers=HEADERS
)
response.raise_for_status()
task_id = response.json()["id"]
return poll_task(task_id)
def poll_task(task_id: str, timeout: int = 300) -> str:
"""Ждём пока видео сгенерируется. Возвращает URL."""
start = time.time()
while time.time() - start < timeout:
response = requests.get(
f"{BASE_URL}/tasks/{task_id}",
headers=HEADERS
)
task = response.json()
status = task["status"]
if status == "SUCCEEDED":
video_url = task["output"][0]
print(f"Готово! URL: {video_url}")
return video_url
elif status == "FAILED":
raise Exception(f"Генерация провалилась: {task.get('failure', 'Unknown error')}")
elif status in ("RUNNING", "PENDING"):
progress = task.get("progress", 0)
print(f"Прогресс: {progress:.0%}...")
time.sleep(5)
else:
time.sleep(5)
raise TimeoutError("Видео не сгенерировалось за отведённое время")
# Использование
video_url = text_to_video(
prompt="A drone flying over a neon-lit cyberpunk city at night, "
"rain reflecting lights on the streets below, cinematic",
duration=5,
ratio="1280:720"
)
# Скачиваем видео
import urllib.request
urllib.request.urlretrieve(video_url, "output.mp4")
print("Видео сохранено: output.mp4")

Kling AI от Kuaishou — главный конкурент Runway. Модель Kling 2.0 Master (2026) выдаёт видео, которое во многих тестах превосходит Runway по фотореализму и плавности движений.

  • Физика движений — персонажи и объекты двигаются как в реальном мире
  • Генерация до 3 минут — при использовании Video Extension
  • Lip Sync — синхронизация губ с аудио
  • Kling Elements — генерация из нескольких референсных объектов
  • Act-One — анимация лица через видео-перенос мимики
ПланrЦенаКредиты/месОсобенности
Free$066/деньWatermark, 720p
Standard$7/мес660Без водяного знака
Pro$28/мес30001080p, приоритет
Premier$93/мес99904K, API доступ
import os
import fal_client
os.environ["FAL_KEY"] = "your_fal_key"
def generate_kling_video(prompt: str, image_url: str = None) -> str:
"""Генерация через Kling 2.0 via fal.ai."""
if image_url:
# Image-to-video
result = fal_client.subscribe(
"fal-ai/kling-video/v2/master/image-to-video",
arguments={
"prompt": prompt,
"image_url": image_url,
"duration": "5",
"aspect_ratio": "16:9",
"cfg_scale": 0.5,
},
)
else:
# Text-to-video
result = fal_client.subscribe(
"fal-ai/kling-video/v2/master/text-to-video",
arguments={
"prompt": prompt,
"duration": "5",
"aspect_ratio": "16:9",
"cfg_scale": 0.5,
},
)
return result["video"]["url"]
# Пример
url = generate_kling_video(
prompt="Close-up of coffee being poured into a cup in slow motion, "
"steam rising, warm morning light, photorealistic"
)
print(f"Видео: {url}")

Sora от OpenAI — модель, которую ждали больше года. Теперь доступна в ChatGPT Plus/Pro и через API (в ограниченном доступе).

  • Видео до 20 секунд в разрешении 1080p
  • Storyboard — несколько сцен, склеенных в одно видео
  • Re-cut — перегенерация только части видео
  • Loop — создание бесшовных петель
  • Blend — плавный переход между двумя видео
  • Сильный акцент на понимание физики и причинно-следственные связи
ДоступЛимит видеоКачествоДлина
ChatGPT Plus50 шт/мес720pдо 10 сек
ChatGPT Pro500 шт/мес1080pдо 20 сек
API (beta)По токенам1080pдо 20 сек
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# Создание задачи
response = client.videos.generate(
model="sora-1.0",
prompt="A time-lapse of a city block transforming from dawn to dusk, "
"people rushing, lights turning on, cinematic overhead shot",
size="1280x720",
duration=10, # секунды
n=1,
)
# Получение результата (polling)
video_id = response.id
print(f"Запущено: {video_id}")
# Polling через client.videos.retrieve(video_id)

Pika 2.2 — лучший вариант для быстрого старта и экспериментов. Интерфейс проще, генерация быстрее, цена ниже.

  • Pikaffects — встроенные эффекты (взрывы, превращения, плавление)
  • Modify Region — изменение отдельной области видео
  • Inflate / Deflate — 3D-раздувание объектов
  • Explode — эффект взрыва любого объекта
  • Поддержка soundscape — автоматическая генерация звука к видео
ПланЦенаКредиты/месОсобенности
Free$0150Watermark, 720p
Basic$8/мес700Без водяного знака
Standard$28/мес20001080p
Pro$78/мес100004K, API

Runway Gen-4

Лучший для: профессиональный контент, точный контроль камеры, API
API: ✅ Официальный
Сильная сторона: Camera Controls, Motion Brush
Слабая сторона: дорого для больших объёмов
Цена: от $15/мес

Kling AI 2.0

Лучший для: реализм движений, длинные клипы, Lip Sync
API: через fal.ai / Replicate
Сильная сторона: физика, длина до 3 мин
Слабая сторона: прямой API ограничен
Цена: от $7/мес

Sora

Лучший для: сложные нарративные сцены, Storyboard
API: ⚠️ Beta-доступ
Сильная сторона: понимание физики и логики сцены
Слабая сторона: закрытый доступ, дорого
Цена: от $20/мес (ChatGPT Plus)

Pika 2.2

Лучший для: быстрые эксперименты, эффекты, маркетинг
API: ✅ Через партнёров
Сильная сторона: Pikaffects, скорость
Слабая сторона: меньше контроля над сценой
Цена: от $8/мес

ПараметрRunway Gen-4Kling 2.0SoraPika 2.2
Реализм⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Макс. длина10 сек3 мин*20 сек10 сек
Разрешениедо 4Kдо 4K1080pдо 4K
Публичный APIчерез fal.ai⚠️ Beta⚠️ Limited
Контроль камерыОграничен
Text-to-Video
Image-to-Video
Lip Sync

*через Video Extension


Генерация из текста — основной режим. Ты описываешь сцену, модель создаёт видео. Звучит просто, но детали важны.

  1. Опиши сцену: что происходит, кто/что в кадре, где это происходит

  2. Укажи движение: камера (pan left, zoom in, tracking shot), объекты, персонажи

  3. Добавь стиль: cinematic, documentary, drone footage, slow motion, time-lapse

  4. Укажи освещение: golden hour, neon lights, studio, overcast

  5. Задай формат: соотношение сторон (16:9, 9:16, 1:1), длина

Плохо:

Город ночью

Хорошо:

Aerial drone shot of Tokyo at night, camera slowly descending from above,
neon signs reflecting in wet streets after rain, people with umbrellas below,
bokeh lights in the background, cinematic color grading, 4K, slow motion
[Тип кадра] + [Объект/сцена] + [Движение камеры] + [Движение объекта] + [Стиль/атмосфера] + [Техническое]

Полезные ключевые слова:

Тип кадраДвижение камерыСтиль
aerial shotslow pan leftcinematic
close-upzoom in slowlydocumentary
tracking shotorbit aroundphotorealistic
wide establishing shothandheldslow motion
POV shottimelapsefilm noir

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

Модель анализирует изображение и “оживляет” его, добавляя реалистичное движение. Ты можешь подсказать направление через текстовый промпт.

# Пример: анимируем сгенерированное изображение
import base64
import requests
def animate_image(image_path: str, motion_prompt: str = "") -> str:
"""
Анимируем локальное изображение через Runway.
"""
# Конвертируем в base64
with open(image_path, "rb") as f:
image_b64 = base64.b64encode(f.read()).decode()
# Определяем MIME тип
ext = image_path.split(".")[-1].lower()
mime = {"jpg": "image/jpeg", "jpeg": "image/jpeg", "png": "image/png"}.get(ext, "image/jpeg")
image_data_url = f"data:{mime};base64,{image_b64}"
# Запрос к Runway
payload = {
"model": "gen4_turbo",
"promptImage": image_data_url,
"promptText": motion_prompt,
"duration": 5,
"ratio": "1280:720",
}
response = requests.post(
"https://api.runwayml.com/v1/image_to_video",
json=payload,
headers={
"Authorization": f"Bearer {os.environ['RUNWAY_API_KEY']}",
"X-Runway-Version": "2024-11-06",
}
)
response.raise_for_status()
task_id = response.json()["id"]
return poll_task(task_id) # функция из примера выше
# Использование: анимируем обложку статьи
video_url = animate_image(
"my_article_cover.png",
motion_prompt="subtle particle effects floating upward, gentle camera zoom in"
)

B-Roll для YouTube

Нужна подложка под закадровый голос? Генерируй тематические видео: “кофе на столе”, “руки за клавиатурой”, “ночной город”. Без съёмки, без стоков с водяными знаками.

Промо-трейлер продукта

Показываешь новое приложение или игру? Runway создаст кинематографичные кадры по концепт-артам за час вместо недели продакшена.

Интро/аутро для канала

Уникальная заставка — это 5 секунд которые зрители видят каждый раз. С AI делаешь её раз и на годы. Попробуй сгенерировать несколько вариантов.

Рекламные материалы

Маркетинг требует постоянно новый контент. Генерируй вариации для разных аудиторий, форматов и платформ быстрее, чем согласовываются брифы.

"""
Полный пайплайн: текст → изображение → видео → финал.
Используем GPT-4o для изображения, Runway для видео.
"""
import os
import base64
import requests
from openai import OpenAI
openai_client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
RUNWAY_KEY = os.environ["RUNWAY_API_KEY"]
def generate_promo_video(concept: str, output_file: str = "promo.mp4"):
"""Создаём промо-видео из концепции за 3 шага."""
print(f"🎬 Создаём видео для: '{concept}'")
# Шаг 1: GPT-4o генерирует оптимальный промпт для изображения
print("Step 1: Генерируем промпт для изображения...")
prompt_response = openai_client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"""Создай детальный промпт для генерации рекламного изображения.
Концепция: {concept}
Требования:
- Фотореалистичный или кинематографичный стиль
- Подходит для анимации (чёткий объект, понятный фон)
- Широкоформатный (16:9)
- Тёмная или вечерняя атмосфера
Ответь только промптом, без объяснений."""
}]
)
image_prompt = prompt_response.choices[0].message.content
print(f" Промпт: {image_prompt[:100]}...")
# Шаг 2: Генерируем изображение через gpt-image-1
print("Step 2: Генерируем изображение...")
image_response = openai_client.images.generate(
model="gpt-image-1",
prompt=image_prompt,
size="1792x1024",
quality="high",
n=1
)
image_bytes = base64.b64decode(image_response.data[0].b64_json)
# Сохраняем изображение
with open("frame.png", "wb") as f:
f.write(image_bytes)
print(" Изображение готово: frame.png")
# Шаг 3: Анимируем через Runway
print("Step 3: Анимируем изображение...")
image_b64 = base64.b64encode(image_bytes).decode()
resp = requests.post(
"https://api.runwayml.com/v1/image_to_video",
json={
"model": "gen4_turbo",
"promptImage": f"data:image/png;base64,{image_b64}",
"promptText": "slow cinematic camera movement, subtle atmosphere",
"duration": 5,
"ratio": "1280:720"
},
headers={
"Authorization": f"Bearer {RUNWAY_KEY}",
"X-Runway-Version": "2024-11-06",
}
)
resp.raise_for_status()
task_id = resp.json()["id"]
# Ждём результат
import time
for _ in range(60):
time.sleep(5)
check = requests.get(
f"https://api.runwayml.com/v1/tasks/{task_id}",
headers={"Authorization": f"Bearer {RUNWAY_KEY}", "X-Runway-Version": "2024-11-06"}
)
task = check.json()
if task["status"] == "SUCCEEDED":
video_url = task["output"][0]
break
elif task["status"] == "FAILED":
raise Exception(f"Видео не создалось: {task.get('failure')}")
# Скачиваем
import urllib.request
urllib.request.urlretrieve(video_url, output_file)
print(f"✅ Готово! Видео сохранено: {output_file}")
return output_file
# Запуск
generate_promo_video(
"Новый инструмент для разработчиков — автоматизирует рутину с AI",
"promo_final.mp4"
)

Конкретность движения:

Camera slowly pulls back revealing a vast mountain landscape

Лучше чем просто “mountain landscape”.

Физические детали:

Leaves swaying gently in the breeze, water rippling in the foreground

Помогает модели понять что должно двигаться.

Кинематографические термины:

Dolly zoom effect, rack focus from foreground to background,
anamorphic lens flare

Стилистические референсы:

Shot in the style of a BBC nature documentary
Shot like a Blade Runner 2049 scene
Instagram aesthetic, warm filters
  • Слишком много текста в кадре — модели плохо справляются с буквами
  • Сложные взаимодействия персонажей (рукопожатия, объятия) — руки до сих пор проблема
  • Длинные диалоги с синхронизацией губ — только Kling справляется более-менее
  • Очень быстрые смены сцен — модель “не успевает”

Практика: создаём промо-ролик для YouTube-канала

Заголовок раздела «Практика: создаём промо-ролик для YouTube-канала»

Задача: создать 30-секундный промо-ролик из нескольких AI-сгенерированных клипов.

  1. Планируем сцены — разбиваем ролик на 6 клипов по 5 секунд:

    • Открывающий кадр (город с высоты)
    • Крупный план (руки за клавиатурой)
    • Абстрактный код/данные
    • Результат (красивый интерфейс)
    • Человек смотрит на экран
    • Финальный логотип/призыв
  2. Генерируем каждый клип — через Runway или Kling по отдельности

  3. Склеиваем через FFmpeg:

Окно терминала
# Создаём список файлов
cat > clips.txt << EOF
file 'clip1.mp4'
file 'clip2.mp4'
file 'clip3.mp4'
file 'clip4.mp4'
file 'clip5.mp4'
file 'clip6.mp4'
EOF
# Склеиваем
ffmpeg -f concat -safe 0 -i clips.txt -c copy promo_raw.mp4
# Добавляем плавные переходы (cross-fade 0.5 сек)
ffmpeg -i promo_raw.mp4 \
-vf "fade=in:0:12,fade=out:$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 promo_raw.mp4 | awk '{print $1 * 30 - 12}'):12" \
promo_final.mp4
  1. Добавляем музыку через Suno AI (из урока по аудио):
Окно терминала
ffmpeg -i promo_final.mp4 -i background_music.mp3 \
-c:v copy -c:a aac \
-map 0:v:0 -map 1:a:0 \
-shortest \
promo_with_music.mp4
  1. Профит — 30-секундный ролик без единого дня съёмок

В следующих уроках разберём v0 by Vercel — как генерировать готовые UI компоненты из промпта прямо в браузере.