zenityx commited on
Commit
ca6de00
·
verified ·
1 Parent(s): da69ff5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +119 -56
app.py CHANGED
@@ -1,51 +1,103 @@
1
  import gradio as gr
 
2
 
3
- # หมวดหมู่ต่าง ๆ พร้อมตัวเลือก (ตัวอย่าง)
4
- body_shapes = [
5
- "slimy blob body", "furry ball body", "spiky ogre body",
6
- "tiny insect body", "floating jelly body"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  ]
8
- heads = [
9
- "one-eyed head", "two-headed dragon skull", "giant horned head",
10
- "smiling ghost face", "cute bunny ears head"
11
  ]
12
- arms_legs = [
13
- "tentacle arms and octopus legs", "mechanical arms and roller-skate feet",
14
- "feathered wings and lion paws", "glowing hands and hoverboard legs",
15
- "wooden puppet arms and spider legs"
16
  ]
17
- skin_patterns = [
18
- "rainbow stripes", "glowing purple spots", "metallic scales",
19
- "sparkling feathers", "glittery polka dots"
20
  ]
21
- abilities = [
22
- "breathing fire", "shooting bubbles", "controlling lightning",
23
- "singing lullabies", "teleporting short distances"
24
  ]
25
- moods = [
26
- "friendly", "grumpy", "silly", "mischievous", "shy"
 
27
  ]
28
 
29
- def generate_monster_prompt(body, head, arms, skin, ability, mood):
 
 
 
30
  """
31
- สร้างประโยค (Prompt) บรรยายมอนสเตอร์ตามตัวเลือกที่เด็กเลือก
32
  """
33
- prompt = (
34
- f"This is a {mood} monster with a {body}, a {head}, "
35
- f"{arms}, covered in {skin} skin, and it can {ability}!"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  )
37
- return prompt
38
 
 
 
 
 
 
39
  css_code = """
40
  body {
41
- background-color: #FFFCF2;
42
- font-family: "Comic Sans MS", cursive;
43
  }
44
 
45
  #title {
46
- color: #F96C85;
47
  text-align: center;
48
- font-size: 2.1rem;
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: #FFB74D;
64
- border: 2px solid #FFA726;
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: #FFD180;
72
  }
73
- #prompt-box {
74
- font-size: 18px;
75
- background-color: #FFF8E1;
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>ยินดีต้อนรับจ้า หนูน้อยนักทดลอง! ที่นี่คือห้องทดลองลับของ ZenityX!</p>
88
- <p>มาออกแบบมอนสเตอร์กันเถอะ: เลือกรูปร่าง, หัว, แขนขา, สีผิว, พลังพิเศษ,
89
- และอารมณ์สุดเพี้ยน. จากนั้นกดปุ่ม <strong>"Activate Lab!"</strong></p>
90
- <p>ลองดูสิ ว่ามอนสเตอร์ของหนูน้อยจะออกมาเป็นแบบไหน?</p>
 
 
 
91
  </div>
92
  """
93
  )
94
 
95
- # ส่วนเลือกค่าแต่ละหมวด
96
- body_dropdown = gr.Dropdown(label="Body Shape", choices=body_shapes, value=body_shapes[0])
97
- head_dropdown = gr.Dropdown(label="Head & Face", choices=heads, value=heads[0])
98
- arms_dropdown = gr.Dropdown(label="Arms & Legs", choices=arms_legs, value=arms_legs[0])
99
- skin_dropdown = gr.Dropdown(label="Skin Color / Pattern", choices=skin_patterns, value=skin_patterns[0])
100
- ability_dropdown = gr.Dropdown(label="Special Ability", choices=abilities, value=abilities[0])
101
- mood_dropdown = gr.Dropdown(label="Mood / Personality", choices=moods, value=moods[0])
102
 
103
- # ปุ่มกด
104
- create_button = gr.Button("Activate Lab!", elem_classes="monster-btn")
105
 
106
- # ช่องแสดงผล Prompt
107
- monster_prompt_out = gr.Textbox(label="Your Monster Prompt", interactive=False, elem_id="prompt-box")
108
 
109
- # เมื่อกดปุ่ม -> สร้าง Prompt
110
  create_button.click(
111
- fn=generate_monster_prompt,
112
- inputs=[body_dropdown, head_dropdown, arms_dropdown, skin_dropdown, ability_dropdown, mood_dropdown],
113
- outputs=monster_prompt_out
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()