Продление видео и интерполяция кадров в Gemini Omni: API и проверка непрерывности
Практический процесс для продления клипа или перехода между двумя ключевыми кадрами с последующей проверкой визуальной и звуковой непрерывности.
Содержание

У вас уже есть короткий ролик, но действие обрывается слишком рано; либо есть только первый и последний кадры, а движения между ними нет. С gemini-omni-1.1-flash можно добавить продолжение на 3–10 секунд или построить переход между двумя граничными изображениями; после чтения вы сможете выбрать режим, выполнить вызов API и понять, можно ли отдавать результат.
Если нужно сохранить движение, камеру и звук исходного ролика, выбирайте продление с конца; если начало и конец уже заданы, а не хватает только середины, выбирайте интерполяцию первого и последнего кадров; получение MP4 завершает генерацию, но не проверку героя, движения, стыка и звука.
Что выбрать: продление или интерполяцию?
При наличии исходного видео начинайте с продления; если финал обязан совпасть с конкретным изображением, начинайте с интерполяции. Продление не использует заданный финальный кадр как жёсткую границу, поэтому неправильный выбор обычно добавляет ещё один цикл генерации и проверки.
| Задача | Входные данные | Когда применять | Что проверять особенно внимательно |
|---|---|---|---|
| Продление с конца | Один ролик, при необходимости — референсные изображения | Продолжить действие, движение камеры или сцену на несколько секунд | Позу, скорость, направление камеры, свет и звук около стыка |
| Переход между первым и последним кадрами | Два изображения и описание перехода | Восстановить движение между двумя заданными состояниями | Личность героя, геометрию сцены, траекторию и точность финального кадра |
Продление загруженного видео рассчитано на короткие добавления: официальное руководство указывает 3–10 секунд за один раз, а руководство по промптам описывает шаги по 10 секунд до общей длины 40 секунд. Исходный клип должен быть не длиннее 10 секунд, а материал добавляется только в конец; для вставки в начало или середину используйте обычный монтаж.
Четыре решения до вызова API
До генерации зафиксируйте модель, формат результата, правила склейки и исходники для сравнения. Если пропустить хотя бы один пункт, работу часто приходится запускать заново или невозможно понять, изменил ли стык модель или сам исходник.
Используйте актуальный GA model ID
Используйте GA-идентификатор gemini-omni-1.1-flash. Модель получила статус GA 27 августа 2026 года; старый endpoint gemini-omni-flash-preview должен быть выведен из эксплуатации 30 сентября 2026 года.
Сначала проверьте непрерывность в 720p
Для первого прогона используйте стандартные 720p, чтобы не смешивать ошибки непрерывности с доставкой тяжёлого файла. Поле resolution в response_format принимает 360p, 720p, 1080p и 4k; 1080p и 4k названы апскейлом, базовое соотношение сторон — 16:9, также можно запросить 9:16. Для результата крупнее 4 МБ, особенно выше 720p, выберите delivery="uri", дождитесь активного состояния файла и скачайте его.
Заранее решите, нужен ли непрерывный план
Определите, нужен ли единый план или намеренная склейка. В промпте продления 0s означает начало нового фрагмента, а не исходного клипа. Для непрерывного действия прямо укажите «один непрерывный план» и «без склеек». Если нужен переход к новой сцене, задайте его момент внутри добавляемого фрагмента.
Сохраните исходник и граничные кадры
Сохраните оригинал и оба граничных изображения. В официальном руководстве сказано, что Omni использует последние 10 секунд исходника как контекст и может изменить несколько финальных кадров ради перехода. Поэтому сравнение исходника с выходным файлом — обязательная часть контроля.
Есть исходный ролик: продолжайте его с конца
Используйте продление, когда ролик уже есть и нужно ещё несколько секунд действия, движения камеры или сцены. Сначала выполните минимальный запрос в 720p, затем уточняйте героя, движение, камеру и звук.
Сначала выполните минимальный запрос в 720p
Пример на Python загружает ролик через Files API, ждёт завершения обработки и передаёт URI с инструкцией в interactions.create. Разрешение 720p позволяет сначала исправить непрерывность, а уже потом разбираться с доставкой файла высокого разрешения.
import base64
import time
from google import genai
client = genai.Client()
video_file = client.files.upload(file="my_video.mp4")
while video_file.state == "PROCESSING":
time.sleep(10)
video_file = client.files.get(name=video_file.name)
if video_file.state == "FAILED":
raise ValueError(video_file.state)
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input=[
{"type": "video", "uri": video_file.uri},
{
"type": "text",
"text": (
"Продолжи сцену единым непрерывным планом. "
"Сохрани того же героя, одежду, направление камеры, освещение и скорость движения. Без монтажных склеек и новой речи."
),
},
],
response_format={"type": "video", "resolution": "720p"},
)
with open("extended.mp4", "wb") as f:
f.write(base64.b64decode(interaction.output_video.data))
Пишите проверяемые условия, а не общие пожелания
Не ограничивайтесь фразой «продолжи сцену». Опишите как минимум пять наблюдаемых параметров: что нельзя менять в герое, как развивается действие, как движется камера, меняются ли свет и окружение, допустимы ли склейка и новый звук. Формулировку «правая рука продолжает подниматься с той же скоростью» можно проверить, а «сделай естественно» — нет.
Задавайте task, только если промпт выбрал неверный режим
Если промпт не включает режим продления, в generation_config можно добавить {"video_config": {"task": "extend"}}. Документация советует сначала работать промптом, потому что task накладывает дополнительные ограничения. Видео из предыдущего хода можно продолжить по previous_interaction_id без новой загрузки. Для этого состояние должно быть сохранено: результат с store=false нельзя редактировать позже через этот ID.
Меняйте план, если мешают ограничения по речи или региону
Есть ограничения по речи и регионам. Если в загруженном ролике человек уже говорит, сейчас нельзя продлить его с добавлением новой реплики; молчаливое продолжение или промпт без новой речи допустимы. Речь поддерживается при многошаговом продлении видео, созданного моделью, через previous_interaction_id. Редактирование и продление загруженных видео сейчас недоступны пользователям в ЕЭЗ, Швейцарии и Великобритании, тогда как продолжение модельного видео разрешено в доступных регионах.
Есть только первый и последний кадры: создайте движение между ними
Интерполяция подходит, когда начало и конец заданы, но промежуточного движения нет. Передайте изображения в правильном порядке и опишите, как герой, камера и окружение должны перейти из первого состояния во второе.
Сначала передайте два граничных изображения
Интерполяция подходит, когда начальное и конечное состояния известны, а промежуточного движения нет. Поместите два изображения в input в нужном порядке и опишите путь героя, камеры и среды. В полном примере локальные JPEG кодируются в Base64, а результат запрашивается в 720p.
import base64
from pathlib import Path
from google import genai
client = genai.Client()
first_frame_b64 = base64.b64encode(Path("first.jpg").read_bytes()).decode()
last_frame_b64 = base64.b64encode(Path("last.jpg").read_bytes()).decode()
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input=[
{"type": "image", "data": first_frame_b64, "mime_type": "image/jpeg"},
{"type": "image", "data": last_frame_b64, "mime_type": "image/jpeg"},
{
"type": "text",
"text": (
"Плавно перейди от первого кадра к последнему. "
"Сохрани личность героя и направление камеры, сделай траекторию движения непрерывной и избегай резких склеек."
),
},
],
response_format={"type": "video", "resolution": "720p"},
)
with open("interpolation.mp4", "wb") as f:
f.write(base64.b64decode(interaction.output_video.data))
Используйте image_to_video, только если режим всё ещё не определён
После отправки изображений по порядку прямо укажите, что первое задаёт начало, а второе — конец. Если модель всё равно выбирает неверный режим, добавьте image_to_video как значение task; оно дополняет описание героя, камеры и движения, а не заменяет его.
Чем сильнее различаются кадры, тем важнее порядок изменений
Совместимые граничные кадры легче связать: желательно не менять без объяснения героя, формат, ось камеры и расположение объектов. При большой разнице задайте порядок преобразований — сначала герой поворачивается, затем смещается камера, после этого меняется свет. Это производственная рекомендация, а не обещание результата; видео всё равно нужно принять по факту.
Можно ли отдавать результат? Проверьте стык, героя, движение и звук
Критерий — не общее впечатление «похоже», а возможность точно указать дефект и превратить его в инструкцию для следующей генерации. Сначала посмотрите ролик в нормальном темпе, затем проверьте стык медленно или покадрово и отдельно прослушайте звук.
| Параметр | Что проверять | Формулировка для правки |
|---|---|---|
| Герой | Лицо, волосы, одежду, аксессуары, пропорции, руки и предметы | «Не меняй цвет пальто и предмет в правой руке». |
| Движение | Направление, скорость, баланс, точки контакта, взгляд и траекторию камеры | «Продолжи текущий шаг вправо, без ускорения и разворота». |
| Монтаж и изображение | Скачок на стыке, экспозицию, температуру цвета, глубину резкости, перспективу и фон | «Сохрани ось камеры и фокусное расстояние; не делай склейку». |
| Звук | Атмосферу, ритм музыки, речь, реверберацию, громкость, щелчки и новый шум | «Продолжи фон, не добавляй речь и не меняй ритм музыки». |
В продлении проверяйте стык, в интерполяции — оба края
При продлении внимательно сравните последнюю секунду исходника с первой секундой продолжения и проверьте, не были ли изменены исходные финальные кадры. При интерполяции оцените не только середину: старт должен соответствовать первому изображению, а финал — действительно достигать второго, а не быть лишь похожим по стилю.
За одну итерацию ужесточайте только один параметр
В каждой итерации ужесточайте один крупный параметр. Сначала исправьте героя, затем движение, после этого камеру и звук. Так легче понять влияние инструкции. Пишите «левый рукав меняет цвет на стыке», а не «сделай более кинематографично».
Не используйте этот endpoint для неподходящих задач
Текущий endpoint не заменяет монтажную систему в один вызов, если нужно вставить кадр в середину длинного ролика, продолжить существующую речь или учитывать несколько исходных видео. Если задача упирается хотя бы в одно ограничение ниже, сначала разбейте её на планы или выберите обычный монтаж.
- Загруженный клип можно продлить только с конца; его длина не должна превышать 10 секунд.
- Нельзя добавить новую реплику к загруженному видео, где человек уже говорит; редактирование голоса также не поддерживается.
- Аудиореференсы загружать нельзя, а звук в видеореференсе игнорируется.
- Допускается не более трёх видеореференсов длительностью до трёх секунд каждый; рассуждение по нескольким видео не поддерживается.
- Системные инструкции,
temperature,top_p, stop sequences и отдельное поле negative prompt не поддерживаются. Запреты пишутся в обычном промпте. - Все созданные ролики содержат невидимый SynthID; входы и выходы проходят фильтры безопасности.
- Полная поддержка заявлена для английских промптов. Другие языки не оценивались, поэтому результат может отличаться.
Практический вариант — отдельно сгенерировать короткие планы, а затем собрать их и свести звук в обычном редакторе. Это быстрее, чем многократно заставлять продление с конца выполнять вставку в середину, продолжение диалога или анализ нескольких клипов.
Проверьте всё по списку перед передачей
Успешный ответ API не означает, что ролик прошёл контроль качества. Перед передачей подтвердите, что:
- сохранены исходное видео, результат и оба граничных изображения;
- записаны model ID, разрешение и полный промпт;
- стык продления проверен покадрово, включая возможное изменение финальных кадров исходника;
- интерполяция начинается с первого изображения и действительно заканчивается вторым;
- звук отдельно прослушан на разрывы, щелчки и новый шум;
- учтены регион, длина входного клипа, речь и ограничения референсов.
Если любой пункт нельзя объяснить, сначала исправьте результат и не принимайте его только по статусу API.