最近真是每天都有大新闻,接二连三的大模型开源,文生视频上线。今天智谱发布了CogVideoX,主打特色,国内最早可以通过API即可完成文/图生视频的模型之一 。一般生成视频需要的时间还挺久的,并且api比较适合接入到自己搭的应用中,所以仔细测试了下CogVideoX是咋玩的。第二部分给大家分享一些视频生成的写prompt经验,最后提供一个搭建demo的代码,可以快速搭建一个本地demo试玩~
用法也非常简单,跟调用llm一致,需要注意需要将api_key 配置成自己的key,api key在智谱的mass开放平台申请,地址为:https://bigmodel.cn/ 。注册即送几百万token,还不错~
申请完token,安装官方包即可调用 pip install zhipuai
。
from zhipuai import ZhipuAI
client = ZhipuAI(api_key='') # api\_key 配置成你自己的key
response = client.videos.generations( model="cogvideo",prompt="一个高清的指头上,一只可爱的迷你熊猫在指头上行走,像蚂蚁一样小,微缩小熊猫")
print(response)
# VideoObject(id='154817189478976948862809944839246995', model='cogvideo', video\_result=None, task\_status='PROCESSING', request\_id='8862809944839246992')
图片生成视频只需要在参数中同时传入image_url,例如:
from zhipuai import ZhipuAI
client = ZhipuAI(api_key='')
response = client.videos.generations( model="cogvideo",prompt="一架飞机(在空中旋转)",
image_url='https://img2.baidu.com/it/u=377943181,2345396925&fm=253&fmt=auto&app=120&f=JPEG?w=750&h=500')
print(response)
调用接口之后返回的是一个VideoObject对象 VideoObject(id='154817189478976948862809944839246995', model='cogvideo', video_result=None, task_status='PROCESSING', request_id='8862809944839246992')
。有一个属性,task_status,有3个状态,PROCESSING(处理中),SUCCESS(成功),FAIL(失败)。目前测试了很多,基本没有遇到过失败的。
根据返回的id,可以间歇性的去查询视频有没有生成完成。
response = client.videos.retrieve_videos_result(id="154817189478976948862814652123731589")
print(response)
如果是完成了,返回的对象video_result中会带有视频地址了VideoObject(id=None, model='cogvideo', video_result=[VideoResult(url='https://sfile.chatglm.cn/testpath/video/6abb6a0b-aea1-5360-80ea-5732d9752db1_0.mp4')], task_status='SUCCESS', request_id='8862814136727669502')
,并且task_status的状态会变成'success'。
API整体用起来是比较简单的,但是prompt怎么写呢?
一般提示词技巧中,会让这样写:提⽰词(Prompt)=(镜头语⾔+光影)+主体(主体描述)+主体运动+场景(场景描述)+(氛围)
一眼懵逼,但是其实很简单,每个名词单独举例解释一下:
- (镜头语言+光影):主要描述摄影或视频拍摄时使用的镜头技巧和光影效果。
例如:“拉镜头+明亮的自然光”。也就是告诉模型需要展现出摄像机从近景逐渐拉远到远景,同时场景中的光线是自然且明亮的。
- 主体(主体描述):这里指的是场景中的主要角色或物体,以及对其的具体描述。
例如:“一位年轻女孩(穿着粉色连衣裙,头戴花环)”。
- 主体运动:描述主体在场景中的动作或运动状态。
例如:“快乐地奔跑在田野上”。主要描绘了主体的动态行为。
- 场景(场景描述):描述了故事或拍摄发生的环境和背景。
例如:“一片开满野花的草地(阳光透过树叶洒落,微风吹拂着花草)”。
- (氛围):描述了整个场景或画面的情感和气氛。
例如:“一种宁静与和谐的氛围”。这表达了场景中平和愉快的感觉。
按照基本公式我们可以写一个例子出来了,比如说
(特写镜头+明亮清晰的光线)+一个高清的人类指头(细节清晰可见)+一只迷你熊猫在指头上缓慢行走+人类手指的局部特写(指纹和皮肤纹理清晰,小熊猫如蚂蚁般大小在其上行走)+(一种新奇而有趣的氛围)
让模型可以生成一个在手指头上行走的小熊猫的特写镜头,让cogvideo生成视频如下:
又比如可以简单的修改,我们把主题改成玫瑰花,体现一个在雨中摇曳的玫瑰,完整提示词为(推镜头+雨后的清新空气与微光)+一朵沾满雨滴的玫瑰(花瓣更加鲜艳,绿叶更加翠绿)+在微风中轻轻摇曳+雨后的花园(四周是湿润的土壤和翠绿的植物)+(一种清新与生机盎然的氛围)
,让api生成新的视频如下:
图生视频的prompt写法会容易很多,因为图片的主体,背景都是固定的,只需要描述主体或者背景的变化,万能公式变成了 提⽰词(Prompt)=主体+运动,背景+运动 。这里测试发现,单独调试主体,或者背景的效果,比同时调整2者会更好一些,并且动物、植物、建筑、动漫人物,都生成的不错。
例如,我们输入一个飞机的图片,prompt为一架飞机(在空中缓缓下降,靠近山脊)
,这就是描述主体的运动,我们可以得到如下的生成结果:
使用gradio搭建,仅需填充api_key为自己的key,即可运行。内置了一些examples,基本都是按照第二节的公式编写,比较无脑,但是生成的视频基本不会有太大的问题~
python代码如下:
import gradio as gr
import time
from zhipuai import ZhipuAI
import requests
client = ZhipuAI(api_key='') # api\_key 配置成你自己的key
def cogvideo\_inference(prompt):
print(prompt)
response = client.videos.generations(model="cogvideo", prompt=prompt)
task_id = response.id
response = client.videos.retrieve_videos_result(id=task_id)
print(response)
task_status = response.task_status
get_cnt = 0
result_response = response
while task_status == 'PROCESSING' and get_cnt <= 40:
result_response = client.videos.retrieve_videos_result(id=task_id)
print(result_response)
task_status = result_response.task_status
if task_status == 'SUCCESS':
break
time.sleep(30)
get_cnt += 1
if result_response.video_result is not None:
url = result_response.video_result[0].url
file_name = url.split('/')[-1]
res = requests.get(url, stream=True)
with open(file_name, 'wb') as f1:
for chunk in res.iter_content(chunk_size=102400):
f1.write(chunk)
return file_name
else:
return None
def main():
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
gr.HTML(
"""
<h1 style='text-align: center'>
CogVideoX 文生视频Demo
</h1>
"""
)
gr.HTML(
"""
<h3 style='text-align: center'>
智谱AI token注册申请!
<a href='https://bigmodel.cn/' target='\_blank'>智谱开放平台</a>
</h3>
"""
)
with gr.Row():
with gr.Column():
prompt_text = gr.Textbox(
show_label=False,
placeholder="Enter prompt text here",
lines=4)
submit_button = gr.Button("Run Inference")
with gr.Column():
output_video = gr.Video()
submit_button.click(
fn=cogvideo_inference,
inputs=[prompt_text],
outputs=output_video
)
gr.Examples(
examples=[
[" (推镜头+黄昏的柔和光线)+一个孤独的旅人(身着风衣,手持行李箱)+缓缓走向远方的火车站+一个空旷的火车站台(落日的余晖洒满整个站台,铁轨延伸到视线的尽头)+(一种离别与期待的交织氛围)"],
["(特写镜头+明亮清晰的光线)+一个高清的人类指头(细节清晰可见)+一只迷你斑马在指头上缓慢行走+人类手指的局部特写(指纹和皮肤纹理清晰,小斑马如蚂蚁般大小在其上行走)+(一种新奇而有趣的氛围)"],
["(拉镜头+晨光熹微)+一位晨跑的跑者(身着运动装备,精神饱满)+在公园小径上稳步前行+清晨的公园(鸟语花香,晨光透过树叶洒落)+(一种活力与健康并存的氛围)"],
["(旋转镜头+黄昏的暖色调光线)+一对恋人(相依相偎在海边)+静静地欣赏着落日余晖+海边的沙滩(海浪轻拍岸边,夕阳渐渐下沉)+(一种浪漫与宁静交融的氛围)"],
["(特写镜头+明亮的室内光线)+一杯冒着热气的咖啡(旁边摆放着一本翻开的书)+咖啡杯中热气升腾,散发出诱人香气+安静的咖啡馆角落(窗外是繁忙的街道,窗内是静谧的阅读空间)+(一种悠闲与专注并存的氛围)"],
["(移镜头+蓝天白云下的自然光线)+一群孩子在草地上玩耍(欢笑声此起彼伏)+追逐嬉戏,快乐无比+开阔的绿草地(远处有小山和树林作为背景)+(一种欢乐与自由的氛围)"],
["(推镜头+雨后的清新空气与微光)+一朵沾满雨滴的玫瑰(花瓣更加鲜艳,绿叶更加翠绿)+在微风中轻轻摇曳+雨后的花园(四周是湿润的土壤和翠绿的植物)+(一种清新与生机盎然的氛围)"],
],
fn=cogvideo_inference,
inputs=[prompt_text],
outputs=[output_video],
cache_examples=False,
)
demo.launch(debug=True)
if __name__ == "\_\_main\_\_":
main()