WAN2.1-VACE / app.py
oKen38461's picture
README.mdを更新し、Wan2.1 VACE顔保持動画生成システムの詳細を追加しました。プロジェクトの概要、主な機能、技術仕様、使い方、インストール手順、ライセンス情報を含め、SDKバージョンを4.0.0に変更しました。
725a76b
raw
history blame
2.19 kB
import gradio as gr
from fastapi import FastAPI, UploadFile, File
import uvicorn, uuid, os
from wan_runner import generate_video, generate_image
api = FastAPI()
@api.post("/generate_video")
async def api_generate_video(ref: UploadFile = File(...), first: UploadFile = File(...), last: UploadFile = File(...)):
uid = uuid.uuid4().hex
os.makedirs(uid, exist_ok=True)
paths = [f"{uid}/{name}" for name in ["ref.png", "first.png", "last.png"]]
for upload, path in zip([ref, first, last], paths):
with open(path, "wb") as f:
f.write(await upload.read())
output = f"{uid}/output.mp4"
generate_video(*paths, output)
return {"video_path": output}
@api.post("/generate_image")
async def api_generate_image(ref: UploadFile = File(...), prompt: str = ""):
uid = uuid.uuid4().hex
os.makedirs(uid, exist_ok=True)
ref_path = f"{uid}/ref.png"
with open(ref_path, "wb") as f:
f.write(await ref.read())
output = f"{uid}/output.png"
generate_image(ref_path, prompt, output)
return {"image_path": output}
with gr.Blocks() as demo:
with gr.Tab("動画生成"):
ref_img = gr.Image(label="参照画像")
first_img = gr.Image(label="開始画像")
last_img = gr.Image(label="終了画像")
btn_video = gr.Button("動画を生成")
output_video = gr.Video()
def video_ui(ref, first, last):
output = f"{uuid.uuid4().hex}.mp4"
generate_video(ref, first, last, output)
return output
btn_video.click(video_ui, [ref_img, first_img, last_img], output_video)
with gr.Tab("画像生成"):
ref_img2 = gr.Image(label="参照画像")
prompt = gr.Textbox(label="画像プロンプト")
btn_image = gr.Button("画像を生成")
output_image = gr.Image()
def image_ui(ref, prompt):
output = f"{uuid.uuid4().hex}.png"
generate_image(ref, prompt, output)
return output
btn_image.click(image_ui, [ref_img2, prompt], output_image)
app = gr.mount_gradio_app(api, demo, path="/")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)