Spaces:
Sleeping
Sleeping
reading_passage_admin
Browse files
app.py
CHANGED
@@ -770,41 +770,6 @@ def generate_reading_passage(df_string):
|
|
770 |
|
771 |
return reading_passage
|
772 |
|
773 |
-
def enable_edit_mode():
|
774 |
-
return gr.update(interactive=True)
|
775 |
-
|
776 |
-
def delete_reading_passage(video_id):
|
777 |
-
print("===delete_reading_passage===")
|
778 |
-
gcs_client = GCS_CLIENT
|
779 |
-
bucket_name = 'video_ai_assistant'
|
780 |
-
file_name = f'{video_id}_reading_passage.json'
|
781 |
-
blob_name = f"{video_id}/{file_name}"
|
782 |
-
# 检查 reading_passage 是否存在
|
783 |
-
is_file_exists = GCS_SERVICE.check_file_exists(bucket_name, blob_name)
|
784 |
-
if is_file_exists:
|
785 |
-
delete_blob(gcs_client, bucket_name, blob_name)
|
786 |
-
print("reading_passage已从GCS中删除")
|
787 |
-
return gr.update(value="", interactive=False)
|
788 |
-
|
789 |
-
def update_reading_passage(video_id, new_content):
|
790 |
-
print("===upfdate_reading_passage on gcs===")
|
791 |
-
gcs_client = GCS_CLIENT
|
792 |
-
bucket_name = 'video_ai_assistant'
|
793 |
-
file_name = f'{video_id}_reading_passage.json'
|
794 |
-
blob_name = f"{video_id}/{file_name}"
|
795 |
-
reading_passage_json = {"reading_passage": str(new_content)}
|
796 |
-
reading_passage_text = json.dumps(reading_passage_json, ensure_ascii=False, indent=2)
|
797 |
-
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, reading_passage_text)
|
798 |
-
print("reading_passage已更新到GCS")
|
799 |
-
return gr.update(value=new_content, interactive=False)
|
800 |
-
|
801 |
-
def create_reading_passage(video_id, df_string):
|
802 |
-
print("===create_reading_passage===")
|
803 |
-
content = generate_reading_passage(df_string)
|
804 |
-
update_reading_passage(video_id, content)
|
805 |
-
return gr.update(value=content, interactive=False)
|
806 |
-
|
807 |
-
|
808 |
def text_to_speech(video_id, text):
|
809 |
tts = gTTS(text, lang='en')
|
810 |
filename = f'{video_id}_reading_passage.mp3'
|
@@ -1092,6 +1057,58 @@ def change_questions(password, df_string):
|
|
1092 |
print("=====get_questions=====")
|
1093 |
return q1, q2, q3
|
1094 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1095 |
|
1096 |
# AI 生成教學素材
|
1097 |
def get_meta_data(video_id, source="gcs"):
|
@@ -1539,9 +1556,9 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
1539 |
with gr.Row():
|
1540 |
with gr.Column(scale=1):
|
1541 |
gr.Markdown("## 你也有類似的問題想問嗎?")
|
1542 |
-
btn_1 = gr.Button()
|
1543 |
-
btn_2 = gr.Button()
|
1544 |
-
btn_3 = gr.Button()
|
1545 |
gr.Markdown("## 重新生成問題")
|
1546 |
btn_create_question = gr.Button("生成其他問題", variant="primary")
|
1547 |
with gr.Column(scale=2):
|
@@ -1576,6 +1593,7 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
1576 |
ai_send_button = gr.Button("Send", variant="primary")
|
1577 |
with gr.Tab("文章模式"):
|
1578 |
with gr.Row() as reading_passage_admin:
|
|
|
1579 |
reading_passage_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
1580 |
reading_passage_update_button = gr.Button("更新", size="sm", variant="primary")
|
1581 |
reading_passage_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
@@ -1583,10 +1601,16 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
1583 |
with gr.Row():
|
1584 |
reading_passage = gr.Textbox(label="Reading Passage", lines=40, show_label=False)
|
1585 |
reading_passage_speak_button = gr.Button("Speak", visible=False)
|
1586 |
-
reading_passage_audio_output = gr.Audio(label="Audio Output", visible=False)
|
1587 |
-
|
1588 |
with gr.Tab("重點摘要"):
|
1589 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1590 |
with gr.Tab("教學備課"):
|
1591 |
with gr.Row():
|
1592 |
content_subject = gr.Dropdown(label="選擇主題", choices=["數學", "自然", "國文", "英文", "社會","物理", "化學", "生物", "地理", "歷史", "公民"], value="", visible=False)
|
@@ -1795,13 +1819,13 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
1795 |
|
1796 |
# reading_passage event
|
1797 |
reading_passage_create_button.click(
|
1798 |
-
|
1799 |
-
inputs=[video_id, df_string_output],
|
1800 |
outputs=[reading_passage]
|
1801 |
)
|
1802 |
reading_passage_delete_button.click(
|
1803 |
-
|
1804 |
-
inputs=[video_id],
|
1805 |
outputs=[reading_passage]
|
1806 |
)
|
1807 |
reading_passage_edit_button.click(
|
@@ -1810,11 +1834,33 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
1810 |
outputs=[reading_passage]
|
1811 |
)
|
1812 |
reading_passage_update_button.click(
|
1813 |
-
|
1814 |
-
inputs=[video_id, reading_passage],
|
1815 |
outputs=[reading_passage]
|
1816 |
)
|
1817 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1818 |
# 教師版
|
1819 |
worksheet_content_btn.click(
|
1820 |
get_ai_content,
|
|
|
770 |
|
771 |
return reading_passage
|
772 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
773 |
def text_to_speech(video_id, text):
|
774 |
tts = gTTS(text, lang='en')
|
775 |
filename = f'{video_id}_reading_passage.mp3'
|
|
|
1057 |
print("=====get_questions=====")
|
1058 |
return q1, q2, q3
|
1059 |
|
1060 |
+
# ---- LLM CRUD ----
|
1061 |
+
def enable_edit_mode():
|
1062 |
+
return gr.update(interactive=True)
|
1063 |
+
|
1064 |
+
def delete_LLM_content(video_id, kind):
|
1065 |
+
print(f"===delete_{kind}===")
|
1066 |
+
gcs_client = GCS_CLIENT
|
1067 |
+
bucket_name = 'video_ai_assistant'
|
1068 |
+
file_name = f'{video_id}_{kind}.json'
|
1069 |
+
blob_name = f"{video_id}/{file_name}"
|
1070 |
+
# 检查 reading_passage 是否存在
|
1071 |
+
is_file_exists = GCS_SERVICE.check_file_exists(bucket_name, blob_name)
|
1072 |
+
if is_file_exists:
|
1073 |
+
delete_blob(gcs_client, bucket_name, blob_name)
|
1074 |
+
print("reading_passage已从GCS中删除")
|
1075 |
+
return gr.update(value="", interactive=False)
|
1076 |
+
|
1077 |
+
def update_LLM_content(video_id, new_content, kind):
|
1078 |
+
print(f"===upfdate kind on gcs===")
|
1079 |
+
gcs_client = GCS_CLIENT
|
1080 |
+
bucket_name = 'video_ai_assistant'
|
1081 |
+
file_name = f'{video_id}_{kind}.json'
|
1082 |
+
blob_name = f"{video_id}/{file_name}"
|
1083 |
+
|
1084 |
+
if kind == "reading_passage":
|
1085 |
+
reading_passage_json = {"reading_passage": str(new_content)}
|
1086 |
+
reading_passage_text = json.dumps(reading_passage_json, ensure_ascii=False, indent=2)
|
1087 |
+
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, reading_passage_text)
|
1088 |
+
elif kind == "summary":
|
1089 |
+
summary_json = {"summary": str(new_content)}
|
1090 |
+
summary_text = json.dumps(summary_json, ensure_ascii=False, indent=2)
|
1091 |
+
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, summary_text)
|
1092 |
+
elif kind == "mind_map":
|
1093 |
+
mind_map_json = {"mind_map": str(new_content)}
|
1094 |
+
mind_map_text = json.dumps(mind_map_json, ensure_ascii=False, indent=2)
|
1095 |
+
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, mind_map_text)
|
1096 |
+
|
1097 |
+
print(f"{kind} 已更新到GCS")
|
1098 |
+
return gr.update(value=new_content, interactive=False)
|
1099 |
+
|
1100 |
+
def create_LLM_content(video_id, df_string, kind):
|
1101 |
+
print(f"===create_{kind}===")
|
1102 |
+
if kind == "reading_passage":
|
1103 |
+
content = generate_reading_passage(df_string)
|
1104 |
+
elif kind == "summary":
|
1105 |
+
content = generate_summarise(df_string)
|
1106 |
+
elif kind == "mind_map":
|
1107 |
+
content = generate_mind_map(df_string)
|
1108 |
+
|
1109 |
+
update_LLM_content(video_id, content, kind)
|
1110 |
+
return gr.update(value=content, interactive=False)
|
1111 |
+
|
1112 |
|
1113 |
# AI 生成教學素材
|
1114 |
def get_meta_data(video_id, source="gcs"):
|
|
|
1556 |
with gr.Row():
|
1557 |
with gr.Column(scale=1):
|
1558 |
gr.Markdown("## 你也有類似的問題想問嗎?")
|
1559 |
+
btn_1 = gr.Button("問題一")
|
1560 |
+
btn_2 = gr.Button("問題一")
|
1561 |
+
btn_3 = gr.Button("問題一")
|
1562 |
gr.Markdown("## 重新生成問題")
|
1563 |
btn_create_question = gr.Button("生成其他問題", variant="primary")
|
1564 |
with gr.Column(scale=2):
|
|
|
1593 |
ai_send_button = gr.Button("Send", variant="primary")
|
1594 |
with gr.Tab("文章模式"):
|
1595 |
with gr.Row() as reading_passage_admin:
|
1596 |
+
reading_passage_kind = gr.Textbox(value="reading_passage")
|
1597 |
reading_passage_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
1598 |
reading_passage_update_button = gr.Button("更新", size="sm", variant="primary")
|
1599 |
reading_passage_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
|
|
1601 |
with gr.Row():
|
1602 |
reading_passage = gr.Textbox(label="Reading Passage", lines=40, show_label=False)
|
1603 |
reading_passage_speak_button = gr.Button("Speak", visible=False)
|
1604 |
+
reading_passage_audio_output = gr.Audio(label="Audio Output", visible=False)
|
|
|
1605 |
with gr.Tab("重點摘要"):
|
1606 |
+
with gr.Row() as summary_admmin:
|
1607 |
+
summary_kind = gr.Textbox(value="summary")
|
1608 |
+
summary_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
1609 |
+
summary_update_button = gr.Button("更新", size="sm", variant="primary")
|
1610 |
+
summary_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
1611 |
+
summary_create_button = gr.Button("建立", size="sm", variant="primary")
|
1612 |
+
with gr.Row():
|
1613 |
+
df_summarise = gr.Textbox(container=True, show_copy_button=True, lines=40, show_label=False)
|
1614 |
with gr.Tab("教學備課"):
|
1615 |
with gr.Row():
|
1616 |
content_subject = gr.Dropdown(label="選擇主題", choices=["數學", "自然", "國文", "英文", "社會","物理", "化學", "生物", "地理", "歷史", "公民"], value="", visible=False)
|
|
|
1819 |
|
1820 |
# reading_passage event
|
1821 |
reading_passage_create_button.click(
|
1822 |
+
create_LLM_content,
|
1823 |
+
inputs=[video_id, df_string_output, reading_passage_kind],
|
1824 |
outputs=[reading_passage]
|
1825 |
)
|
1826 |
reading_passage_delete_button.click(
|
1827 |
+
delete_LLM_content,
|
1828 |
+
inputs=[video_id, reading_passage_kind],
|
1829 |
outputs=[reading_passage]
|
1830 |
)
|
1831 |
reading_passage_edit_button.click(
|
|
|
1834 |
outputs=[reading_passage]
|
1835 |
)
|
1836 |
reading_passage_update_button.click(
|
1837 |
+
update_LLM_content,
|
1838 |
+
inputs=[video_id, reading_passage, reading_passage_kind],
|
1839 |
outputs=[reading_passage]
|
1840 |
)
|
1841 |
|
1842 |
+
# summary event
|
1843 |
+
summary_create_button.click(
|
1844 |
+
create_LLM_content,
|
1845 |
+
inputs=[video_id, df_string_output, summary_kind],
|
1846 |
+
outputs=[df_summarise]
|
1847 |
+
)
|
1848 |
+
summary_delete_button.click(
|
1849 |
+
delete_LLM_content,
|
1850 |
+
inputs=[video_id, summary_kind],
|
1851 |
+
outputs=[df_summarise]
|
1852 |
+
)
|
1853 |
+
summary_edit_button.click(
|
1854 |
+
enable_edit_mode,
|
1855 |
+
inputs=[],
|
1856 |
+
outputs=[df_summarise]
|
1857 |
+
)
|
1858 |
+
summary_update_button.click(
|
1859 |
+
update_LLM_content,
|
1860 |
+
inputs=[video_id, df_summarise, summary_kind],
|
1861 |
+
outputs=[df_summarise]
|
1862 |
+
)
|
1863 |
+
|
1864 |
# 教師版
|
1865 |
worksheet_content_btn.click(
|
1866 |
get_ai_content,
|