live
MODEL IDgoogle:gemini@omni-flash-1.2

Gemini Omni Flash 1.2

Google
by
Available with Zero Data Retention

Gemini Omni Flash 1.2 is Google's multimodal video model for generating, editing, and extending clips with native synchronized audio. It generates up to 15 seconds from text or a single starting image, edits source videos of up to 15 seconds with optional reference images, and keeps characters, products, and brand details consistent across reference images and videos. Output runs from 360p for quick drafts to 1080p and 4K for delivery, which suits high-volume work such as product clips, virtual try-ons, and ad variations.

Gemini Omni Flash 1.2

Prompting

How to write text-to-video prompts for Gemini Omni Flash 1.2: scene structure, one shot or several, timing, audio direction, and on-screen text.

Introduction

Gemini Omni Flash 1.2 generates video with its own soundtrack from a text prompt. There is no audio parameter and no negative prompt, so the prompt carries every decision: what happens in the scene, how the camera films it, whether the clip cuts, what you hear, and what stays out.

A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text.

Every example here is text-to-video. Starting from images or footage of your own has its own guides: First and last frame, Reference images and videos, Replacing elements with reference images, Editing video, and Extending video.

Prompt structure

Six layers make a complete scene: subject, action, setting, camera, lighting, and audio. The hero prompt writes each one as a clause and closes with what to leave out:

A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text.
SubjectActionSettingCameraLightingAudioExclusions

Any layer you skip is left to the model. Without the camera clause, it frames the scene and moves the camera on its own. Without the audio clause, it picks its own music and sound. The layers work as comma-separated clauses, as here, or as full sentences, which the rest of this guide uses.

The full request for the hero clip:

Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:gemini@omni-flash-1.2',
  positivePrompt: 'A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text.',
  width: 1920,
  height: 1080,
  duration: 8
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:gemini@omni-flash-1.2",
            "positivePrompt": "A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text.",
            "width": 1920,
            "height": 1080,
            "duration": 8
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "7c1e9a24-3b5d-4f8e-9a61-2d4c8b7e5f03",
      "model": "google:gemini@omni-flash-1.2",
      "positivePrompt": "A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text.",
      "width": 1920,
      "height": 1080,
      "duration": 8
    }
  ]'
runware run google:gemini@omni-flash-1.2 \
  positivePrompt="A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text." \
  width=1920 \
  height=1080 \
  duration=8
{
  "taskType": "videoInference",
  "taskUUID": "7c1e9a24-3b5d-4f8e-9a61-2d4c8b7e5f03",
  "model": "google:gemini@omni-flash-1.2",
  "positivePrompt": "A trail runner in her early thirties wearing a coral tank top and black running shorts, running at a steady pace along a narrow gravel path, on a grassy coastal clifftop high above a blue ocean, one continuous tracking shot from the side at hip height with no cuts, low early-morning sun behind her with a warm rim light on her hair and shoulders, the sound of her footsteps crunching on gravel, her steady breathing, waves breaking far below and an upbeat indie-pop track, no dialogue and no on-screen text.",
  "width": 1920,
  "height": 1080,
  "duration": 8
}
Response
[
  {
    "taskType": "videoInference",
    "taskUUID": "7c1e9a24-3b5d-4f8e-9a61-2d4c8b7e5f03",
    "videoUUID": "e2b84f17-6c3a-4d9e-8f25-1a7b3c9d0e64",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/e2b84f17-6c3a-4d9e-8f25-1a7b3c9d0e64.mp4"
  }
]

Resolution and duration covers picking the size and the length.

Shots and cuts

Left without direction, the model chooses the camera on its own, and it may hold one take or cut between several shots. When you need one take, ask for it in the prompt with "single continuous shot" or "no scene cuts".

The two workout clips below come from the same prompt, except that the first one adds a sentence: "Single continuous shot with no scene cuts, the camera slowly circling her at waist height."

Ask for a single shot when the clip goes into an edit of your own and the cuts belong to that edit. Put a camera move in the same sentence, like the slow circle here, so the model knows how that one take travels.

Ask for the cuts when you want a finished sequence from one request. "Cut to" marks each new shot, and timecodes or cues set the order and length of each one.

Timing the action

Two formats place an event at a set moment in the clip: bracketed timecodes, one per line, and plain-language cues such as "after three seconds". The prompts below give the same three beats to an eight-second clip, one in each format:

