這一節(jié)是用AI來做一個自己的短片,一般來說滑黔,視頻生成的大致流程是:
- 使用ChatGPT等LLM模型,寫分鏡劇本环揽;
- 使用SD, MJ等軟件畫圖略荡;
- 利用SVD, Pika, Runway等軟件生成視頻。
下面是我的嘗試:
- 使用Google Gemini生成分鏡劇本歉胶。以下是我的prompt:
幫我寫一個故事的分鏡鏡頭汛兜。
這個故事是關(guān)于一個亞洲少年向盆景大師學(xué)習(xí)盆景制作,然后參加盆景比賽并最終獲獎的故事通今。
Gemini生成的結(jié)果:
故事分鏡鏡頭
場景: 一個寧靜的盆景園
人物:
少年:16歲粥谬,對盆景充滿熱情
大師:70歲,經(jīng)驗豐富的盆景大師
鏡頭 1
外景:陽光明媚的早晨
少年騎著自行車來到盆景園辫塌,看到大師正在修剪一盆松樹漏策。
少年:大師,您好臼氨!我來學(xué)習(xí)盆景制作掺喻。
鏡頭 2
近景:大師慈祥地看著少年
大師:你好,孩子。你愿意學(xué)習(xí)盆景感耙,我很高興褂乍。
鏡頭 3
中景:少年和大師在盆景園里學(xué)習(xí)
大師教少年如何挑選樹苗、修剪枝葉即硼、蟠扎造型等逃片。
少年認(rèn)真學(xué)習(xí),進步很快只酥。
鏡頭 4
近景:少年精心制作一盆盆景
他用幾個月的時間褥实,將一棵普通的樹苗培育成一盆精致的盆景。
鏡頭 5
外景:盆景比賽現(xiàn)場
少年帶著他的盆景參加比賽层皱,與來自各地的選手同臺競技性锭。
鏡頭 6
中景:評委們仔細(xì)觀賞少年的盆景
他們對少年的作品贊賞不已。
鏡頭 7
近景:少年獲得比賽一等獎
他站在領(lǐng)獎臺上叫胖,臉上洋溢著喜悅的笑容草冈。
鏡頭 8
外景:夕陽西下,少年和大師在盆景園里聊天
少年:大師瓮增,謝謝您的教導(dǎo)怎棱。我一定會繼續(xù)努力,成為一名優(yōu)秀的盆景師绷跑。
鏡頭 9
近景:大師欣慰地看著少年
大師:我相信你一定會成功的拳恋。
鏡頭 10
遠(yuǎn)景:少年和大師在盆景園里忙碌的身影
他們將繼續(xù)為盆景藝術(shù)貢獻自己的力量。
鏡頭 11
畫面逐漸模糊砸捏,故事結(jié)束
備注:
以上只是故事的分鏡鏡頭谬运,具體的細(xì)節(jié)可以根據(jù)需要進行調(diào)整。
故事的主題可以是少年對夢想的追求垦藏,也可以是師徒之間的傳承梆暖。
希望這個故事能夠給你帶來一些啟發(fā)。
做簡單修改(但其實這兩處修改并不會影響生成的圖/視頻):
人物:
16歲-->18歲
鏡頭4
他用幾個月的時間-->他用幾年的時間
用Gemini將中文翻譯成英文掂骏,然后使用Modelscope的AnimateDiff庫做text to video(跳過文生圖再生成視頻轰驳,直接文生視頻一步到位),腳本如下:
import torch
from diffusers import MotionAdapter, AnimateDiffPipeline, DDIMScheduler
from diffusers.utils import export_to_gif
from modelscope import snapshot_download
def get_frames(prompt):
output = pipe(
prompt=prompt,
negative_prompt="bad quality, worse quality",
num_frames=16,
guidance_scale=7.5,
num_inference_steps=25,
generator=torch.Generator("cpu").manual_seed(42),
)
frames = output.frames[0]
return frames
prompt_base_description = "masterpiece, bestquality, highlydetailed, ultradetailed, "
prompt_shot1_1 = (
prompt_base_description +
"Sunny morning, " "An 18 year old boy is walking to a bonsai garden, "
)
prompt_shot1_2 = (
prompt_base_description +
"Sunny morning, " "Bonsai garden, " "An old bonsai master is trimming a pipe tree"
)
model_dir = snapshot_download("Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2")
adapter = MotionAdapter.from_pretrained(model_dir)
model_id = snapshot_download("wyj123456/Realistic_Vision_V5.1_noVAE")
pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter)
scheduler = DDIMScheduler.from_pretrained(
model_id, subfolder="scheduler", clip_sample=False, timestep_spacing="linspace", steps_offset=1
)
pipe.scheduler = scheduler
pipe.enable_vae_slicing()
pipe.enable_model_cpu_offload()
# Shot 1-1
# frames = get_frames(prompt_shot1_1)
# export_to_gif(frames, "animation.gif")
# !mv animation.gif shot1_1.gif
# Shot 1-2
frames = get_frames(prompt_shot1_2)
export_to_gif(frames, "animation.gif")
!mv animation.gif shot1_2.gif
注:
- 這里本來想直接根據(jù)shot 1的英文場景描述做出視頻弟灼,但發(fā)現(xiàn)AnimateDiff目前的模型
animatediff-motion-adapter-v1-5-2
沒辦法生成如此復(fù)雜的場景级解。于是對shot 1再做場景切分,變?yōu)閮赡唬?/li> - shot 1-1本來是少年騎車到盆景園田绑,但反復(fù)嘗試生成的都是少年在盆景園里騎車勤哗,看起來感覺有點魯莽,于是將“騎車”改為“走”:
An 18 year old boy is walking to a bonsai garden
- 生成的視頻往往不能完全涵蓋想要的關(guān)鍵信息掩驱,比如芒划,shot 1-1豁延,即使是上面簡單的這句描述,也經(jīng)常會生成“只有一盆盆景”或“只有一個盆景園”的場景腊状,“An 18 year old boy”完全不在畫面中。此時苔可,需要不斷更改prompt描述或隨即種子(純純“抽卡”了屬于是??)才有可能挑選到心儀的視頻缴挖。
不合格視頻示例(畫面中只有一個bonsai,而“An 18 year old boy”完全不在畫面中):
下面是做的shot1-1和shot1-2:
-
shot1-1:
-
shot1-2:
按照如上的方法焚辅,不斷對shot進行切分映屋,生成視頻,然后使用視頻剪輯工具(剪映等)同蜻,做后期加工(拼接棚点、加字幕等)
以上,做個記錄湾蔓,也是拋磚引玉瘫析。