WAN2.1-VACE / app.py
oKen38461's picture
app.pyで画像のアップロード処理を一時ディレクトリに保存するように変更し、動画生成と画像生成の機能を改善しました。また、download_models.shにリポジトリのクローン処理を追加し、requirements.txtに新しい依存関係を追加しました。wan_runner.pyでは、エラーハンドリングを強化し、Wan2.1とVACEのインストール確認機能を追加しました。
24d2e2b
raw
history blame
2.92 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="参照画像", type="pil")
first_img = gr.Image(label="開始画像", type="pil")
last_img = gr.Image(label="終了画像", type="pil")
btn_video = gr.Button("動画を生成")
output_video = gr.Video()
def video_ui(ref, first, last):
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:
# Save uploaded images
ref_path = f"{tmpdir}/ref.png"
first_path = f"{tmpdir}/first.png"
last_path = f"{tmpdir}/last.png"
ref.save(ref_path)
first.save(first_path)
last.save(last_path)
output = f"{uuid.uuid4().hex}.mp4"
generate_video(ref_path, first_path, last_path, output)
return output
btn_video.click(video_ui, [ref_img, first_img, last_img], output_video)
with gr.Tab("画像生成"):
ref_img2 = gr.Image(label="参照画像", type="pil")
prompt = gr.Textbox(label="画像プロンプト")
btn_image = gr.Button("画像を生成")
output_image = gr.Image()
def image_ui(ref, prompt):
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:
# Save uploaded image
ref_path = f"{tmpdir}/ref.png"
ref.save(ref_path)
output = f"{uuid.uuid4().hex}.png"
generate_image(ref_path, 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)