他正在用生成式影片工具幫客戶做一支開箱影片,需要鏡頭從「手拿產品特寫」平滑轉到「產品擺在梳妝台上」的畫面
Gemini Omni 1.1 Flash 是 Google DeepMind 推出的 生成式影片模型用文字或圖片提示,讓 AI 自動「畫」出一段會動的影片,不用像傳統動畫要一格一格手繪 的最新更新版本。這次更新的重點不是「畫質變得多驚豔」,而是讓開發者對生成過程有更多「精細控制」,讓工具真正能撐起專業的產製流程,而不只是拿來玩票。
第一個重點是「場景延伸」:AI 生成下一段影片時,需要知道前面已經拍到什麼,才能讓動作、角度、光線接得順。這種能力叫做 上下文記憶(context)AI 生成下一段內容時,能「回頭看」前面已經產出的東西,藉此保持連貫性,不是每次都從零開始亂猜。舊版模型只看得到前一秒的畫面,新版可以參考前 10 秒,而且能以 10 秒為單位持續延伸,單支影片最長可以疊加到 40 秒。
第二個重點是「指定起始與結束 關鍵影格(keyframe)動畫中決定「起點畫面」跟「終點畫面」的兩張影格,中間怎麼動由電腦自動算出來,早期手繪動畫的原畫師跟中割師就是這樣分工的」。過去只能打字描述想要的鏡頭,結果常常「開盲盒」;現在可以直接給模型頭尾兩張畫面,讓它精準補完中間的運鏡轉場,例如環繞鏡頭或無縫循環動畫。
第三個重點是新增的 360p 草稿模式:用比正式輸出更低的 解析度(resolution)畫面的精細程度,常用像素高度表示,數字越大畫面越細緻,但檔案也越大、算得越慢 快速產出預覽,速度最多快 60%、成本只要正式版的三分之一,很適合定案前大量試錯。這些能力都是透過 Google AI Studio 的 API讓不同程式之間「打電話溝通」的規格書,開發者照著這份規格呼叫 Google 的影片生成服務,不用自己蓋一個 AI 模型 提供給開發者,並附上 Python 的 SDK官方包好的工具包(這裡是 google-genai 套件),讓你不用自己組網路請求,用幾行程式碼就能呼叫 API 範例。
| 能力 | 先前版本 | Omni 1.1 Flash |
|---|---|---|
| 場景延伸可參考的畫面長度 | 只看最後 1 秒 | 可看前 10 秒 |
| 單支影片可累積延伸的總長度 | 沒有明確的疊加延伸機制 | 最長可疊加到 40 秒(每次 10 秒為單位) |
| 運鏡控制方式 | 只能靠文字描述,結果不可預期 | 可指定起始/結束關鍵影格,精準補完中間過程 |
| 草稿模式 | 沒有 | 360p,速度最多快 60%、成本約正式版三分之一 |
這段程式示範怎麼用 Gemini API 做「場景延伸」:假設先前已經生成過一段影片,結果存在 previous_video_interaction 這個變數裡,這段程式碼接著那段影片的最後畫面,繼續往下生成下一段。
from google import genaiclient = genai.Client()interaction = client.interactions.create( model="gemini-omni-1.1-flash", previous_interaction_id=previous_video_interaction.id, input=[{"type": "text", "text": "Continue the scene."}], response_format={"resolution": "360p"},)這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。
google-genai>=0.3.0
"""AI 影片接龍練習:用 Gemini Omni 1.1 Flash 做「先求快、再接龍」的兩段式影片
用途:
1. 先用 360p 草稿模式生成第一段影片,快速確認分鏡方向
2. 用 previous_interaction_id 接續生成下一段(場景延伸最長可到 40 秒)
"""
import os
import time
from google import genai
API_KEY = os.environ.get("GEMINI_API_KEY")
if not API_KEY:
raise SystemExit("請先設定環境變數 GEMINI_API_KEY,步驟見教案的 Windows 逐步指令。")
client = genai.Client(api_key=API_KEY)
FIRST_PROMPT = (
"A close-up low-angle shot of a stylish drummer in a beige suit "
"playing a red drum kit in a grand hall. Cinematic lighting."
)
def wait_until_ready(interaction, poll_seconds: float = 5.0):
"""輪詢互動狀態,直到影片產出完成或失敗為止。"""
while interaction.status not in ("completed", "failed"):
print(f"目前狀態:{interaction.status},{poll_seconds} 秒後再檢查一次...")
time.sleep(poll_seconds)
interaction = client.interactions.get(interaction.id)
return interaction
def main() -> None:
print("第一步:用 360p 草稿模式生成第一段影片(求快、求便宜)")
first = client.interactions.create(
model="gemini-omni-1.1-flash",
input=[{"type": "text", "text": FIRST_PROMPT}],
response_format={"resolution": "360p"},
)
first = wait_until_ready(first)
print(f"第一段完成,interaction id = {first.id}")
print(f"預覽網址/檔案位置:{first.output}")
print()
print("第二步:用 previous_interaction_id 接續生成下一段(場景延伸)")
second = client.interactions.create(
model="gemini-omni-1.1-flash",
previous_interaction_id=first.id,
input=[{"type": "text", "text": "Continue the scene."}],
response_format={"resolution": "360p"},
)
second = wait_until_ready(second)
print(f"第二段完成,interaction id = {second.id}")
print(f"預覽網址/檔案位置:{second.output}")
print()
print("草稿分鏡確認沒問題後,可以把 resolution 換成 720p 重新輸出正式版。")
if __name__ == "__main__":
main()