CoolFace
Apppublic

DynamicScene/DynamicGeneration

sourceHugging Faceupdated 2y agoView on Hugging Face
8likes
app.py122 linesDownload Raw Back to root
1from generate_person import init_display_person_dataframe, schedule_to_df, update_schedules, visualize_person_info2from generate_scene import person_info_to_description, reset_person_page, visualize_dynamic_generate, person_info_to_elements3from io import BytesIO4import pickle5from utils import read_character6import gradio as gr7from pathlib import Path8 9def add_character_click(character_file: str, person_name_to_file: dict[str, list[str|Path|dict]], person_name_to_info: dict[str, dict], person_name_to_description: dict[str, str], *reset_inputs):10    # we can test this by add person and check if it is one the person choice dropdown11    character_dict = pickle.load(open(character_file, 'rb'))12    _, person_info, _ = read_character(character_dict)13    person_name = person_info['name']14    person_name_to_file[person_name] = character_dict15    person_name_to_info[person_name] = person_info16    person_name_to_description[person_name] = person_info_to_description(person_info)17    return [18        person_name_to_file, person_name_to_info, person_name_to_description, gr.update(choices=sorted(person_name_to_description.values())), gr.update(visible=False)19    ] + reset_person_page(*reset_inputs)20 21 22def display_person_file(person_description_dropdown: str, person_name_to_file: dict[str, list[str|Path|dict]], person_name_to_info: dict[str, dict], person_name_to_description: dict[str, str]):23    # get person name24    person_name = [person_name for person_name, description in person_name_to_description.items() if description == person_description_dropdown][0]25    # get person file26    person_file = person_name_to_file[person_name]27    _, _, schedules = read_character(person_file)28    schedule_updates = update_schedules(schedules)29    30    person_info = person_name_to_info[person_name]31    return list(person_info_to_elements(person_info)) + schedule_updates32    33def create_person_page():34    with gr.Row(visible=False) as row:35        image = gr.Image(width=200, scale=0.25, show_label=False, interactive=False)36        with gr.Column():37            name = gr.Markdown()38            age = gr.Markdown()39            gender = gr.Markdown()40            personality = gr.Markdown()41            routine = gr.Markdown()42    return row, (image, name, age, gender, personality, routine)43 44def person_info_page(person_name_to_file: gr.State, person_name_to_info: gr.State, person_name_to_description: gr.State):45    with gr.Blocks():46        upload_button = gr.UploadButton()47        person_description_dropdown = gr.Dropdown(label="Person Description", choices=sorted(person_name_to_description.value.values()))48        person_row, person_elements = create_person_page()49        schedule_df_list, schedule_tab_list = init_display_person_dataframe()50    person_description_dropdown.change(51        fn=display_person_file,52        inputs=[person_description_dropdown, person_name_to_file, person_name_to_info, person_name_to_description],53        outputs=list(person_elements) + schedule_df_list + schedule_tab_list,54    )55    person_description_dropdown.change(56        fn=lambda : gr.update(visible=True),57        outputs=[person_row],58    )59    return person_description_dropdown, upload_button60 61 62def visualize():63    with gr.Blocks() as demo:64        with gr.Tab("Create Person"):65            add_character_button, character_file, person_name_to_file, person_name_to_info, person_name_to_description = visualize_person_info()66        with gr.Tab("Person Info"):67            person_description_dropdown, upload_button = person_info_page(person_name_to_file, person_name_to_info, person_name_to_description)68        with gr.Tab("Generate Scene"):69            reset_inputs, reset_outputs = visualize_dynamic_generate(person_name_to_file, person_name_to_info, person_name_to_description)70        add_character_button.click(71            fn=add_character_click,72            inputs=[character_file, person_name_to_file, person_name_to_info, person_name_to_description] + reset_inputs,73            outputs=[person_name_to_file, person_name_to_info, person_name_to_description, person_description_dropdown, add_character_button] + reset_outputs74        )75        upload_button.upload(76            fn=add_character_click,77            inputs=[upload_button, person_name_to_file, person_name_to_info, person_name_to_description] + reset_inputs,78            outputs=[person_name_to_file, person_name_to_info, person_name_to_description, person_description_dropdown, add_character_button] + reset_outputs79        )80    demo.launch()81 82if __name__ == "__main__":83    # with gr.Blocks() as demo:84    #     with gr.Tab("Create Person"):85    #         visualize_person_info()86    #     with gr.Tab("Generate Scene"):87    #         visualize_dynamic_generate()88    visualize()89 90# your_dictionary = {91#     'key1': 'value1',92#     'key2': 'value2',93#     'key3': 'value3'94# }95 96# # 将字典序列化为 pickle 格式的 bytes 对象97# def serialize_dictionary_to_bytes_obj(dictionary):98#     # 使用 pickle 将字典序列化为 bytes 对象99#     pickle_bytes = pickle.dumps(dictionary)100    101#     # 返回 bytes 对象和文件名102#     return pickle_bytes103 104 105# def process_and_return_file_path(dictionary):106#     # 创建一个临时文件,该文件在关闭时会被自动删除107#     with tempfile.NamedTemporaryFile(delete=False) as tmp_file:108#         # 向临时文件写入数据109#         tmp_file.write(serialize_dictionary_to_bytes_obj(dictionary))110#         # 获取临时文件的路径111#         temp_file_path = tmp_file.name112        113#     # 返回文件路径114#     # 注意:这里我们不关闭文件,因为我们需要文件路径有效115#     # 但这意味着文件在操作系统级别不会自动删除,需要手动管理116#     return temp_file_path117 118# with gr.Blocks() as demo:119#     file_path = process_and_return_file_path(your_dictionary)120#     gr.File(file_path, label="Download File")121# demo.launch()122