Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,62 +1,43 @@
|
|
1 |
-
import os,
|
2 |
import gradio as gr
|
3 |
from PIL import Image
|
|
|
4 |
|
5 |
-
#
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
15 |
|
16 |
-
|
17 |
-
# 2. μΊ‘μ
μμ± ν¨μ
|
18 |
-
# βββββββββββββββββββββββββββββββββββββββββββββββ
|
19 |
-
def generate_caption(image_pil: Image.Image) -> str:
|
20 |
-
buf = io.BytesIO()
|
21 |
-
image_pil.save(buf, format="PNG")
|
22 |
-
resp = requests.post(CAPTION_API, headers=HEADERS, data=buf.getvalue(), timeout=60)
|
23 |
-
resp.raise_for_status()
|
24 |
-
return resp.json()[0]["generated_text"]
|
25 |
-
|
26 |
-
# βββββββββββββββββββββββββββββββββββββββββββββββ
|
27 |
-
# 3. μμ
μμ± ν¨μ
|
28 |
-
# βββββββββββββββββββββββββββββββββββββββββββββββ
|
29 |
-
def generate_music(prompt: str, duration: int = 10) -> str:
|
30 |
payload = {"inputs": prompt, "parameters": {"duration": duration}}
|
31 |
-
|
32 |
-
|
33 |
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
|
34 |
-
tmp.write(
|
35 |
tmp.close()
|
36 |
return tmp.name
|
37 |
|
38 |
-
#
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
caption
|
43 |
-
audio = generate_music(f"A cheerful melody inspired by: {caption}")
|
44 |
-
return caption, audio
|
45 |
|
46 |
-
#
|
47 |
-
# 5. Gradio UI
|
48 |
-
# βββββββββββββββββββββββββββββββββββββββββββββββ
|
49 |
demo = gr.Interface(
|
50 |
fn=process,
|
51 |
inputs=gr.Image(type="pil"),
|
52 |
-
outputs=[
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
title="π¨ AI κ·Έλ¦Ό-μμ
μμ±κΈ° (Inference API)",
|
57 |
-
description="μ΄λ―Έμ§λ₯Ό μ
λ‘λνλ©΄ BLIP-baseκ° μ€λͺ
μ λ§λ€κ³ , "
|
58 |
-
"ν΄λΉ μ€λͺ
μΌλ‘ MusicGen-smallμ΄ 10μ΄ μμ
μ μμ±ν©λλ€."
|
59 |
-
).queue() # β
νμνλ©΄ μ΄λ κ² μ²΄μ΄λμΌλ‘ ν νμ±ν
|
60 |
|
61 |
if __name__ == "__main__":
|
62 |
demo.launch()
|
|
|
1 |
+
import os, tempfile, requests
|
2 |
import gradio as gr
|
3 |
from PIL import Image
|
4 |
+
from transformers import pipeline
|
5 |
|
6 |
+
# ββββββββββββββββββββββ 1. μΊ‘μ
λ νμ΄νλΌμΈ ββββββββββββββββββββββ
|
7 |
+
caption_pipe = pipeline(
|
8 |
+
"image-to-text",
|
9 |
+
model="Salesforce/blip-image-captioning-base", # tiny λͺ¨λΈλ‘ λ°κΎΈλ €λ©΄ μ¬κΈ°λ§ μμ
|
10 |
+
device=-1, # -1 β CPU, 0 μ΄μ β GPU ID (Spaces CPUλΌλ©΄ -1 μ μ§)
|
11 |
+
)
|
12 |
|
13 |
+
# ββββββββββββββββββββββ 2. MusicGen(Inf-API) βββββββββββββββββββββ
|
14 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
15 |
+
HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"}
|
16 |
+
MUSIC_API = "https://api-inference.huggingface.co/models/facebook/musicgen-small"
|
17 |
|
18 |
+
def generate_music(prompt: str, duration=10) -> str:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
payload = {"inputs": prompt, "parameters": {"duration": duration}}
|
20 |
+
r = requests.post(MUSIC_API, headers=HEADERS, json=payload, timeout=120)
|
21 |
+
r.raise_for_status()
|
22 |
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
|
23 |
+
tmp.write(r.content)
|
24 |
tmp.close()
|
25 |
return tmp.name
|
26 |
|
27 |
+
# ββββββββββββββββββββββ 3. μ 체 νμ΄νλΌμΈ ββββββββββββββββββββββ
|
28 |
+
def process(image: Image.Image):
|
29 |
+
caption = caption_pipe(image)[0]["generated_text"]
|
30 |
+
music = generate_music(f"A cheerful melody inspired by: {caption}")
|
31 |
+
return caption, music
|
|
|
|
|
32 |
|
33 |
+
# ββββββββββββββββββββββ 4. Gradio UI ββββββββββββββββββββββββββββ
|
|
|
|
|
34 |
demo = gr.Interface(
|
35 |
fn=process,
|
36 |
inputs=gr.Image(type="pil"),
|
37 |
+
outputs=[gr.Text(), gr.Audio()],
|
38 |
+
title="π¨ λ‘컬 BLIP-base + MusicGen-API",
|
39 |
+
description="CPUμμ BLIP-baseλ‘ μΊ‘μ
μ μμ±νκ³ , ν΄λΉ μΊ‘μ
μ MusicGen-small Inference APIλ‘ μ λ¬ν΄ 10μ΄ μμ
μ λ§λλλ€."
|
40 |
+
).queue()
|
|
|
|
|
|
|
|
|
41 |
|
42 |
if __name__ == "__main__":
|
43 |
demo.launch()
|