Spaces:
Running
Running
import gradio as gr | |
import requests | |
import os | |
import zipfile | |
API_URL = "https://api-inference.huggingface.co/models/stabilityai/TripoSR" | |
HEADERS = {"Authorization": f"Bearer {os.environ.get('HF_TOKEN')}"} | |
def generate_3d_from_image(image): | |
with open(image, "rb") as f: | |
response = requests.post(API_URL, headers=HEADERS, files={"file": f}) | |
if response.status_code == 200: | |
output_zip = "model_output.zip" | |
with open(output_zip, "wb") as out_file: | |
out_file.write(response.content) | |
# Intentar extraer un archivo .glb o .ply desde el zip | |
with zipfile.ZipFile(output_zip, 'r') as zip_ref: | |
zip_ref.extractall("output_model") | |
for filename in zip_ref.namelist(): | |
if filename.endswith(".glb") or filename.endswith(".ply"): | |
return os.path.join("output_model", filename) | |
raise gr.Error("El modelo no generó un archivo .glb o .ply compatible.") | |
else: | |
raise gr.Error(f"Error {response.status_code}: {response.text}") | |
with gr.Blocks() as demo: | |
gr.Markdown("## 🧠 Genera un modelo 3D real desde una imagen usando TripoSR") | |
with gr.Row(): | |
image_input = gr.Image(type="filepath", label="Sube una imagen (.png o .jpg)") | |
generate_btn = gr.Button("Generar modelo 3D") | |
output_model = gr.Model3D(label="Vista previa del modelo 3D") | |
generate_btn.click(fn=generate_3d_from_image, inputs=image_input, outputs=output_model) | |
demo.launch() |