A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon.
[0-3s] Wide aerial shot of the switchback road as she rounds a hairpin bend.
[3-6s] Low close-up from the roadside as she rises out of the saddle and powers past the camera.
[6-8s] Front view at the top of the pass as she sits up, raises both arms and smiles.
Audio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text.
A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon. The clip opens on a wide aerial shot of the switchback road as she rounds a hairpin bend. After three seconds, cut to a low close-up from the roadside as she rises out of the saddle and powers past the camera. For the last two seconds, cut to a front view at the top of the pass as she sits up, raises both arms and smiles. Audio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text.

Timecodes give every beat an explicit start and end, which suits a shot list like this one. Run the ranges back to back and end the last one at the duration you request. Plain-language cues read more naturally when one or two moments need placing inside a continuous shot, like the closing title card in the on-screen text example.

In the request, each line break is a \n inside the prompt string:

Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:gemini@omni-flash-1.2',
  positivePrompt: 'A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon.\n[0-3s] Wide aerial shot of the switchback road as she rounds a hairpin bend.\n[3-6s] Low close-up from the roadside as she rises out of the saddle and powers past the camera.\n[6-8s] Front view at the top of the pass as she sits up, raises both arms and smiles.\nAudio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text.',
  width: 1280,
  height: 720,
  duration: 8
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:gemini@omni-flash-1.2",
            "positivePrompt": "A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon.\n[0-3s] Wide aerial shot of the switchback road as she rounds a hairpin bend.\n[3-6s] Low close-up from the roadside as she rises out of the saddle and powers past the camera.\n[6-8s] Front view at the top of the pass as she sits up, raises both arms and smiles.\nAudio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text.",
            "width": 1280,
            "height": 720,
            "duration": 8
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "4a9d2c7e-8b1f-4e36-b5a0-6f3e1d9c2b78",
      "model": "google:gemini@omni-flash-1.2",
      "positivePrompt": "A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon.\n[0-3s] Wide aerial shot of the switchback road as she rounds a hairpin bend.\n[3-6s] Low close-up from the roadside as she rises out of the saddle and powers past the camera.\n[6-8s] Front view at the top of the pass as she sits up, raises both arms and smiles.\nAudio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text.",
      "width": 1280,
      "height": 720,
      "duration": 8
    }
  ]'
runware run google:gemini@omni-flash-1.2 \
  positivePrompt="A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon.
[0-3s] Wide aerial shot of the switchback road as she rounds a hairpin bend.
[3-6s] Low close-up from the roadside as she rises out of the saddle and powers past the camera.
[6-8s] Front view at the top of the pass as she sits up, raises both arms and smiles.
Audio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text." \
  width=1280 \
  height=720 \
  duration=8
{
  "taskType": "videoInference",
  "taskUUID": "4a9d2c7e-8b1f-4e36-b5a0-6f3e1d9c2b78",
  "model": "google:gemini@omni-flash-1.2",
  "positivePrompt": "A road cyclist in a yellow jersey and white helmet climbs a mountain pass on a clear summer afternoon.\n[0-3s] Wide aerial shot of the switchback road as she rounds a hairpin bend.\n[3-6s] Low close-up from the roadside as she rises out of the saddle and powers past the camera.\n[6-8s] Front view at the top of the pass as she sits up, raises both arms and smiles.\nAudio: wind, the whir of the chain and her hard breathing over a driving rock beat that builds to the top. No dialogue. No on-screen text.",
  "width": 1280,
  "height": 720,
  "duration": 8
}
Response
[
  {
    "taskType": "videoInference",
    "taskUUID": "4a9d2c7e-8b1f-4e36-b5a0-6f3e1d9c2b78",
    "videoUUID": "b7f3a1c9-2e6d-4b84-9c15-8d0e4a6f3b21",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/b7f3a1c9-2e6d-4b84-9c15-8d0e4a6f3b21.mp4"
  }
]

Directing the audio

Every clip comes with sound, and no parameter shapes it or switches it off. The prompt directs it in layers: the music and its mood, the ambience and sound effects, and any speech. Leave a layer out and the model fills it in.

Dialogue to camera

Name who speaks and quote the line after "says to the camera". Keep it to what a person can say comfortably in the clip, here two short sentences in eight seconds:

The owner of a small dog-grooming salon, a woman in her forties with short gray hair and a navy apron, stands beside a grooming table where a freshly groomed white poodle sits. Single continuous shot, medium close-up at eye level, static camera. She smiles and says to the camera: "We just opened on Maple Street. Book this week and get twenty percent off your first groom." Audio: her voice clear and close, with the soft hum of a dryer and a collar jingling in the background. No music. No subtitles.

