sora / app.py
claudiobxdai's picture
Update app.py
b2d3f30 verified
import os
import subprocess
import gradio as gr
import time
# Variabile di controllo per il setup
SETUP_COMPLETED = False
def perform_setup():
global SETUP_COMPLETED
if SETUP_COMPLETED:
return "Setup già completato", True
try:
# Clona il repository
if not os.path.exists("Open-Sora"):
os.system("git clone https://github.com/hpcaitech/Open-Sora")
# Installa il pacchetto in modalità sviluppatore
os.system("cd Open-Sora && pip install -e .")
# Installa xformers con la versione appropriata
os.system("pip install xformers==0.0.27.post2 --index-url https://download.pytorch.org/whl/cu118")
# Scarica il modello
if not os.path.exists("ckpts"):
os.system("mkdir -p ckpts")
os.system("huggingface-cli download hpcai-tech/Open-Sora-v2 --local-dir ./ckpts")
SETUP_COMPLETED = True
return "Setup completato con successo!", True
except Exception as e:
return f"Errore durante il setup: {str(e)}", False
def generate_video(prompt, setup_first=True):
# Esegui il setup se necessario
if setup_first and not SETUP_COMPLETED:
status, success = perform_setup()
if not success:
return status, None
try:
# Crea directory per gli output
if not os.path.exists("outputs"):
os.makedirs("outputs")
# ID univoco per l'output
timestamp = int(time.time())
output_dir = f"outputs/video_{timestamp}"
os.makedirs(output_dir, exist_ok=True)
# Prepara il comando (modifica la configurazione per disabilitare flash-attn)
cmd = f"cd Open-Sora && python -m scripts.diffusion.inference configs/diffusion/inference/256px.py --prompt \"{prompt}\" --save-dir ../{output_dir} --model.use-flash-attn=False"
print(f"Esecuzione comando: {cmd}")
result = os.system(cmd)
if result != 0:
return "Errore durante la generazione del video. Controlla i log.", None
# Cerca il video generato
video_files = [os.path.join(output_dir, f) for f in os.listdir(output_dir) if f.endswith(".mp4")]
if not video_files:
return "Nessun video generato trovato", None
# Prendi il più recente
video_path = sorted(video_files, key=lambda x: os.path.getmtime(x), reverse=True)[0]
return "Video generato con successo!", video_path
except Exception as e:
return f"Errore: {str(e)}", None
# Interfaccia Gradio
with gr.Blocks() as demo:
gr.Markdown("# Generatore di Video con Open-Sora")
with gr.Row():
with gr.Column():
setup_button = gr.Button("Setup iniziale (esegui una volta)")
setup_output = gr.Textbox(label="Stato Setup", value="Non eseguito")
gr.Markdown("---")
prompt_input = gr.Textbox(
label="Descrivi il video che vuoi generare",
placeholder="Es. Un panda che mangia bambù in una foresta, stile cinematografico"
)
generate_btn = gr.Button("Genera Video")
with gr.Column():
status_output = gr.Textbox(label="Stato Generazione")
video_output = gr.Video(label="Video Generato")
# Collega i pulsanti alle funzioni
setup_button.click(
fn=perform_setup,
outputs=[setup_output]
)
generate_btn.click(
fn=generate_video,
inputs=[prompt_input],
outputs=[status_output, video_output]
)
# Avvia l'interfaccia
demo.launch()