Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,51 +1,103 @@
|
|
1 |
import gradio as gr
|
|
|
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 |
-
f"{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
)
|
37 |
-
return prompt
|
38 |
|
|
|
|
|
|
|
|
|
|
|
39 |
css_code = """
|
40 |
body {
|
41 |
-
background-color: #
|
42 |
-
font-family: "
|
43 |
}
|
44 |
|
45 |
#title {
|
46 |
-
color: #
|
47 |
text-align: center;
|
48 |
-
font-size:
|
49 |
margin-top: 20px;
|
50 |
margin-bottom: 10px;
|
51 |
font-weight: bold;
|
@@ -60,57 +112,68 @@ body {
|
|
60 |
color: #333;
|
61 |
}
|
62 |
.monster-btn {
|
63 |
-
background-color: #
|
64 |
-
border: 2px solid #
|
65 |
font-weight: bold;
|
66 |
font-size: 1.1rem;
|
67 |
padding: 10px 20px;
|
68 |
border-radius: 10px;
|
69 |
}
|
70 |
.monster-btn:hover {
|
71 |
-
background-color: #
|
72 |
}
|
73 |
-
#prompt-
|
74 |
-
|
75 |
-
|
76 |
-
border: 2px solid #FFE0B2;
|
77 |
border-radius: 10px;
|
78 |
padding: 10px;
|
|
|
79 |
}
|
80 |
"""
|
81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
with gr.Blocks(css=css_code) as demo:
|
83 |
-
gr.Markdown("<h1 id='title'>ZenityX Monster Lab</h1>")
|
84 |
gr.Markdown(
|
85 |
"""
|
86 |
<div class="game-desc">
|
87 |
-
<p
|
88 |
-
<
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
91 |
</div>
|
92 |
"""
|
93 |
)
|
94 |
|
95 |
-
#
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
|
103 |
-
|
104 |
-
create_button = gr.Button("Activate Lab!", elem_classes="monster-btn")
|
105 |
|
106 |
-
|
107 |
-
|
108 |
|
109 |
-
# เมื่อกดปุ่ม ->
|
110 |
create_button.click(
|
111 |
-
fn=
|
112 |
-
inputs=[
|
113 |
-
outputs=
|
114 |
)
|
115 |
|
|
|
|
|
|
|
116 |
demo.launch()
|
|
|
1 |
import gradio as gr
|
2 |
+
from transformers import MarianMTModel, MarianTokenizer
|
3 |
|
4 |
+
# ==============================
|
5 |
+
# 1) โหลดโมเดลแปลภาษา (MarianMT) จาก Hugging Face
|
6 |
+
# ใช้โมเดล "Helsinki-NLP/opus-mt-th-en"
|
7 |
+
# ==============================
|
8 |
+
model_name = "Helsinki-NLP/opus-mt-th-en"
|
9 |
+
tokenizer = MarianTokenizer.from_pretrained(model_name)
|
10 |
+
model = MarianMTModel.from_pretrained(model_name)
|
11 |
+
|
12 |
+
def translate_th_to_en(th_text: str) -> str:
|
13 |
+
"""
|
14 |
+
แปลข้อความภาษาไทยเป็นอังกฤษ ใช้ MarianMTModel แบบ Offline
|
15 |
+
"""
|
16 |
+
th_text = th_text.strip()
|
17 |
+
if not th_text:
|
18 |
+
return ""
|
19 |
+
# สร้าง input token
|
20 |
+
inputs = tokenizer(th_text, return_tensors="pt", max_length=512, truncation=True)
|
21 |
+
# สร้าง output token (การแปล)
|
22 |
+
translation_tokens = model.generate(**inputs, max_length=512)
|
23 |
+
# ถอดรหัสเป็น string
|
24 |
+
en_text = tokenizer.decode(translation_tokens[0], skip_special_tokens=True)
|
25 |
+
return en_text
|
26 |
+
|
27 |
+
# ==============================
|
28 |
+
# 2) ตัวเลือก (ภาษาไทย) สำหรับมอนสเตอร์
|
29 |
+
# ==============================
|
30 |
+
body_shapes_th = [
|
31 |
+
"ตัวเหนียวขยุกขยิก", "ตัวปุกปุยกลม", "ตัวเต็มไปด้วยหนาม",
|
32 |
+
"ตัวเล็กเหมือนแมลง", "ตัวโปร่งแสงลอยได้"
|
33 |
]
|
34 |
+
heads_th = [
|
35 |
+
"หัวตาเดียว", "หัวสองเขาเหมือนมังกร", "หัวมีเขาใหญ่มาก",
|
36 |
+
"หัวผีแสยะยิ้ม", "หัวกระต่ายน่ารัก"
|
37 |
]
|
38 |
+
arms_legs_th = [
|
39 |
+
"แขนหนวดปลาหมึกและขาปลาหมึก", "แขนกลและเท้าสเก็ต",
|
40 |
+
"ปีกขนนกและอุ้งเท้าสิงโต", "แขนเรืองแสงและขายานโฮเวอร์",
|
41 |
+
"แขนไม้หุ่นเชิดและขายักษ์แมงมุม"
|
42 |
]
|
43 |
+
skin_patterns_th = [
|
44 |
+
"ลายสีรุ้ง", "จุดม่วงเรืองแสง", "เกล็ดเหล็ก",
|
45 |
+
"ขนนกวิบวับ", "จุดกลมกากเพชร"
|
46 |
]
|
47 |
+
abilities_th = [
|
48 |
+
"พ่นไฟ", "ปล่อยฟองสบู่", "ควบคุมสายฟ้า",
|
49 |
+
"ร้องเพลงกล่อม", "วาร์ประยะสั้น"
|
50 |
]
|
51 |
+
moods_th = [
|
52 |
+
"เป็นมิตร", "ขี้หงุดหงิด", "ตลกโปกฮา",
|
53 |
+
"ซนเป็นลิง", "ขี้อาย"
|
54 |
]
|
55 |
|
56 |
+
# ==============================
|
57 |
+
# 3) ฟังก์ชันสร้าง Prompt
|
58 |
+
# ==============================
|
59 |
+
def generate_monster_lab(body_th, head_th, arms_th, skin_th, ability_th, mood_th):
|
60 |
"""
|
61 |
+
สร้าง 'รายละเอียดมอนสเตอร์ (ภาษาไทย)' + Prompt ภาษาอังกฤษ
|
62 |
"""
|
63 |
+
# (a) รวมรายละเอียดมอนสเตอร์ (ภาษาไทย)
|
64 |
+
desc_th = (
|
65 |
+
f"มอนสเตอร์อารมณ์{mood_th} มี{body_th} "
|
66 |
+
f"พร้อมด้วย{head_th}, {arms_th}, "
|
67 |
+
f"ผิว/ลายแบบ{skin_th}, และพลังพิเศษคือ{ability_th}!"
|
68 |
+
)
|
69 |
+
|
70 |
+
# (b) แปลทีละส่วน
|
71 |
+
body_en = translate_th_to_en(body_th)
|
72 |
+
head_en = translate_th_to_en(head_th)
|
73 |
+
arms_en = translate_th_to_en(arms_th)
|
74 |
+
skin_en = translate_th_to_en(skin_th)
|
75 |
+
ability_en = translate_th_to_en(ability_th)
|
76 |
+
mood_en = translate_th_to_en(mood_th)
|
77 |
+
|
78 |
+
# (c) ประกอบประโยคภาษาอังกฤษง่าย ๆ
|
79 |
+
# ex: "This is a [mood_en] monster with [body_en], a [head_en], [arms_en], covered in [skin_en] skin, and it can [ability_en]!"
|
80 |
+
prompt_en = (
|
81 |
+
f"This is a {mood_en} monster with {body_en}, "
|
82 |
+
f"a {head_en}, {arms_en}, covered in {skin_en} skin, "
|
83 |
+
f"and it can {ability_en}!"
|
84 |
)
|
|
|
85 |
|
86 |
+
return desc_th, prompt_en
|
87 |
+
|
88 |
+
# ==============================
|
89 |
+
# 4) สร้าง UI (Gradio)
|
90 |
+
# ==============================
|
91 |
css_code = """
|
92 |
body {
|
93 |
+
background-color: #FFF7EA;
|
94 |
+
font-family: "Kanit", sans-serif;
|
95 |
}
|
96 |
|
97 |
#title {
|
98 |
+
color: #FF6F91;
|
99 |
text-align: center;
|
100 |
+
font-size: 2rem;
|
101 |
margin-top: 20px;
|
102 |
margin-bottom: 10px;
|
103 |
font-weight: bold;
|
|
|
112 |
color: #333;
|
113 |
}
|
114 |
.monster-btn {
|
115 |
+
background-color: #FFC107;
|
116 |
+
border: 2px solid #FFA000;
|
117 |
font-weight: bold;
|
118 |
font-size: 1.1rem;
|
119 |
padding: 10px 20px;
|
120 |
border-radius: 10px;
|
121 |
}
|
122 |
.monster-btn:hover {
|
123 |
+
background-color: #FFD54F;
|
124 |
}
|
125 |
+
#desc-th, #prompt-en {
|
126 |
+
background-color: #FFFAE6;
|
127 |
+
border: 2px solid #FFE082;
|
|
|
128 |
border-radius: 10px;
|
129 |
padding: 10px;
|
130 |
+
margin-bottom: 20px;
|
131 |
}
|
132 |
"""
|
133 |
|
134 |
+
def initial_text():
|
135 |
+
"""
|
136 |
+
แสดงข้อความเริ่มต้นเมื่อเปิดเว็บครั้งแรก
|
137 |
+
"""
|
138 |
+
return "ยังไม่ได้สร้างมอนสเตอร์นะจ๊ะ เลือกค่าต่าง ๆ แล้วกด 'สร้างมอนสเตอร์!' ดูสิ"
|
139 |
+
|
140 |
with gr.Blocks(css=css_code) as demo:
|
141 |
+
gr.Markdown("<h1 id='title'>ZenityX Monster Lab (Thai -> English)</h1>")
|
142 |
gr.Markdown(
|
143 |
"""
|
144 |
<div class="game-desc">
|
145 |
+
<p><strong>วิธีเล่น:</strong></p>
|
146 |
+
<ol>
|
147 |
+
<li>เลือกค่าต่าง ๆ ของมอนสเตอร์ (ภาษาไทย)</li>
|
148 |
+
<li>กดปุ่ม <strong>"สร้างมอนสเตอร์!"</strong></li>
|
149 |
+
<li>ชม <u>รายละเอียดมอนสเตอร์ (ภาษาไทย)</u> และ <u>Prompt ภาษาอังกฤษ</u> สำหรับ AI</li>
|
150 |
+
</ol>
|
151 |
+
<p>ลองเลยจ้า! (โมเดล "Helsinki-NLP/opus-mt-th-en" ทำงานออฟไลน์ได้ใน Hugging Face Spaces)</p>
|
152 |
</div>
|
153 |
"""
|
154 |
)
|
155 |
|
156 |
+
# Dropdown หรือจะปรับเป็น Textbox ก็ได้
|
157 |
+
dd_body = gr.Dropdown(label="รูปร่างมอนสเตอร์", choices=body_shapes_th, value=body_shapes_th[0])
|
158 |
+
dd_head = gr.Dropdown(label="หัว/ใบหน้า", choices=heads_th, value=heads_th[0])
|
159 |
+
dd_arms = gr.Dropdown(label="แขนขา", choices=arms_legs_th, value=arms_legs_th[0])
|
160 |
+
dd_skin = gr.Dropdown(label="สีผิว/ลวดลาย", choices=skin_patterns_th, value=skin_patterns_th[0])
|
161 |
+
dd_ability = gr.Dropdown(label="พลังพิเศษ", choices=abilities_th, value=abilities_th[0])
|
162 |
+
dd_mood = gr.Dropdown(label="อารมณ์/บุคลิก", choices=moods_th, value=moods_th[0])
|
163 |
|
164 |
+
create_button = gr.Button("สร้างมอนสเตอร์!", elem_classes="monster-btn")
|
|
|
165 |
|
166 |
+
monster_desc_th = gr.Textbox(label="รายละเอียดมอนสเตอร์ (ภาษาไทย)", interactive=False, elem_id="desc-th")
|
167 |
+
monster_prompt_en = gr.Textbox(label="Prompt ภาษาอังกฤษ (สำหรับ AI)", interactive=False, elem_id="prompt-en")
|
168 |
|
169 |
+
# เมื่อกดปุ่ม -> เรียก generate_monster_lab
|
170 |
create_button.click(
|
171 |
+
fn=generate_monster_lab,
|
172 |
+
inputs=[dd_body, dd_head, dd_arms, dd_skin, dd_ability, dd_mood],
|
173 |
+
outputs=[monster_desc_th, monster_prompt_en]
|
174 |
)
|
175 |
|
176 |
+
# เมื่อโหลดเว็บครั้งแรก
|
177 |
+
demo.load(fn=initial_text, inputs=None, outputs=monster_desc_th)
|
178 |
+
|
179 |
demo.launch()
|