Spaces:
Build error
Build error
import gradio as gr | |
from urllib.parse import quote | |
import re | |
import os | |
import openai | |
from gradio_client import Client | |
OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY') | |
clipi_client = Client("https://fffiloni-clip-interrogator-2.hf.space/") | |
chapter_num = 1 | |
story_intro = "" | |
current_story = "" | |
current_image_url = "" | |
chapters = [] | |
def generate_image_url(keywords): | |
truncated_keywords = keywords[:20] | |
return f"https://image.pollinations.ai/prompt/{quote(truncated_keywords)}" | |
def next_chapter(audience, keyword, protagonist): | |
global chapter_num, current_story, current_image_url | |
current_image_url = generate_image_url(current_story) | |
gr.Info(f'Chapter {chapter_num}를 생성하고 있습니다...') | |
chapter_prompt = f"{story_intro}\n\nKeyword: {keyword}\nProtagonist: {protagonist}\n\n\n\nChapter {chapter_num} 내용을 만들어줘." | |
chat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo-16k", messages=[{"role": "user", "content": chapter_prompt}]) | |
current_story = chat_completion.choices[0].message.content | |
chapters.append({"story": current_story, "image": current_image_url}) | |
chapter_num += 1 | |
chapter_table = "| 챕터 | 이야기 | 그림 |\n|------|--------|------|\n" + "\n".join([f"| {i+1} | {c['story']} |  |" for i, c in enumerate(chapters)]) | |
return current_story, current_image_url, chapter_table | |
def infer(image_input, audience, keyword, protagonist): | |
global story_intro, current_story, current_image_url, chapter_num, chapters | |
chapter_num = 1 | |
chapters = [] | |
gr.Info('Calling CLIP Interrogator, 이미지를 해석하고 있습니다...') | |
clipi_result = clipi_client.predict(image_input, "best", 4, api_name="/clipi2")[0] | |
story_intro = f""" | |
# Illustrated Tales | |
## Created by [Sigkawat Pengnoo](https://flowgpt.com/prompt/qzv2D3OvHkzkfSE4rQCqv) at FlowGPT | |
Keyword: {keyword} | |
Protagonist: {protagonist} | |
한국어로 답변해줘. | |
STORY : "{{ {clipi_result} }}" | |
Let's begin with Chapter 1! | |
""" | |
current_story = clipi_result | |
return next_chapter(audience, keyword, protagonist) | |
css = """ | |
#col-container {max-width: 910px; margin-left: auto; margin-right: auto;} | |
a {text-decoration-line: underline; font-weight: 600;} | |
""" | |
with gr.Blocks(css=css) as demo: | |
with gr.Column(elem_id="col-container"): | |
gr.Markdown( | |
""" | |
<h1 style="text-align: center">Illustrated Tales - Korean</h1> | |
<p style="text-align: center">이미지를 업로드하세요, ChatGPT를 통해 한국어로 이야기와 그림을 만들어 줍니다!</p> | |
""" | |
) | |
with gr.Row(): | |
with gr.Column(): | |
image_in = gr.Image(label="이미지 입력", type="filepath", elem_id="image-in", height=420) | |
audience = gr.Radio(label="대상", choices=["Children", "Adult"], value="Children") | |
keyword_in = gr.Textbox(label="핵심 키워드") | |
protagonist_in = gr.Textbox(label="주인공") | |
submit_btn = gr.Button('이야기와 그림을 만들어 주세요') | |
next_chapter_btn = gr.Button('다음 이야기') | |
with gr.Column(): | |
chapter_story = gr.Markdown(label="이야기", elem_id="chapter_story") | |
chapter_image = gr.Image(label="그림", elem_id="chapter_image") | |
chapter_table_md = gr.Markdown(label="모든 챕터") | |
submit_btn.click(fn=infer, inputs=[image_in, audience, keyword_in, protagonist_in], | |
outputs=[chapter_story, chapter_image, chapter_table_md]) | |
next_chapter_btn.click(fn=lambda: next_chapter(audience=audience.value, keyword=keyword_in.value, protagonist=protagonist_in.value), | |
outputs=[chapter_story, chapter_image, chapter_table_md]) | |
demo.queue(max_size=12).launch() | |