import gradio as gr from transformers import MarianMTModel, MarianTokenizer # 1) โหลดโมเดลแปล (MarianMT) model_name = "Helsinki-NLP/opus-mt-th-en" tokenizer = MarianTokenizer.from_pretrained(model_name) model = MarianMTModel.from_pretrained(model_name) def translate_th_to_en(th_text: str) -> str: th_text = th_text.strip() if not th_text: return "" inputs = tokenizer(th_text, return_tensors="pt", max_length=512, truncation=True) translation_tokens = model.generate(**inputs, max_length=512) en_text = tokenizer.decode(translation_tokens[0], skip_special_tokens=True) return en_text # 2) ข้อมูล (ภาษาไทย) สำหรับ Dropdown body_shapes_th = [ "ตัวเหนียวขยุกขยิก", "ตัวปุกปุยกลม", "ตัวเต็มไปด้วยหนาม", "ตัวเล็กเหมือนแมลง", "ตัวโปร่งแสงลอยได้", "ตัวโคลนยืดหยุ่น", "ตัวหินแข็งแรง", "ตัวทรงพีระมิด", "ตัวระยิบระยับ", "ตัวเหมือนฟองสบู่" ] heads_th = [ "หัวตาเดียว", "หัวสองเขาเหมือนมังกร", "หัวมีเขาใหญ่มาก", "หัวผีแสยะยิ้ม", "หัวกระต่ายน่ารัก", "หัวปลาหมึกสุดแปลก", "หัวเพลิงลุก", "หัวงูพ่นพิษ", "หัววุ้นใส", "หัวเมฆหมอก" ] arms_legs_th = [ "แขนหนวดปลาหมึกและขาปลาหมึก", "แขนกลและเท้าสเก็ต", "ปีกขนนกและอุ้งเท้าสิงโต", "แขนเรืองแสงและขายานโฮเวอร์", "แขนไม้หุ่นเชิดและขายักษ์แมงมุม", "แขนโลหะ", "แขนเหล็กข้อต่อ", "ปีกค้างคาว", "ขาไก่ยักษ์", "แขนขนนุ่ม" ] skin_patterns_th = [ "ลายสีรุ้ง", "จุดม่วงเรืองแสง", "เกล็ดเหล็ก", "ขนนกวิบวับ", "จุดกลมกากเพชร", "ลายหินอ่อน", "ลายไฟลุก", "ลายฟ้าแลบ", "ลายสเกลปลา", "ลายหมอก" ] abilities_th = [ "พ่นไฟ", "ปล่อยฟองสบู่", "ควบคุมสายฟ้า", "ร้องเพลงกล่อม", "วาร์ประยะสั้น", "เสกสิ่งของ", "ปล่อยพลังงานแสง", "ควบคุมแรงโน้มถ่วง", "เปลี่ยนรูปร่าง", "เสกภาพลวงตา" ] moods_th = [ "เป็นมิตร", "ขี้หงุดหงิด", "ตลกโปกฮา", "ซนเป็นลิง", "ขี้อาย", "ขี้เล่น", "เศร้าสร้อย", "จริงจัง", "มีความสุข", "ขี้ตกใจ" ] # 3) ฟังก์ชันสร้าง Prompt def generate_monster_lab( body_dd, body_tb, head_dd, head_tb, arms_dd, arms_tb, skin_dd, skin_tb, ability_dd, ability_tb, mood_dd, mood_tb, ): # เลือกค่าจาก textbox หากไม่ว่าง, มิฉะนั้นใช้ dropdown body_th = body_tb.strip() if body_tb.strip() else body_dd head_th = head_tb.strip() if head_tb.strip() else head_dd arms_th = arms_tb.strip() if arms_tb.strip() else arms_dd skin_th = skin_tb.strip() if skin_tb.strip() else skin_dd ability_th = ability_tb.strip() if ability_tb.strip() else ability_dd mood_th = mood_tb.strip() if mood_tb.strip() else mood_dd desc_th = ( f"มอนสเตอร์อารมณ์{mood_th} มี{body_th} " f"พร้อมด้วย{head_th}, {arms_th}, " f"ผิว/ลายแบบ{skin_th}, และพลังพิเศษคือ{ability_th}!" ) body_en = translate_th_to_en(body_th) head_en = translate_th_to_en(head_th) arms_en = translate_th_to_en(arms_th) skin_en = translate_th_to_en(skin_th) ability_en = translate_th_to_en(ability_th) mood_en = translate_th_to_en(mood_th) prompt_en = ( f"This is a {mood_en} monster with {body_en}, " f"a {head_en}, {arms_en}, covered in {skin_en} skin, " f"and it can {ability_en}!" ) return desc_th, prompt_en # 4) สร้าง UI Gradio (ไม่มีปุ่ม Copy ใน .click() แต่ใช้ HTML ปุ่ม) css_code = """ body { background-color: #FFF7EA; font-family: "Kanit", sans-serif; } #title { color: #FF6F91; text-align: center; font-size: 2rem; margin-top: 20px; margin-bottom: 10px; font-weight: bold; } .game-desc { margin: 0 auto; width: 80%; background-color: #FFF2F0; border: 2px dashed #FAB1A0; border-radius: 10px; padding: 15px; color: #333; } .monster-btn { background-color: #FFC107; border: 2px solid #FFA000; font-weight: bold; font-size: 1.1rem; padding: 10px 20px; border-radius: 10px; margin-right: 10px; } .monster-btn:hover { background-color: #FFD54F; } #desc-th, #prompt-en { background-color: #FFFAE6; border: 2px solid #FFE082; border-radius: 10px; padding: 10px; margin-bottom: 20px; } """ def initial_text(): return "ยังไม่ได้สร้างมอนสเตอร์ ลองเลือกหรือพิมพ์ แล้วกด 'สร้างมอนสเตอร์!'" # สร้างปุ่ม Copy ด้วย HTML + JS copy_button_html = """ """ with gr.Blocks(css=css_code) as demo: gr.Markdown("
หนูน้อยจ๊ะ เลือกได้ว่าจะใช้ค่าใน Dropdown หรือจะ พิมพ์เอง
เมื่อกด "สร้างมอนสเตอร์!" แล้วจะได้ รายละเอียด (ภาษาไทย) และ Prompt ภาษาอังกฤษ
ปุ่ม "Copy Prompt" ด้านล่าง จะคัดลอกข้อความในช่อง Prompt เพื่อให้ไปวางใน AI อื่นได้ง่าย