Spaces:
Running
Running
File size: 5,071 Bytes
f6bff5d 877774e 6180cc7 873869d ffcd7e6 6180cc7 0ca3860 6180cc7 0ca3860 6180cc7 ebb3019 6180cc7 13a1b41 6180cc7 13a1b41 6180cc7 ebb3019 ffcd7e6 792e10f ffcd7e6 877774e c63812d 877774e 792e10f ebb3019 877774e 0ca3860 877774e 0ca3860 877774e c63812d 877774e 803b65c 877774e 507d1b1 83cf7d1 507d1b1 803b65c 507d1b1 ffcd7e6 877774e 803b65c 877774e 803b65c 877774e d8d324a 6180cc7 ffcd7e6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
import gradio as gr
import random
from vocab import get_sources, get_words_from_source
from sentences import generate_sentences
from ai_sentence import MODEL_LIST
from quiz import generate_fill_in_blank_exam, check_exam
# ================================
# 處理邏輯:生成單字例句
# ================================
def process_sentence(mode, word, source, num, use_ai, model_name):
try:
if mode == '查詢單字':
if not word:
return "<p style='color:red;'>❌ 請輸入單字</p>", "未輸入單字"
words = [word.strip()]
elif mode == '隨機抽單字':
num = int(num)
if num <= 0:
return "<p style='color:red;'>❌ 抽取數量須大於0</p>", "數量錯誤"
words_data = get_words_from_source(source)
words = [w['word'] for w in words_data]
words = random.sample(words, num)
else:
return "<p style='color:red;'>❌ 模式錯誤</p>", "模式選擇異常"
result_display, status_log = generate_sentences(words, source, use_ai, model_name)
return result_display, status_log
except Exception as e:
return f"<p style='color:red;'>❌ 發生錯誤:{str(e)}</p>", f"錯誤:{str(e)}"
# ================================
# 專案說明段落
# ================================
def project_description():
return """
# 📖 VocabLine 單字例句工具
支援單字例句查詢,AI 自動生成句子。適合作為 LINE 單字推播、英文學習輔助工具。
## 🔍 核心功能
- 查詢單字 → 獲取例句
- 抽取單字 → 批量獲取例句
- 可選 AI 生成句子(模型:GPT2 / Pythia)
## 🧑💻 技術架構
- Gradio Blocks + Transformers (Hugging Face)
- SQLite 句庫管理
- 支援多單字庫擴展
## 📚 資料來源
- 常用 3000 單字表
- 英文例句資料庫 (Tatoeba)
## 👨💻 開發資訊
- 開發者:余彦志 (大宇 ian)
- 信箱:[email protected]
- GitHub:[https://github.com/dayuian](https://github.com/dayuian)
"""
# ================================
# 模式切換:查詢 or 抽單字
# ================================
def switch_mode(mode):
return gr.update(visible=(mode == '查詢單字')), gr.update(visible=(mode == '隨機抽單字'))
# ================================
# 切換 AI 控制區塊
# ================================
def toggle_ai_button(use_ai):
return gr.update(visible=use_ai), gr.update(visible=use_ai)
# ================================
# 介面配置
# ================================
with gr.Blocks(css="""
#card-group { padding: 15px; border-radius: 12px; background-color: rgba(255, 255, 255, 0.05); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); margin-bottom: 15px; }
.gradio-container { max-width: 800px; margin: auto; }
""") as demo:
gr.Markdown(project_description())
with gr.Group():
with gr.Row():
mode_radio = gr.Radio(
["查詢單字", "隨機抽單字"],
label="選擇模式",
value="查詢單字",
interactive=True
)
with gr.Group(elem_id="card-group"):
word_input = gr.Textbox(label="輸入單字", visible=True)
num_input = gr.Slider(minimum=1, maximum=10, value=5, step=1, label="抽取單字數量")
source_dropdown = gr.Dropdown(
choices=get_sources(),
value="common3000",
label="選擇單字庫"
)
with gr.Group(elem_id="card-group"):
use_ai_checkbox = gr.Checkbox(label="使用 AI 生成句子(較慢,約 30 秒)", elem_id="use-ai-checkbox")
with gr.Row():
model_dropdown = gr.Dropdown(
choices=MODEL_LIST,
value="gpt2",
label="選擇 AI 模型",
visible=False
)
ai_warning = gr.Textbox(
value="⚠️ 使用 AI 生成句子為功能測試,每一個單字的生成過程可能需要 30 秒以上,請耐心等待。",
visible=False,
interactive=False,
label=""
)
result_output = gr.HTML(label="結果")
status_output = gr.Textbox(label="處理狀態", interactive=False)
with gr.Row():
generate_button = gr.Button("✨ 生成句子", elem_id="generate-button")
gr.HTML("<a href='https://你的空白quiz網址' target='_blank'><button style='background-color:#ff5722;color:white;'>📝 生成小考</button></a>")
mode_radio.change(switch_mode, inputs=[mode_radio], outputs=[word_input, num_input])
use_ai_checkbox.change(toggle_ai_button, inputs=[use_ai_checkbox], outputs=[model_dropdown, ai_warning])
generate_button.click(process_sentence, inputs=[mode_radio, word_input, source_dropdown, num_input, use_ai_checkbox, model_dropdown], outputs=[result_output, status_output])
# 啟動
demo.launch() |