Spaces:
Running
Running
import gradio as gr | |
from src.GameMaster import GameMaster | |
import os | |
from src.resize_img import resize_image, get_img_html | |
from src.fishTTS import get_audio | |
yaml_path = "config/police.yaml" | |
def create_game_master(): | |
return GameMaster(yaml_path) | |
class SessionState: | |
def __init__(self): | |
self.game_master = create_game_master() | |
self.item_str_list = self.game_master.get_item_names() | |
self.welcome_info = self.game_master.get_welcome_info() | |
def callback_generate_audio(chatbot): | |
if len(chatbot) == 0: | |
return None | |
response_message = chatbot[-1][1] | |
audio_path = get_audio(response_message) | |
return gr.update(value=audio_path, autoplay=True) | |
def chat_submit_callback(user_message, chat_history, state: SessionState): | |
if user_message.strip(): | |
user_input, bot_response = state.game_master.submit_chat(user_message) | |
chat_history.append((user_input, bot_response)) | |
return chat_history, "" | |
def item_submit_callback(item_name, chat_history, state: SessionState): | |
if not item_name.strip(): | |
return chat_history, "" | |
user_info, response_info = state.game_master.submit_item(item_name) | |
img_path = state.game_master.name2img_path(item_name) | |
if img_path and os.path.exists(img_path): | |
resized_img = resize_image(img_path, max_height=200) | |
img_html = get_img_html(resized_img) | |
user_info = gr.HTML(img_html) | |
chat_history.append((user_info, response_info)) | |
return chat_history, "" | |
def img_submit_callback(image_input, chatbot, state: SessionState): | |
if image_input: | |
resized_img_to_rec = resize_image(image_input, max_height=400) | |
resized_img = resize_image(image_input, max_height=200) | |
img_html = get_img_html(resized_img) | |
user_info, response = state.game_master.submit_image(resized_img_to_rec) | |
chatbot.append((gr.HTML(img_html), response)) | |
return chatbot | |
def update_status_show(state: SessionState): | |
return state.game_master.get_status() | |
def reload_game(state: SessionState): | |
state.game_master = create_game_master() | |
return [(None, state.game_master.get_welcome_info())], state.game_master.get_status() | |
css = """ | |
.chatbot img { | |
max-height: 200px !important; | |
width: auto !important; | |
}""" | |
with gr.Blocks(title="鲸娱秘境-Intel参赛", css=css) as demo: | |
state = gr.State(SessionState()) | |
with gr.Tabs() as tabs: | |
with gr.TabItem("demo"): | |
gr.Markdown("# 鲸娱秘境-英特尔人工智能创新应用") | |
gr.Markdown('欢迎大家在点评搜索"鲸娱秘境",线上demo为游戏环节一部分,并加入多模态元素') | |
with gr.Row(): | |
with gr.Column(scale=2): | |
chatbot = gr.Chatbot(label="对话窗口", height=800, value=lambda: [(None, state.value.welcome_info)] if hasattr(state, 'value') else [(None, "")]) | |
user_input = gr.Textbox(label="输入消息", placeholder="请输入您的消息...", interactive=True) | |
send_btn = gr.Button("发送", variant="primary") | |
with gr.Column(scale=1): | |
with gr.Row(): | |
radio_choices = gr.Radio(label="向NPC提交场景中的物品", | |
choices=[], | |
value="生成描述", interactive=True) | |
with gr.Row(): | |
item_submit_btn = gr.Button("提交场景内的物品", variant="primary") | |
image_input = gr.Image(type="filepath", label="上传图片") | |
with gr.Row(): | |
img_submit_btn = gr.Button("提交图片中的物品", variant="primary") | |
with gr.Row(): | |
reload_btn = gr.Button("重置剧情", variant="primary") | |
with gr.Row(): | |
audio_player = gr.Audio() | |
with gr.Accordion("For debug", open=False): | |
with gr.Row(): | |
item_text_to_submit = gr.Textbox(label="直接输入物品名", value="", interactive=True, scale=20) | |
item_text_submit_btn = gr.Button("提交", variant="primary", scale=1) | |
status_display = gr.Textbox(label="agent状态显示", interactive=False, max_lines=3) | |
send_btn.click(chat_submit_callback, [user_input, chatbot, state], [chatbot, user_input]) | |
user_input.submit(chat_submit_callback, [user_input, chatbot, state], [chatbot, user_input]) | |
img_submit_btn.click( | |
fn=img_submit_callback, | |
inputs=[image_input, chatbot, state], | |
outputs=[chatbot] | |
).then( | |
fn=update_status_show, | |
inputs=[state], | |
outputs=[status_display] | |
).then( | |
fn=callback_generate_audio, | |
inputs=[chatbot], | |
outputs=[audio_player] | |
) | |
item_submit_btn.click( | |
fn=item_submit_callback, | |
inputs=[radio_choices, chatbot, state], | |
outputs=[chatbot, radio_choices] | |
).then( | |
fn=update_status_show, | |
inputs=[state], | |
outputs=[status_display] | |
).then( | |
fn=callback_generate_audio, | |
inputs=[chatbot], | |
outputs=[audio_player] | |
) | |
item_text_submit_btn.click( | |
fn=item_submit_callback, | |
inputs=[item_text_to_submit, chatbot, state], | |
outputs=[chatbot, item_text_to_submit] | |
).then( | |
fn=update_status_show, | |
inputs=[state], | |
outputs=[status_display] | |
).then( | |
fn=callback_generate_audio, | |
inputs=[chatbot], | |
outputs=[audio_player] | |
) | |
reload_btn.click( | |
fn=reload_game, | |
inputs=[state], | |
outputs=[chatbot, status_display] | |
) | |
def update_radio_choices(state: SessionState): | |
return gr.update(choices=state.item_str_list) | |
demo.load( | |
fn=update_radio_choices, | |
inputs=[state], | |
outputs=[radio_choices] | |
) | |
def update_chatbot(state: SessionState): | |
return gr.update(value=[(None, state.welcome_info)]) | |
demo.load( | |
fn=update_chatbot, | |
inputs=[state], | |
outputs=[chatbot] | |
) | |
with gr.TabItem("Readme"): | |
with open("demo_info.md", "r", encoding="utf-8") as f: | |
readme_content = f.read() | |
gr.Markdown(readme_content) | |
if __name__ == "__main__": | |
demo.launch(share=True) |