Spaces:
Runtime error
Runtime error
import os, io, base64, tempfile, requests | |
import gradio as gr | |
from PIL import Image | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 1. νκ²½ λ³μ & HF Inference API μ€μ | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
HF_TOKEN = os.getenv("HF_TOKEN") | |
if not HF_TOKEN: | |
raise RuntimeError("HF_TOKEN λΉλ° κ°μ΄ μ€μ λμ΄ μμ§ μμ΅λλ€. Spaces Settings β Secretsμμ λ±λ‘ν΄ μ£ΌμΈμ.") | |
HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"} | |
CAPTION_API = "https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-base" | |
MUSIC_API = "https://api-inference.huggingface.co/models/facebook/musicgen-small" | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 2. μ΄λ―Έμ§ μΊ‘μ μμ± (BLIP-base via API) | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def generate_caption(image_pil: Image.Image) -> str: | |
buf = io.BytesIO() | |
image_pil.save(buf, format="PNG") | |
buf.seek(0) | |
# binary upload λ°©μ | |
response = requests.post(CAPTION_API, headers=HEADERS, data=buf.getvalue(), timeout=60) | |
response.raise_for_status() | |
result = response.json() | |
# API μλ΅: [{"generated_text": "..."}] | |
return result[0]["generated_text"] | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 3. MusicGen-small μμ μμ± (10μ΄, via API) | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def generate_music(prompt: str, duration: int = 10) -> str: | |
payload = {"inputs": prompt, "parameters": {"duration": duration}} | |
response = requests.post(MUSIC_API, headers=HEADERS, json=payload, timeout=120) | |
response.raise_for_status() | |
# API μλ΅μ WAV λ°μ΄λ리 | |
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav") | |
tmp.write(response.content) | |
tmp.close() | |
return tmp.name | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 4. μ 체 νμ΄νλΌμΈ | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def process(image): | |
caption = generate_caption(image) | |
audio = generate_music(f"A cheerful melody inspired by: {caption}") | |
return caption, audio | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 5. Gradio μΈν°νμ΄μ€ | |
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 5. Gradio μΈν°νμ΄μ€ ββββββββββββββββββββββββββββββββββββββ | |
demo = gr.Interface( | |
fn=process, | |
inputs=gr.Image(type="pil"), | |
outputs=[ | |
gr.Text(label="AIκ° μμ±ν κ·Έλ¦Ό μ€λͺ "), | |
gr.Audio(label="μμ±λ AI μμ (MusicGen)") | |
], | |
title="π¨ AI κ·Έλ¦Ό-μμ μμ±κΈ° (Inference API λ²μ )", | |
description="μ΄λ―Έμ§λ₯Ό μ λ‘λνλ©΄ BLIP-baseκ° μ€λͺ μ μμ±νκ³ , " | |
"ν΄λΉ μ€λͺ μΌλ‘ MusicGen-smallμ΄ 10μ΄ μμ μ λ§λλλ€.", | |
# concurrency_count=1 β β μμ | |
queue=True # (μ ν) λμ μμ²μ νμνλ €λ©΄ μ΄λ κ²λ§ λμΈμ | |
# cache_examples=False # νμνλ©΄ μ μ§ | |
) | |
if __name__ == "__main__": | |
demo.launch() | |