import gradio as gr import os import uuid import subprocess import time from threading import Thread from queue import Queue from prompt_builder import enhance_prompt job_queue = Queue() results = {} OUTPUT_DIR = "/workspace/output" os.makedirs(OUTPUT_DIR, exist_ok=True) # Worker def worker(): while True: job_id, prompt, mode = job_queue.get() try: enhanced = enhance_prompt(prompt) prompt_path = f"/tmp/{job_id}.txt" with open(prompt_path, "w") as f: f.write(enhanced) # Select pipeline script = { "base": "base/run.sh", "distill": "distill/run.sh", "sr540": "sr_540p/run.sh", "sr1080": "sr_1080p/run.sh" }[mode] cmd = f"bash MagiCompiler/example/{script}" process = subprocess.Popen(cmd, shell=True) # STREAM frames for i in range(30): fake_frame = f"/tmp/frame_{i}.png" with open(fake_frame, "wb") as f: f.write(b"") results[job_id] = { "frame": fake_frame, "status": "running" } time.sleep(0.5) process.wait() # Final outputs (replace with real paths) video_path = f"{OUTPUT_DIR}/{job_id}.mp4" audio_path = f"{OUTPUT_DIR}/{job_id}.wav" # fake output open(video_path, "wb").close() open(audio_path, "wb").close() results[job_id] = { "video": video_path, "audio": audio_path, "status": "done" } except Exception as e: results[job_id] = {"error": str(e)} job_queue.task_done() Thread(target=worker, daemon=True).start() def submit(prompt, mode): job_id = str(uuid.uuid4()) job_queue.put((job_id, prompt, mode)) return job_id def generate(prompt, mode): job_id = submit(prompt, mode) while True: if job_id in results: res = results[job_id] if res.get("status") == "running": yield res["frame"], None, None elif res.get("status") == "done": yield None, res["video"], res["audio"] break elif "error" in res: raise RuntimeError(res["error"]) time.sleep(1) # UI with gr.Blocks() as demo: gr.Markdown("# 🎬 MagiHuman AI Generator") prompt = gr.Textbox(label="Enter your prompt") mode = gr.Dropdown(["base", "distill", "sr540", "sr1080"], value="base") btn = gr.Button("Generate") frame = gr.Image(label="Live Preview") video = gr.Video(label="Final Video") audio = gr.Audio(label="Generated Audio") btn.click(generate, inputs=[prompt, mode], outputs=[frame, video, audio]) demo.queue().launch(server_name="0.0.0.0", server_port=7860)