hyejavideo / app.py
seawolf2357's picture
Update app.py
5a686c9
raw
history blame
3.52 kB
import gradio as gr
import requests
import time
API_HOME = 'https://api.fliki.ai/v1'
END_GENERATE = '/generate'
END_STATUS = '/generate/status'
API_KEY = 'ZZUIQ4OZASNRQ8B8WYHNW'
def set_header():
header = {
"Content-Type": "application/json",
"Authorization": "Bearer " + API_KEY,
}
return header
# ๋น„๋””์˜ค ๋˜๋Š” ์˜ค๋””์˜ค ์ปจํ…์ธ  ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
def generate_contents(user_content, brand_name, aspect_ratio='landscape'):
url = API_HOME + END_GENERATE
VOICE_ID = '64ea14306a00ac991dcb8a3f' # Korean, Korea, Wolf Sea
# ๋ฉ€ํ‹ฐ ๋ผ์ธ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ์ค„์„ ๋ณ„๋„์˜ ์”ฌ์œผ๋กœ ์ฒ˜๋ฆฌ
scenes = [{"content": line.strip(), "voiceId": VOICE_ID} for line in user_content.split('\n') if line.strip()]
payload = {
"format": "video", # video | audio
"scenes": scenes,
"settings": {
'aspectRatio': aspect_ratio,
'subtitle': {
'fontColor': 'yellow',
'backgroundColor': 'black',
'placement': 'bottom',
'display': 'phrase',
},
},
"backgroundMusicKeywords": "happy, lofi, beats"
}
headers = set_header()
response = requests.request("POST", url, json=payload, headers=headers).json()
if response['success']:
return response['data']['id']
else:
return 'FAILED'
# ์ปจํ…์ธ  ์ƒ์„ฑ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
def generate_status(content_id):
url = API_HOME + END_STATUS
payload = {"id": content_id}
headers = set_header()
while True:
response = requests.request("POST", url, json=payload, headers=headers).json()
if response['success']:
status = response['data']['status']
if status == 'queued' or status == 'processing':
time.sleep(10) # 10์ดˆ ๋Œ€๊ธฐ
elif status == 'success':
return response['data']['file']
else:
break
return 'FAILED'
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜
def gradio_generate_contents(user_content, brand_name, aspect_ratio):
return generate_contents(user_content, brand_name, aspect_ratio)
def gradio_generate_status(content_id):
download_url = generate_status(content_id)
if download_url != 'FAILED':
display_text = download_url[:10] + '...' if len(download_url) > 10 else download_url
html_link = f'<a href="{download_url}" target="_blank">{display_text}</a>'
html_video = f'<iframe src="{download_url}" width="640" height="360" frameborder="0" allowfullscreen></iframe>'
return html_link + '<br>' + html_video
else:
return "์ปจํ…์ธ  ์ƒ์„ฑ ์‹คํŒจ ๋˜๋Š” ID๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
# ์ปจํ…์ธ  ์ƒ์„ฑ ์ธํ„ฐํŽ˜์ด์Šค
iface_create = gr.Interface(
fn=gradio_generate_contents,
inputs=[
gr.TextArea(label="์ปจํ…์ธ  ํ…์ŠคํŠธ"),
gr.Textbox(label="๋ธŒ๋žœ๋“œ๋ช…"),
gr.Dropdown(label="ํ™”๋ฉด ๋น„์œจ", choices=['portrait', 'square', 'landscape'], value='landscape')
],
outputs=gr.Textbox(label="์ปจํ…์ธ  ID")
)
# ์ƒํƒœ ํ™•์ธ ๋ฐ ๋น„๋””์˜ค ๋‹ค์šด๋กœ๋“œ ์ธํ„ฐํŽ˜์ด์Šค
iface_status = gr.Interface(
fn=gradio_generate_status,
inputs=gr.Textbox(label="์ปจํ…์ธ  ID"),
outputs=gr.HTML(label="๋‹ค์šด๋กœ๋“œ ๋งํฌ ๋ฐ ๋น„๋””์˜ค")
)
# ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒญ์œผ๋กœ ๊ตฌ์„ฑ
iface_combined = gr.TabbedInterface([iface_create, iface_status], ["์ปจํ…์ธ  ์ƒ์„ฑ", "์ƒํƒœ ํ™•์ธ ๋ฐ ๋‹ค์šด๋กœ๋“œ"])
iface_combined.launch()