The owner of a small dog-grooming salon, a woman in her forties with short gray hair and a navy apron, stands beside a grooming table where a freshly groomed white poodle sits. Single continuous shot, medium close-up at eye level, static camera. She smiles and says to the camera: "We just opened on Maple Street. Book this week and get twenty percent off your first groom." Audio: her voice clear and close, with the soft hum of a dryer and a collar jingling in the background. No music. No subtitles.

Place the ambience behind the voice, as "in the background" does here, so it does not compete with the line. "No music" keeps the soundtrack to the room, and "No subtitles" keeps captions out of the frame so you can add your own in the edit.

Voiceover and music

Off-screen narration is speech with no speaker in the shot. Introduce the voice and quote what it says, then add that the person on screen does not speak. For the music, give the genre and the mood together:

A man in his fifties in a gray T-shirt does a guided stretching routine on a yoga mat on a sunny apartment balcony in the early evening, following the app on a phone propped against a plant pot. He reaches both arms overhead, then folds forward into a slow hamstring stretch. Single continuous shot, the camera drifting slowly closer at waist height. Audio: a calm female voiceover, the app's coach, says: "Reach up tall. Now fold forward slowly and let your breath do the work." Soft piano music with a warm, unhurried mood, and quiet city traffic far below. He does not speak. No subtitles.

A man in his fifties in a gray T-shirt does a guided stretching routine on a yoga mat on a sunny apartment balcony in the early evening, following the app on a phone propped against a plant pot. He reaches both arms overhead, then folds forward into a slow hamstring stretch. Single continuous shot, the camera drifting slowly closer at waist height. Audio: a calm female voiceover, the app's coach, says: "Reach up tall. Now fold forward slowly and let your breath do the work." Soft piano music with a warm, unhurried mood, and quiet city traffic far below. He does not speak. No subtitles.

"The app's coach" tells the model who the voice belongs to, and "He does not speak" keeps the words off the man's lips.

Exclusions

With no negative prompt, anything you want kept out of the clip goes into the prompt as a short sentence. The prompts in this guide use four of them: "No music", "No dialogue", "No subtitles", and "No on-screen text". Add the ones that match what the clip must not contain, and leave out any that would contradict a layer you asked for, such as "No dialogue" on a clip with a voiceover.

On-screen text

For words that have to read in the frame, quote them exactly and say where each string appears, inside the scene or on a title card of its own.

Product demo of an analytics dashboard on a laptop in a bright modern office. Close-up on the screen as the camera slowly pushes in. The dashboard header reads "Revenue overview". Below it, a card labeled "Monthly revenue" shows "$84,200" next to a blue line chart that draws itself upward from left to right. The rest of the dashboard is plain dark panels with no other text, labels or numbers. For the last two seconds, the screen gives way to a white title card that reads "Know your numbers" in bold black letters. Audio: soft keyboard clicks and a light, upbeat electronic track. No dialogue.

Product demo of an analytics dashboard on a laptop in a bright modern office. Close-up on the screen as the camera slowly pushes in. The dashboard header reads "Revenue overview". Below it, a card labeled "Monthly revenue" shows "$84,200" next to a blue line chart that draws itself upward from left to right. The rest of the dashboard is plain dark panels with no other text, labels or numbers. For the last two seconds, the screen gives way to a white title card that reads "Know your numbers" in bold black letters. Audio: soft keyboard clicks and a light, upbeat electronic track. No dialogue.

Keep each string short and tied to a place in the shot, so the model knows both what to write and where. Text inside the scene and a title card that replaces it are written the same way, and the plain-language cue "for the last two seconds" decides when the title card appears.

Tips

  1. Cover every layer. Subject, action, setting, camera, lighting, and audio. Anything missing is left to the model.

  2. Ask for a single shot explicitly. "Single continuous shot" or "no scene cuts" keeps the model from cutting. Add a camera move to the same sentence.

  3. Put each timecode on its own line. Run the ranges back to back up to the duration, and send each line break as \n in the JSON.

  4. Direct each audio layer. Give the music a genre and a mood. Put ambience behind the action and quote every spoken word.

  5. Say who is speaking. A line to camera belongs to someone in the shot. A voiceover belongs to no one on screen, so say that the person in the shot stays silent.

  6. Write exclusions as sentences. "No music", "No dialogue", "No subtitles", and "No on-screen text" do the work of a negative prompt.

  7. Quote every on-screen word. Say where the text appears as well as what it says.

  8. Generate more than one take. There is no seed, so each request is a new take on the same prompt. Run a few and keep the best.