import os import gradio as gr from modules import localization, ui_components, shared_items, shared, interrogate, shared_gradio_themes, util, sd_emphasis from modules.paths_internal import models_path, script_path, data_path, sd_configs_path, sd_default_config, sd_model_file, default_sd_model_file, extensions_dir, extensions_builtin_dir, default_output_dir # noqa: F401 from modules.shared_cmd_options import cmd_opts from modules.options import options_section, OptionInfo, OptionHTML, categories options_templates = {} hide_dirs = shared.hide_dirs restricted_opts = { "samples_filename_pattern", "directories_filename_pattern", "outdir_samples", "outdir_txt2img_samples", "outdir_img2img_samples", "outdir_extras_samples", "outdir_grids", "outdir_txt2img_grids", "outdir_save", "outdir_init_images", "temp_dir", "clean_temp_dir_at_start", } categories.register_category("saving", "การบันทึกภาพ") categories.register_category("sd", "Stable Diffusion") categories.register_category("ui", "ส่วนติดต่อผู้ใช้") categories.register_category("system", "ระบบ") categories.register_category("postprocessing", "การประมวลผลหลังสร้างภาพ") categories.register_category("training", "การฝึกฝน") options_templates.update(options_section(('saving-images', "การบันทึกรูปภาพ/ตารางภาพ", "saving"), { "samples_save": OptionInfo(True, "บันทึกรูปภาพที่สร้างทั้งหมดเสมอ"), "samples_format": OptionInfo('png', 'รูปแบบไฟล์ของรูปภาพ'), "samples_filename_pattern": OptionInfo("", "รูปแบบชื่อไฟล์ของรูปภาพ", component_args=hide_dirs).link("wiki", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Images-Filename-Name-and-Subdirectory"), "save_images_add_number": OptionInfo(True, "เพิ่มตัวเลขลงในชื่อไฟล์เมื่อบันทึก", component_args=hide_dirs), "save_images_replace_action": OptionInfo("Replace", "การบันทึกรูปภาพทับไฟล์ที่มีอยู่", gr.Radio, {"choices": ["Replace", "Add number suffix"], **hide_dirs}), "grid_save": OptionInfo(True, "บันทึกตารางภาพที่สร้างทั้งหมดเสมอ"), "grid_format": OptionInfo('png', 'รูปแบบไฟล์ของตารางภาพ'), "grid_extended_filename": OptionInfo(False, "เพิ่มข้อมูลเพิ่มเติม (seed, prompt) ลงในชื่อไฟล์เมื่อตารางภาพถูกบันทึก"), "grid_only_if_multiple": OptionInfo(True, "ไม่บันทึกตารางภาพที่มีเพียงภาพเดียว"), "grid_prevent_empty_spots": OptionInfo(False, "ป้องกันช่องว่างในตารางภาพ (เมื่อถูกตั้งค่าเป็นตรวจจับอัตโนมัติ)"), "grid_zip_filename_pattern": OptionInfo("", "รูปแบบชื่อไฟล์ของไฟล์ zip", component_args=hide_dirs).link("wiki", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Images-Filename-Name-and-Subdirectory"), "n_rows": OptionInfo(-1, "จำนวนแถวในตารางภาพ; ใช้ -1 เพื่อให้ตรวจจับอัตโนมัติ และ 0 เพื่อให้เหมือนกับขนาด batch", gr.Slider, {"minimum": -1, "maximum": 16, "step": 1}), "font": OptionInfo("", "ฟอนต์สำหรับตารางภาพที่มีข้อความ"), "grid_text_active_color": OptionInfo("#000000", "สีข้อความในตารางภาพ", ui_components.FormColorPicker, {}), "grid_text_inactive_color": OptionInfo("#999999", "สีข้อความไม่ทำงานในตารางภาพ", ui_components.FormColorPicker, {}), "grid_background_color": OptionInfo("#ffffff", "สีพื้นหลังของตารางภาพ", ui_components.FormColorPicker, {}), "save_images_before_face_restoration": OptionInfo(False, "บันทึกรูปภาพก่อนการฟื้นฟูใบหน้า"), "save_images_before_highres_fix": OptionInfo(False, "บันทึกรูปภาพก่อนการปรับความละเอียดสูง"), "save_images_before_color_correction": OptionInfo(False, "บันทึกรูปภาพก่อนแก้ไขสีใน img2img"), "save_mask": OptionInfo(False, "สำหรับการวาดซ่อม บันทึกมาสก์แบบเกรย์สเกล"), "save_mask_composite": OptionInfo(False, "สำหรับการวาดซ่อม บันทึกภาพผสมที่มีมาสก์"), "jpeg_quality": OptionInfo(80, "คุณภาพของไฟล์ jpeg และ avif ที่บันทึก", gr.Slider, {"minimum": 1, "maximum": 100, "step": 1}), "webp_lossless": OptionInfo(False, "ใช้การบีบอัดแบบไม่สูญเสียสำหรับภาพ webp"), "export_for_4chan": OptionInfo(True, "บันทึกภาพขนาดใหญ่เป็น JPG").info("หากขนาดไฟล์เกินขีดจำกัด หรือความกว้างหรือความสูงเกินขีดจำกัด"), "img_downscale_threshold": OptionInfo(4.0, "ขีดจำกัดขนาดไฟล์สำหรับตัวเลือกด้านบน หน่วยเป็น MB", gr.Number), "target_side_length": OptionInfo(4000, "ขีดจำกัดความกว้าง/ความสูงสำหรับตัวเลือกด้านบน หน่วยเป็นพิกเซล", gr.Number), "img_max_size_mp": OptionInfo(200, "ขนาดภาพสูงสุด", gr.Number).info("หน่วยเป็นเมกะพิกเซล"), "use_original_name_batch": OptionInfo(True, "ใช้ชื่อไฟล์ต้นฉบับในระหว่างการประมวลผล batch ในแท็บ extras"), "use_upscaler_name_as_suffix": OptionInfo(False, "ใช้ชื่ออัปสเกลเลอร์เป็นคำต่อท้ายชื่อไฟล์ในแท็บ extras"), "save_selected_only": OptionInfo(True, "เมื่อใช้ปุ่ม 'Save' บันทึกเฉพาะภาพที่เลือกไว้"), "save_write_log_csv": OptionInfo(True, "เขียน log.csv เมื่อบันทึกรูปภาพด้วยปุ่ม 'Save'"), "save_init_img": OptionInfo(False, "บันทึกรูปต้นฉบับเมื่อใช้ img2img"), "temp_dir": OptionInfo("", "ไดเรกทอรีสำหรับรูปภาพชั่วคราว; ปล่อยว่างเพื่อใช้ค่าเริ่มต้น"), "clean_temp_dir_at_start": OptionInfo(False, "ล้างโฟลเดอร์ชั่วคราวที่ไม่ใช่ค่าเริ่มต้นเมื่อเริ่มต้น webui"), "save_incomplete_images": OptionInfo(False, "บันทึกรูปภาพที่ยังไม่สมบูรณ์").info("บันทึกรูปภาพที่ถูกขัดจังหวะระหว่างการสร้าง; ถึงจะไม่ถูกบันทึก ก็จะแสดงในหน้าผลลัพธ์ของ webui"), "notification_audio": OptionInfo(True, "เล่นเสียงแจ้งเตือนหลังจากการสร้างรูปภาพเสร็จสิ้น").info("ควรมีไฟล์ notification.mp3 อยู่ในไดเรกทอรีหลัก").needs_reload_ui(), "notification_volume": OptionInfo(100, "ระดับเสียงของเสียงแจ้งเตือน", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1}).info("เป็นเปอร์เซ็นต์"), })) options_templates.update(options_section(('saving-paths', "เส้นทางสำหรับการบันทึก", "saving"), { "outdir_samples": OptionInfo("", "โฟลเดอร์สำหรับบันทึกรูปภาพ; หากเว้นว่างไว้ จะใช้โฟลเดอร์เริ่มต้นด้านล่าง", component_args=hide_dirs), "outdir_txt2img_samples": OptionInfo(util.truncate_path(os.path.join(default_output_dir, 'txt2img-images')), 'โฟลเดอร์สำหรับบันทึกรูปภาพ txt2img', component_args=hide_dirs), "outdir_img2img_samples": OptionInfo(util.truncate_path(os.path.join(default_output_dir, 'img2img-images')), 'โฟลเดอร์สำหรับบันทึกรูปภาพ img2img', component_args=hide_dirs), "outdir_extras_samples": OptionInfo(util.truncate_path(os.path.join(default_output_dir, 'extras-images')), 'โฟลเดอร์สำหรับบันทึกรูปภาพจากแท็บ extras', component_args=hide_dirs), "outdir_grids": OptionInfo("", "โฟลเดอร์สำหรับบันทึกตารางภาพ; หากเว้นว่างไว้ จะใช้สองโฟลเดอร์ด้านล่าง", component_args=hide_dirs), "outdir_txt2img_grids": OptionInfo(util.truncate_path(os.path.join(default_output_dir, 'txt2img-grids')), 'โฟลเดอร์สำหรับบันทึกตารางภาพจาก txt2img', component_args=hide_dirs), "outdir_img2img_grids": OptionInfo(util.truncate_path(os.path.join(default_output_dir, 'img2img-grids')), 'โฟลเดอร์สำหรับบันทึกตารางภาพจาก img2img', component_args=hide_dirs), "outdir_save": OptionInfo(util.truncate_path(os.path.join(data_path, 'log', 'images')), "โฟลเดอร์สำหรับบันทึกรูปภาพที่กดปุ่ม Save", component_args=hide_dirs), "outdir_init_images": OptionInfo(util.truncate_path(os.path.join(default_output_dir, 'init-images')), "โฟลเดอร์สำหรับบันทึกรูปภาพเริ่มต้นใน img2img", component_args=hide_dirs), })) options_templates.update(options_section(('saving-to-dirs', "การบันทึกไปยังโฟลเดอร์", "saving"), { "save_to_dirs": OptionInfo(True, "บันทึกรูปภาพลงในโฟลเดอร์ย่อย"), "grid_save_to_dirs": OptionInfo(True, "บันทึกตารางภาพลงในโฟลเดอร์ย่อย"), "use_save_to_dirs_for_ui": OptionInfo(False, "เมื่อใช้ปุ่ม \"Save\" ให้บันทึกภาพลงในโฟลเดอร์ย่อย"), "directories_filename_pattern": OptionInfo("[date]", "รูปแบบชื่อโฟลเดอร์", component_args=hide_dirs).link("wiki", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Images-Filename-Name-and-Subdirectory"), "directories_max_prompt_words": OptionInfo(8, "จำนวนคำสูงสุดจาก prompt สำหรับ [prompt_words]", gr.Slider, {"minimum": 1, "maximum": 20, "step": 1, **hide_dirs}), })) options_templates.update(options_section(('upscaling', "การขยายภาพ", "postprocessing"), { "ESRGAN_tile": OptionInfo(192, "ขนาดไทล์สำหรับตัวขยายภาพ ESRGAN.", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}).info("0 = ไม่แบ่งไทล์"), "ESRGAN_tile_overlap": OptionInfo(8, "การซ้อนทับไทล์สำหรับ ESRGAN.", gr.Slider, {"minimum": 0, "maximum": 48, "step": 1}).info("ค่าน้อย = มีรอยต่อชัดเจน"), "realesrgan_enabled_models": OptionInfo(["R-ESRGAN 4x+", "R-ESRGAN 4x+ Anime6B"], "เลือกรุ่น Real-ESRGAN ที่จะแสดงใน UI", gr.CheckboxGroup, lambda: {"choices": shared_items.realesrgan_models_names()}), "dat_enabled_models": OptionInfo(["DAT x2", "DAT x3", "DAT x4"], "เลือกรุ่น DAT ที่จะแสดงใน UI", gr.CheckboxGroup, lambda: {"choices": shared_items.dat_models_names()}), "DAT_tile": OptionInfo(192, "ขนาดไทล์สำหรับ DAT.", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}).info("0 = ไม่แบ่งไทล์"), "DAT_tile_overlap": OptionInfo(8, "การซ้อนทับไทล์สำหรับ DAT.", gr.Slider, {"minimum": 0, "maximum": 48, "step": 1}).info("ค่าน้อย = มีรอยต่อชัดเจน"), "upscaler_for_img2img": OptionInfo(None, "ตัวขยายภาพสำหรับ img2img", gr.Dropdown, lambda: {"choices": [x.name for x in shared.sd_upscalers]}), "set_scale_by_when_changing_upscaler": OptionInfo(False, "ตั้งค่าการขยายอัตโนมัติตามชื่อของตัวขยายภาพที่เลือก"), })) options_templates.update(options_section(('face-restoration', "การฟื้นฟูใบหน้า", "postprocessing"), { "face_restoration": OptionInfo(False, "ฟื้นฟูใบหน้า", infotext='Face restoration').info("ใช้โมเดลภายนอกในการฟื้นฟูใบหน้าหลังสร้างภาพ"), "face_restoration_model": OptionInfo("CodeFormer", "โมเดลฟื้นฟูใบหน้า", gr.Radio, lambda: {"choices": [x.name() for x in shared.face_restorers]}), "code_former_weight": OptionInfo(0.5, "น้ำหนักของ CodeFormer", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01}).info("0 = ฟื้นฟูมากสุด; 1 = ฟื้นฟูน้อยสุด"), "face_restoration_unload": OptionInfo(False, "ย้ายโมเดลฟื้นฟูใบหน้าจาก VRAM ไปยัง RAM หลังประมวลผล"), })) options_templates.update(options_section(('system', "ระบบ", "system"), { "auto_launch_browser": OptionInfo("Local", "เปิดเว็บเบราว์เซอร์โดยอัตโนมัติเมื่อเริ่มต้น", gr.Radio, lambda: {"choices": ["Disable", "Local", "Remote"]}), "enable_console_prompts": OptionInfo(shared.cmd_opts.enable_console_prompts, "แสดงพรอมต์ในคอนโซลเมื่อสร้างภาพ"), "show_warnings": OptionInfo(False, "แสดงคำเตือนในคอนโซล").needs_reload_ui(), "show_gradio_deprecation_warnings": OptionInfo(True, "แสดงคำเตือนของ gradio ที่เลิกใช้งานแล้วในคอนโซล").needs_reload_ui(), "memmon_poll_rate": OptionInfo(8, "จำนวนครั้งต่อวินาทีในการตรวจสอบการใช้ VRAM", gr.Slider, {"minimum": 0, "maximum": 40, "step": 1}).info("0 = ปิดการทำงาน"), "samples_log_stdout": OptionInfo(False, "พิมพ์ข้อมูลการสร้างภาพทั้งหมดไปยัง stdout เสมอ"), "multiple_tqdm": OptionInfo(True, "เพิ่มแถบความคืบหน้าชุดที่สองในคอนโซลสำหรับงานทั้งหมด"), "enable_upscale_progressbar": OptionInfo(True, "แสดงแถบความคืบหน้าในคอนโซลเมื่อขยายภาพแบบไทล์"), "print_hypernet_extra": OptionInfo(False, "พิมพ์ข้อมูลเพิ่มเติมของ hypernetwork ไปยังคอนโซล"), "list_hidden_files": OptionInfo(True, "โหลดโมเดล/ไฟล์ในไดเรกทอรีที่ซ่อนอยู่").info("ชื่อไดเรกทอรีเริ่มต้นด้วย \".\" ถือว่าเป็นแบบซ่อน"), "disable_mmap_load_safetensors": OptionInfo(False, "ปิดการใช้ memmap เมื่อโหลดไฟล์ .safetensors").info("แก้ปัญหาความช้าในการโหลดในบางกรณี"), "hide_ldm_prints": OptionInfo(True, "ซ่อนข้อความที่พิมพ์จากโมดูล ldm/sgm ของ Stability-AI"), "dump_stacks_on_signal": OptionInfo(False, "พิมพ์ stack trace ก่อนออกจากโปรแกรมเมื่อกด ctrl+c"), })) options_templates.update(options_section(('profiler', "โปรไฟล์การประมวลผล", "system"), { "profiling_explanation": OptionHTML(""" การตั้งค่าเหล่านี้จะเปิดใช้ torch profiler เมื่อสร้างภาพ Profiler ช่วยให้ดูได้ว่าโค้ดส่วนใดใช้ทรัพยากรของเครื่องคอมพิวเตอร์มากที่สุด ทุกการสร้างภาพจะเขียนโปรไฟล์ลงไฟล์เดียวและจะเขียนทับของเดิม สามารถดูไฟล์ได้ที่ Chrome หรือเว็บไซต์ Perfetto คำเตือน: การเขียนโปรไฟล์อาจใช้เวลานานถึง 30 วินาที และไฟล์อาจมีขนาดประมาณ 500MB """), "profiling_enable": OptionInfo(False, "เปิดใช้การโปรไฟล์"), "profiling_activities": OptionInfo(["CPU"], "กิจกรรมที่โปรไฟล์", gr.CheckboxGroup, {"choices": ["CPU", "CUDA"]}), "profiling_record_shapes": OptionInfo(True, "บันทึกรูปร่างของข้อมูล"), "profiling_profile_memory": OptionInfo(True, "โปรไฟล์การใช้หน่วยความจำ"), "profiling_with_stack": OptionInfo(True, "รวม stack ของ python"), "profiling_filename": OptionInfo("trace.json", "ชื่อไฟล์โปรไฟล์"), })) options_templates.update(options_section(('API', "API", "system"), { "api_enable_requests": OptionInfo(True, "อนุญาต URL ที่ขึ้นต้นด้วย http:// และ https:// สำหรับรูปภาพใน API", restrict_api=True), "api_forbid_local_requests": OptionInfo(True, "ไม่อนุญาตให้ใช้ URL ที่ชี้ไปยังทรัพยากรภายในเครื่อง", restrict_api=True), "api_useragent": OptionInfo("", "User agent สำหรับการร้องขอผ่าน API", restrict_api=True), })) options_templates.update(options_section(('training', "การฝึก", "training"), { "unload_models_when_training": OptionInfo(False, "ย้าย VAE และ CLIP ไปยัง RAM ขณะฝึก หากเป็นไปได้ เพื่อประหยัด VRAM"), "pin_memory": OptionInfo(False, "เปิดใช้งาน pin_memory สำหรับ DataLoader ช่วยให้ฝึกเร็วขึ้นเล็กน้อย แต่ใช้หน่วยความจำมากขึ้น"), "save_optimizer_state": OptionInfo(False, "บันทึกสถานะ Optimizer แยกเป็นไฟล์ *.optim การฝึก embedding หรือ HN สามารถดำเนินต่อได้จากไฟล์นี้"), "save_training_settings_to_txt": OptionInfo(True, "บันทึกค่าการฝึกสำหรับ textual inversion และ hypernet เป็นไฟล์ข้อความทุกครั้งที่เริ่มการฝึก"), "dataset_filename_word_regex": OptionInfo("", "Regex สำหรับชื่อไฟล์ข้อมูล"), "dataset_filename_join_string": OptionInfo(" ", "ตัวเชื่อมระหว่างคำในชื่อไฟล์"), "training_image_repeats_per_epoch": OptionInfo(1, "จำนวนครั้งที่ใช้ภาพเดียวกันต่อ epoch ใช้สำหรับแสดงเลข epoch เท่านั้น", gr.Number, {"precision": 0}), "training_write_csv_every": OptionInfo(500, "บันทึกค่า loss ลงไฟล์ csv ทุก ๆ N ขั้นตอน (0 = ปิดการบันทึก)"), "training_xattention_optimizations": OptionInfo(False, "ใช้การปรับแต่ง cross attention ขณะฝึก"), "training_enable_tensorboard": OptionInfo(False, "เปิดใช้งานการบันทึกผ่าน tensorboard"), "training_tensorboard_save_images": OptionInfo(False, "บันทึกรูปภาพที่สร้างใน tensorboard"), "training_tensorboard_flush_every": OptionInfo(120, "ระยะเวลาการ flush ข้อมูล tensorboard ลงดิสก์ (วินาที)"), })) options_templates.update(options_section(('sd', "Stable Diffusion", "sd"), { "sd_model_checkpoint": OptionInfo(None, "เจนโมเดล", gr.Dropdown, lambda: {"choices": shared_items.list_checkpoint_tiles(shared.opts.sd_checkpoint_dropdown_use_short)}, refresh=shared_items.refresh_checkpoints, infotext='Model hash'), "sd_checkpoints_limit": OptionInfo(1, "จำนวน checkpoints สูงสุดที่โหลดพร้อมกัน", gr.Slider, {"minimum": 1, "maximum": 10, "step": 1}), "sd_checkpoints_keep_in_cpu": OptionInfo(True, "เก็บโมเดลอื่นใน RAM แทน VRAM"), "sd_checkpoint_cache": OptionInfo(0, "จำนวน checkpoints ที่แคชไว้ใน RAM", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}), "sd_unet": OptionInfo("Automatic", "SD Unet", gr.Dropdown, lambda: {"choices": shared_items.sd_unet_items()}, refresh=shared_items.refresh_unet_list).info("เลือกโมเดล Unet: Automatic = ใช้ชื่อเดียวกับ checkpoint; None = ใช้ Unet จาก checkpoint"), "enable_quantization": OptionInfo(False, "เปิด quantization ใน K samplers เพื่อให้ผลลัพธ์คมชัดขึ้น (อาจทำให้ seed เปลี่ยน)"), "emphasis": OptionInfo("Original", "โหมดการเน้นข้อความ", gr.Radio, lambda: {"choices": [x.name for x in sd_emphasis.options]}, infotext="การเน้น").info("กำหนดระดับความสนใจของโมเดลต่อข้อความ เช่น (more:1.1) หรือ (less:0.9); " + sd_emphasis.get_options_descriptions()), "enable_batch_seeds": OptionInfo(True, "ให้ K-diffusion samplers สร้างภาพชุดเดียวกันใน batch เหมือนกับการสร้างภาพเดี่ยว"), "comma_padding_backtrack": OptionInfo(20, "ขีดจำกัดการ wrap คำใน prompt", gr.Slider, {"minimum": 0, "maximum": 74, "step": 1}), "sdxl_clip_l_skip": OptionInfo(False, "Clip skip สำหรับ SDXL", gr.Checkbox), "CLIP_stop_at_last_layers": OptionInfo(1, "Clip skip", gr.Slider, {"minimum": 1, "maximum": 12, "step": 1}, infotext="Clip skip").link("wiki", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#clip-skip").info("ละเว้นเลเยอร์ท้ายสุดของเครือข่าย CLIP; 1 = ไม่ละเว้น, 2 = ละเว้น 1 เลเยอร์"), "upcast_attn": OptionInfo(False, "Upcast cross attention เป็น float32"), "randn_source": OptionInfo("GPU", "แหล่งสุ่มตัวเลข", gr.Radio, {"choices": ["GPU", "CPU", "NV"]}, infotext="RNG").info("เปลี่ยน seed อย่างมาก; CPU = ให้ผลเหมือนกันข้ามการ์ดจอ; NV = เหมือนกับบนการ์ด NVIDIA"), "tiling": OptionInfo(False, "การทำ tile", infotext='Tiling').info("สร้างภาพที่สามารถนำไปทำ pattern ต่อได้"), "hires_fix_refiner_pass": OptionInfo("second pass", "Hires fix: ใช้ refiner ในรอบใด", gr.Radio, {"choices": ["first pass", "second pass", "both passes"]}, infotext="Hires refiner"), })) options_templates.update(options_section(('sdxl', "Stable Diffusion XL", "sd"), { "sdxl_crop_top": OptionInfo(0, "ตำแหน่งครอปด้านบน"), "sdxl_crop_left": OptionInfo(0, "ตำแหน่งครอปด้านซ้าย"), "sdxl_refiner_low_aesthetic_score": OptionInfo(2.5, "คะแนนสุนทรียะต่ำของ SDXL", gr.Number).info("ใช้กับ negative prompt ของ refiner"), "sdxl_refiner_high_aesthetic_score": OptionInfo(6.0, "คะแนนสุนทรียะสูงของ SDXL", gr.Number).info("ใช้กับ prompt ของ refiner"), })) options_templates.update(options_section(('sd3', "Stable Diffusion 3", "sd"), { "sd3_enable_t5": OptionInfo(False, "เปิดใช้งาน T5").info("โหลด text encoder T5 เพิ่ม VRAM ใช้งาน แต่เพิ่มคุณภาพได้ ต้องรีโหลดโมเดล"), })) options_templates.update(options_section(('vae', "VAE", "sd"), { "sd_vae_explanation": OptionHTML(""" VAE เป็นโครงข่ายประสาทที่แปลงภาพ RGB ให้เป็น latent space และกลับคืน Stable Diffusion ทำงานกับ latent space นี้ระหว่างการประมวลผล (ขณะ progress bar กำลังโหลด) สำหรับ txt2img, VAE จะใช้ตอนสิ้นสุดการสร้างภาพ ส่วน img2img จะใช้ทั้งก่อนและหลังการประมวลผลภาพ """), "sd_vae_checkpoint_cache": OptionInfo(0, "จำนวนโมเดล VAE ที่แคชไว้ใน RAM", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}), "sd_vae": OptionInfo("Automatic", "SD VAE", gr.Dropdown, lambda: {"choices": shared_items.sd_vae_items()}, refresh=shared_items.refresh_vae_list, infotext='VAE').info("เลือกโมเดล VAE: Automatic = ใช้ชื่อเดียวกับ checkpoint; None = ใช้ VAE จาก checkpoint"), "sd_vae_overrides_per_model_preferences": OptionInfo(True, "VAE ที่เลือกจะเขียนทับค่าจากแต่ละโมเดล").info("สามารถตั้ง VAE รายโมเดลได้จาก metadata หรือใช้ชื่อไฟล์เดียวกับ checkpoint"), "auto_vae_precision_bfloat16": OptionInfo(False, "แปลง VAE เป็น bfloat16 โดยอัตโนมัติ").info("ใช้เมื่อ tensor มีค่า NaN หากปิดจะได้ภาพสีดำ"), "auto_vae_precision": OptionInfo(True, "แปลง VAE กลับเป็น float32 โดยอัตโนมัติ").info("ใช้เมื่อ tensor มีค่า NaN หากปิดจะได้ภาพสีดำ"), "sd_vae_encode_method": OptionInfo("Full", "ประเภท VAE สำหรับ encode", gr.Radio, {"choices": ["Full", "TAESD"]}, infotext='VAE Encoder').info("วิธี encode ภาพเป็น latent สำหรับ img2img, hires-fix หรือ inpaint"), "sd_vae_decode_method": OptionInfo("Full", "ประเภท VAE สำหรับ decode", gr.Radio, {"choices": ["Full", "TAESD"]}, infotext='VAE Decoder').info("วิธี decode latent กลับเป็นภาพ"), })) options_templates.update(options_section(('img2img', "ภาพ > ภาพ", "sd"), { "inpainting_mask_weight": OptionInfo(1.0, "ความเข้มของหน้ากากการปรับเงื่อนไขการซ่อมภาพ", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}, infotext='น้ำหนักของหน้ากากเงื่อนไข'), "initial_noise_multiplier": OptionInfo(1.0, "ตัวคูณสัญญาณรบกวนเริ่มต้นสำหรับ img2img", gr.Slider, {"minimum": 0.0, "maximum": 1.5, "step": 0.001}, infotext='ตัวคูณสัญญาณรบกวน'), "img2img_extra_noise": OptionInfo(0.0, "ตัวคูณสัญญาณรบกวนเพิ่มเติมสำหรับ img2img และแก้ไขความละเอียดสูง", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}, infotext='สัญญาณรบกวนเพิ่มเติม').info("0 = ปิดใช้งาน (ค่าเริ่มต้น); ควรน้อยกว่าค่าความแรงในการลดสัญญาณรบกวน"), "img2img_color_correction": OptionInfo(False, "ปรับสีของผลลัพธ์ img2img ให้ตรงกับภาพต้นฉบับ"), "img2img_fix_steps": OptionInfo(False, "กับ img2img, ทำจำนวนขั้นตอนตามที่กำหนดในแถบเลื่อน").info("ปกติจะใช้ขั้นตอนน้อยลงเมื่อใช้การลดสัญญาณรบกวนน้อยลง"), "img2img_background_color": OptionInfo("#ffffff", "กับ img2img, เติมส่วนโปร่งใสของภาพต้นฉบับด้วยสีนี้", ui_components.FormColorPicker, {}), "img2img_editor_height": OptionInfo(720, "ความสูงของตัวแก้ไขภาพ", gr.Slider, {"minimum": 80, "maximum": 1600, "step": 1}).info("หน่วยเป็นพิกเซล").needs_reload_ui(), "img2img_sketch_default_brush_color": OptionInfo("#ffffff", "สีเริ่มต้นของแปรงสเก็ต img2img", ui_components.FormColorPicker, {}).info("สีแปรงเริ่มต้นของ img2img sketch").needs_reload_ui(), "img2img_inpaint_mask_brush_color": OptionInfo("#ffffff", "สีแปรงหน้ากากการซ่อมภาพ", ui_components.FormColorPicker, {}).info("สีของแปรงที่ใช้ในหน้ากากการซ่อมภาพ").needs_reload_ui(), "img2img_inpaint_sketch_default_brush_color": OptionInfo("#ffffff", "สีเริ่มต้นของแปรงสเก็ตการซ่อมภาพ", ui_components.FormColorPicker, {}).info("สีแปรงเริ่มต้นของ sketch การซ่อมภาพ").needs_reload_ui(), "return_mask": OptionInfo(False, "สำหรับการซ่อมภาพ, แสดงหน้ากากสีเทาในผลลัพธ์สำหรับเว็บ"), "return_mask_composite": OptionInfo(False, "สำหรับการซ่อมภาพ, แสดงภาพผสมหน้ากากในผลลัพธ์สำหรับเว็บ"), "img2img_batch_show_results_limit": OptionInfo(32, "แสดงผลลัพธ์ batch img2img จำนวน N รายการแรกใน UI", gr.Slider, {"minimum": -1, "maximum": 1000, "step": 1}).info('0: ปิดใช้งาน, -1: แสดงภาพทั้งหมด อาจทำให้เกิดความล่าช้า'), "overlay_inpaint": OptionInfo(True, "ซ้อนทับต้นฉบับสำหรับการซ่อมภาพ").info("เมื่อซ่อมภาพ, ซ้อนภาพต้นฉบับเหนือบริเวณที่ไม่ได้ซ่อม"), })) options_templates.update(options_section(('optimizations', "การปรับแต่งประสิทธิภาพ", "sd"), { "cross_attention_optimization": OptionInfo("Automatic", "การเพิ่มประสิทธิภาพ Cross Attention", gr.Dropdown, lambda: {"choices": shared_items.cross_attention_optimizations()}), "s_min_uncond": OptionInfo(0.0, "Negative Guidance sigma ขั้นต่ำ", gr.Slider, {"minimum": 0.0, "maximum": 15.0, "step": 0.01}, infotext='NGMS').link("PR", "https://github.com/AUTOMATIC1111/stablediffusion-webui/pull/9177").info("ข้าม prompt เชิงลบในบางขั้นตอนเมื่อภาพใกล้เสร็จ; 0=ปิดการใช้งาน, ค่าสูง=เร็วขึ้น"), "s_min_uncond_all": OptionInfo(False, "ใช้ Negative Guidance sigma ขั้นต่ำในทุกขั้นตอน", infotext='NGMS ทุกขั้นตอน').info("โดยปกติจะข้ามขั้นเว้นขั้น; ตัวเลือกนี้จะให้ข้ามทุกขั้น"), "token_merging_ratio": OptionInfo(0.0, "อัตราการรวม Token", gr.Slider, {"minimum": 0.0, "maximum": 0.9, "step": 0.1}, infotext='อัตราการรวม Token').link("PR", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/9256").info("0=ปิด, ค่าสูง=เร็วขึ้น"), "token_merging_ratio_img2img": OptionInfo(0.0, "อัตราการรวม Token สำหรับ img2img", gr.Slider, {"minimum": 0.0, "maximum": 0.9, "step": 0.1}).info("ใช้เฉพาะเมื่อไม่เป็นศูนย์ และจะ override ค่าด้านบน"), "token_merging_ratio_hr": OptionInfo(0.0, "อัตราการรวม Token สำหรับขั้นตอนความละเอียดสูง", gr.Slider, {"minimum": 0.0, "maximum": 0.9, "step": 0.1}, infotext='Token merging ratio hr').info("ใช้เฉพาะเมื่อไม่เป็นศูนย์ และจะ override ค่าด้านบน"), "pad_cond_uncond": OptionInfo(False, "ปรับความยาว prompt/negative prompt ให้เท่ากัน", infotext='เติม prompt').info("ช่วยเพิ่มประสิทธิภาพเมื่อ prompt กับ negative prompt ยาวไม่เท่ากัน; มีผลต่อ seed"), "pad_cond_uncond_v0": OptionInfo(False, "ปรับ prompt/negative prompt (v0)", infotext='เติม prompt แบบเก่า').info("การทำงานแบบเก่า (ก่อนเวอร์ชัน 1.6.0); truncate negative prompt ถ้ายาวเกิน; มีผลต่อ seed"), "persistent_cond_cache": OptionInfo(True, "แคชเงื่อนไขจาก prompt ถาวร").info("ไม่คำนวณซ้ำหาก prompt เหมือนเดิม"), "batch_cond_uncond": OptionInfo(True, "ประมวลผลเงื่อนไข/ไม่มีเงื่อนไขแบบ batch").info("ประมวลผลทั้งสองพร้อมกัน ช่วยเพิ่มความเร็วแต่ใช้ VRAM เพิ่ม"), "fp8_storage": OptionInfo("Disable", "การใช้ FP8 กับน้ำหนักโมเดล", gr.Radio, {"choices": ["Disable", "Enable for SDXL", "Enable"]}).info("ใช้ FP8 สำหรับจัดเก็บน้ำหนัก Linear/Conv layer; ต้องการ PyTorch >= 2.1.0"), "cache_fp16_weight": OptionInfo(False, "แคชน้ำหนัก FP16 สำหรับ LoRA").info("ใช้ร่วมกับ FP8 เพื่อเพิ่มคุณภาพ LoRA แต่ใช้ RAM มากขึ้น"), })) options_templates.update(options_section(('compatibility', "ความเข้ากันได้", "sd"), { "auto_backcompat": OptionInfo(True, "เปิดใช้งานความเข้ากันได้ย้อนหลังอัตโนมัติ").info("เปิดใช้งานตัวเลือกที่จำเป็นเพื่อความเข้ากันได้เมื่อโหลดพารามิเตอร์จากเวอร์ชันก่อนหน้า"), "use_old_emphasis_implementation": OptionInfo(False, "ใช้วิธีการเน้นคำแบบเก่า").info("ใช้เมื่อจำเป็นต้องได้ผลลัพธ์แบบเดียวกับ seed เก่า"), "use_old_karras_scheduler_sigmas": OptionInfo(False, "ใช้ sigma ของ scheduler แบบ Karras แบบเก่า (0.1 ถึง 10)"), "no_dpmpp_sde_batch_determinism": OptionInfo(False, "ไม่ทำให้ DPM++ SDE เป็น deterministic ระหว่าง batch ขนาดต่างกัน"), "use_old_hires_fix_width_height": OptionInfo(False, "ใช้ความกว้าง/สูงของ hires fix สำหรับผลลัพธ์สุดท้าย แทนที่จะใช้กับ pass แรก"), "hires_fix_use_firstpass_conds": OptionInfo(False, "ให้ hires fix ใช้เงื่อนไขจาก pass แรกในการคำนวณ pass ที่สอง"), "use_old_scheduling": OptionInfo(False, "ใช้ลำดับเวลา prompt แบบเก่า", infotext="ลำดับเวลาแบบเก่า").info("สำหรับ [red:green:N]; แบบเก่า: N < 1 คือสัดส่วนของขั้นตอน, N >= 1 คือจำนวนขั้นตอน; แบบใหม่: N ที่มีจุดทศนิยมคือสัดส่วน, ตัวอื่นคือนับเป็นขั้น"), "use_downcasted_alpha_bar": OptionInfo(False, "ลดขนาด alphas_cumprod เป็น fp16 ก่อนการ sample", infotext="ลดขนาด alphas_cumprod").info("ใช้เพื่อให้ผลเหมือนกับ seed จากเวอร์ชันก่อน"), "refiner_switch_by_sample_steps": OptionInfo(False, "สลับไปใช้ refiner ตามจำนวน sampling steps แทนที่จะเป็น timestep", infotext="สลับ refiner ตามขั้นตอนการ sample") })) options_templates.update(options_section(('interrogate', "วิเคราะห์ภาพ (Interrogate)"), { "interrogate_keep_models_in_memory": OptionInfo(False, "เก็บโมเดลไว้ใน VRAM"), "interrogate_return_ranks": OptionInfo(False, "แสดงอันดับของแท็กที่ตรงกับโมเดล").info("ใช้กับ booru เท่านั้น"), "interrogate_clip_num_beams": OptionInfo(1, "BLIP: จำนวน beams", gr.Slider, {"minimum": 1, "maximum": 16, "step": 1}), "interrogate_clip_min_length": OptionInfo(24, "BLIP: ความยาวคำอธิบายขั้นต่ำ", gr.Slider, {"minimum": 1, "maximum": 128, "step": 1}), "interrogate_clip_max_length": OptionInfo(48, "BLIP: ความยาวคำอธิบายสูงสุด", gr.Slider, {"minimum": 1, "maximum": 256, "step": 1}), "interrogate_clip_dict_limit": OptionInfo(1500, "CLIP: จำนวนบรรทัดสูงสุดในไฟล์ข้อความ").info("0 = ไม่จำกัด"), "interrogate_clip_skip_categories": OptionInfo([], "CLIP: ข้ามหมวดหมู่ในการวิเคราะห์", gr.CheckboxGroup, lambda: {"choices": interrogate.category_types()}, refresh=interrogate.category_types), "interrogate_deepbooru_score_threshold": OptionInfo(0.5, "deepbooru: ค่าคะแนนขั้นต่ำ", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01}), "deepbooru_sort_alpha": OptionInfo(True, "deepbooru: เรียงแท็กตามตัวอักษร").info("ถ้าปิด: เรียงตามคะแนน"), "deepbooru_use_spaces": OptionInfo(True, "deepbooru: ใช้ช่องว่างในแท็ก").info("ถ้าปิด: ใช้ขีดล่าง"), "deepbooru_escape": OptionInfo(True, "deepbooru: escape วงเล็บด้วย \\").info("เพื่อให้วงเล็บไม่ถูกตีความเป็นการเน้นคำ"), "deepbooru_filter_tags": OptionInfo("", "deepbooru: กรองแท็กที่ไม่ต้องการ").info("คั่นแต่ละแท็กด้วยเครื่องหมายคอมมา"), })) options_templates.update(options_section(('extra_networks', "เน็คเวิร์คเสริม", "sd"), { "extra_networks_show_hidden_directories": OptionInfo(True, "แสดงโฟลเดอร์ที่ซ่อนไว้").info("โฟลเดอร์จะถูกซ่อนไว้หากชื่อขึ้นต้นด้วย \".\""), "extra_networks_dir_button_function": OptionInfo(False, "เพิ่ม '/' หน้าโฟลเดอร์เมื่อกดปุ่ม").info("ปุ่มจะแสดงเนื้อหาของโฟลเดอร์โดยไม่ใช้เป็นตัวกรองการค้นหา"), "extra_networks_hidden_models": OptionInfo("When searched", "แสดงการ์ดของโมเดลในโฟลเดอร์ที่ซ่อน", gr.Radio, {"choices": ["Always", "When searched", "Never"]}).info('ตัวเลือก "When searched" จะแสดงเฉพาะเมื่อค้นหาด้วยคำที่มีความยาวตั้งแต่ 4 ตัวอักษรขึ้นไป'), "extra_networks_default_multiplier": OptionInfo(1.0, "ค่าคูณเริ่มต้นของ Extra Networks", gr.Slider, {"minimum": 0.0, "maximum": 2.0, "step": 0.01}), "extra_networks_card_width": OptionInfo(0, "ความกว้างของการ์ด Extra Networks").info("หน่วยเป็นพิกเซล"), "extra_networks_card_height": OptionInfo(0, "ความสูงของการ์ด Extra Networks").info("หน่วยเป็นพิกเซล"), "extra_networks_card_text_scale": OptionInfo(1.0, "ขนาดข้อความบนการ์ด", gr.Slider, {"minimum": 0.0, "maximum": 2.0, "step": 0.01}).info("1 = ขนาดปกติ"), "extra_networks_card_show_desc": OptionInfo(True, "แสดงคำอธิบายบนการ์ด"), "extra_networks_card_description_is_html": OptionInfo(False, "แสดงคำอธิบายแบบ HTML"), "extra_networks_card_order_field": OptionInfo("Path", "เรียงลำดับการ์ด Extra Networks ตาม", gr.Dropdown, {"choices": ['Path', 'Name', 'Date Created', 'Date Modified']}).needs_reload_ui(), "extra_networks_card_order": OptionInfo("Ascending", "ทิศทางการเรียงลำดับ", gr.Dropdown, {"choices": ['Ascending', 'Descending']}).needs_reload_ui(), "extra_networks_tree_view_style": OptionInfo("Dirs", "รูปแบบการแสดงโฟลเดอร์ของ Extra Networks", gr.Radio, {"choices": ["Tree", "Dirs"]}).needs_reload_ui(), "extra_networks_tree_view_default_enabled": OptionInfo(True, "เปิดการแสดงโฟลเดอร์ Extra Networks โดยค่าเริ่มต้น").needs_reload_ui(), "extra_networks_tree_view_default_width": OptionInfo(180, "ความกว้างเริ่มต้นของแถบโฟลเดอร์ Extra Networks", gr.Number).needs_reload_ui(), "extra_networks_add_text_separator": OptionInfo(" ", "ตัวแบ่งข้อความของ Extra Networks").info("ข้อความที่เติมก่อน <...> เมื่อเพิ่มเข้า prompt"), "ui_extra_networks_tab_reorder": OptionInfo("", "เรียงลำดับแท็บ Extra Networks ใหม่").needs_reload_ui(), "textual_inversion_print_at_load": OptionInfo(False, "แสดงรายการ Textual Inversion ขณะโหลดโมเดล"), "textual_inversion_add_hashes_to_infotext": OptionInfo(True, "เพิ่มแฮชของ Textual Inversion ใน infotext"), "sd_hypernetwork": OptionInfo("None", "เพิ่ม Hypernetwork ใน prompt", gr.Dropdown, lambda: {"choices": ["None", *shared.hypernetworks]}, refresh=shared_items.reload_hypernetworks), })) options_templates.update(options_section(('ui_prompt_editing', "การแก้ไขพรอมต์", "ui"), { "keyedit_precision_attention": OptionInfo(0.1, "ความละเอียดสำหรับ (attention:1.1) เมื่อแก้ไขพรอมต์ด้วย Ctrl+ลูกศรขึ้น/ลง", gr.Slider, {"minimum": 0.01, "maximum": 0.2, "step": 0.001}), "keyedit_precision_extra": OptionInfo(0.05, "ความละเอียดสำหรับ เมื่อแก้ไขพรอมต์ด้วย Ctrl+ลูกศรขึ้น/ลง", gr.Slider, {"minimum": 0.01, "maximum": 0.2, "step": 0.001}), "keyedit_delimiters": OptionInfo(r".,\/!?%^*;:{}=`~() ", "ตัวแบ่งคำเมื่อแก้ไขพรอมต์ด้วย Ctrl+ลูกศรขึ้น/ลง"), "keyedit_delimiters_whitespace": OptionInfo(["Tab", "Carriage Return", "Line Feed"], "ตัวแบ่งช่องว่างสำหรับ Ctrl+ลูกศรขึ้น/ลง", gr.CheckboxGroup, lambda: {"choices": ["Tab", "Carriage Return", "Line Feed"]}), "keyedit_move": OptionInfo(True, "Alt+ซ้าย/ขวา เพื่อย้ายส่วนของพรอมต์"), "disable_token_counters": OptionInfo(False, "ปิดการแสดงตัวนับโทเคนของพรอมต์"), "include_styles_into_token_counters": OptionInfo(True, "นับโทเคนของสไตล์ที่เปิดใช้ด้วย").info("เมื่อคำนวณจำนวนโทเคนในพรอมต์ ให้นับโทเคนจากสไตล์ที่เปิดใช้งานด้วย"), })) options_templates.update(options_section(('ui_gallery', "แกลเลอรี", "ui"), { "return_grid": OptionInfo(True, "แสดงตารางภาพในแกลเลอรี"), "do_not_show_images": OptionInfo(False, "ไม่แสดงภาพในแกลเลอรีเลย"), "js_modal_lightbox": OptionInfo(True, "เปิดใช้งานแสดงภาพเต็มหน้าจอ"), "js_modal_lightbox_initially_zoomed": OptionInfo(True, "แสดงภาพแบบขยายโดยค่าเริ่มต้นในโหมดเต็มหน้าจอ"), "js_modal_lightbox_gamepad": OptionInfo(False, "ควบคุมแกลเลอรีเต็มจอด้วยจอยเกม"), "js_modal_lightbox_gamepad_repeat": OptionInfo(250, "ช่วงเวลาการเลื่อนภาพด้วยจอยเกม (มิลลิวินาที)").info("ในหน่วยมิลลิวินาที"), "sd_webui_modal_lightbox_icon_opacity": OptionInfo(1, "ความโปร่งใสของไอคอนควบคุม (ไม่โฟกัส)", gr.Slider, {"minimum": 0.0, "maximum": 1, "step": 0.01}, onchange=shared.reload_gradio_theme).info("เฉพาะเมาส์").needs_reload_ui(), "sd_webui_modal_lightbox_toolbar_opacity": OptionInfo(0.9, "ความโปร่งใสของแถบเครื่องมือในโหมดเต็มหน้าจอ", gr.Slider, {"minimum": 0.0, "maximum": 1, "step": 0.01}, onchange=shared.reload_gradio_theme).info("เฉพาะเมาส์").needs_reload_ui(), "gallery_height": OptionInfo("", "ความสูงของแกลเลอรี", gr.Textbox).info("สามารถใช้ค่า CSS ได้ เช่น 768px หรือ 20em").needs_reload_ui(), "open_dir_button_choice": OptionInfo("Subdirectory", "เมื่อกดปุ่ม [📂] ให้เปิดไดเรกทอรีใด", gr.Radio, {"choices": ["Output Root", "Subdirectory", "Subdirectory (even temp dir)"]}), })) options_templates.update(options_section(('ui_alternatives', "ตัวเลือก UI เพิ่มเติม", "ui"), { "compact_prompt_box": OptionInfo(False, "แสดงพรอมต์แบบกะทัดรัด").info("แสดงพรอมต์และเนกาทีฟพรอมต์ในแท็บ Generate ทำให้มีพื้นที่แสดงภาพมากขึ้น").needs_reload_ui(), "samplers_in_dropdown": OptionInfo(True, "ใช้เมนูแบบเลื่อนลงสำหรับเลือกตัวอย่าง (Sampler) แทนปุ่มตัวเลือก").needs_reload_ui(), "dimensions_and_batch_together": OptionInfo(True, "จัดวางตัวเลื่อนขนาดภาพและจำนวนชุดในแถวเดียวกัน").needs_reload_ui(), "sd_checkpoint_dropdown_use_short": OptionInfo(False, "รายการเช็คพอยต์: แสดงเฉพาะชื่อไฟล์ไม่รวมพาธ").info("โมเดลในโฟลเดอร์ย่อยเช่น photo/sd15.ckpt จะแสดงเป็น sd15.ckpt เท่านั้น"), "hires_fix_show_sampler": OptionInfo(False, "Hires fix: แสดงตัวเลือกเช็คพอยต์และ Sampler").needs_reload_ui(), "hires_fix_show_prompts": OptionInfo(False, "Hires fix: แสดงพรอมต์และเนกาทีฟพรอมต์ของรอบ Hires").needs_reload_ui(), "txt2img_settings_accordion": OptionInfo(False, "ซ่อนการตั้งค่า txt2img ใต้ Accordion").needs_reload_ui(), "img2img_settings_accordion": OptionInfo(False, "ซ่อนการตั้งค่า img2img ใต้ Accordion").needs_reload_ui(), "interrupt_after_current": OptionInfo(True, "หยุดหลังจบภาพปัจจุบัน").info("เมื่อกดปุ่มหยุด (Interrupt) ถ้ากำลังสร้างหลายภาพ จะหยุดหลังสร้างภาพที่กำลังทำอยู่เสร็จ"), })) options_templates.update(options_section(('ui', "ส่วนติดต่อผู้ใช้", "ui"), { "localization": OptionInfo("None", "ภาษา", gr.Dropdown, lambda: {"choices": ["None"] + list(localization.localizations.keys())}, refresh=lambda: localization.list_localizations(cmd_opts.localizations_dir)).needs_reload_ui(), "quicksettings_list": OptionInfo(["sd_model_checkpoint"], "รายการการตั้งค่าอย่างรวดเร็ว", ui_components.DropdownMulti, lambda: {"choices": list(shared.opts.data_labels.keys())}).js("info", "settingsHintsShowQuicksettings").info("ตัวเลือกที่แสดงด้านบนของหน้า แทนที่อยู่ในแท็บ Settings").needs_reload_ui(), "ui_tab_order": OptionInfo([], "ลำดับแท็บของ UI", ui_components.DropdownMulti, lambda: {"choices": list(shared.tab_names)}).needs_reload_ui(), "hidden_tabs": OptionInfo([], "แท็บ UI ที่ซ่อนไว้", ui_components.DropdownMulti, lambda: {"choices": list(shared.tab_names)}).needs_reload_ui(), "ui_reorder_list": OptionInfo([], "ลำดับองค์ประกอบ UI ในแท็บ txt2img/img2img", ui_components.DropdownMulti, lambda: {"choices": list(shared_items.ui_reorder_categories())}).info("รายการที่เลือกจะถูกแสดงก่อน").needs_reload_ui(), "gradio_theme": OptionInfo("Default", "ธีม Gradio", ui_components.DropdownEditable, lambda: {"choices": ["Default"] + shared_gradio_themes.gradio_hf_hub_themes}).info("คุณสามารถใส่ชื่อธีมเองจาก แกลเลอรีธีม ได้").needs_reload_ui(), "gradio_themes_cache": OptionInfo(True, "เก็บแคชธีมของ Gradio ไว้ในเครื่อง").info("ปิดเพื่อโหลดธีมใหม่จากอินเทอร์เน็ต"), "show_progress_in_title": OptionInfo(True, "แสดงความคืบหน้าในชื่อหน้าต่าง"), "send_seed": OptionInfo(True, "ส่งค่า seed เมื่อส่งพรอมต์หรือภาพไปยังอินเทอร์เฟซอื่น"), "send_size": OptionInfo(True, "ส่งขนาดภาพเมื่อส่งพรอมต์หรือภาพไปยังอินเทอร์เฟซอื่น"), "enable_reloading_ui_scripts": OptionInfo(False, "โหลดสคริปต์ UI ใหม่เมื่อใช้ตัวเลือก Reload UI").info("เหมาะสำหรับนักพัฒนา: เมื่อมีการเปลี่ยนแปลงโค้ด UI จะถูกนำมาใช้เมื่อโหลด UI ใหม่"), })) options_templates.update(options_section(('infotext', "ข้อความ Infotext", "ui"), { "infotext_explanation": OptionHTML(""" Infotext คือข้อความที่รวมพารามิเตอร์ที่ใช้สร้างภาพ ซึ่งสามารถใช้ซ้ำเพื่อสร้างภาพเดิมได้อีกครั้ง จะแสดงใน UI ใต้ภาพที่สร้าง หากต้องการใช้งาน ให้วางข้อความลงในช่องพรอมต์แล้วกดปุ่ม ↙️ paste """), "enable_pnginfo": OptionInfo(True, "เขียน Infotext ลงในเมตาดาต้าของภาพที่สร้าง"), "save_txt": OptionInfo(False, "สร้างไฟล์ .txt พร้อม Infotext ถัดจากภาพที่สร้างทุกภาพ"), "add_model_name_to_info": OptionInfo(True, "เพิ่มชื่อโมเดลลงใน Infotext"), "add_model_hash_to_info": OptionInfo(True, "เพิ่มค่าแฮชของโมเดลลงใน Infotext"), "add_vae_name_to_info": OptionInfo(True, "เพิ่มชื่อ VAE ลงใน Infotext"), "add_vae_hash_to_info": OptionInfo(True, "เพิ่มค่าแฮชของ VAE ลงใน Infotext"), "add_user_name_to_info": OptionInfo(False, "เพิ่มชื่อผู้ใช้ลงใน Infotext เมื่อมีการล็อกอิน"), "add_version_to_infotext": OptionInfo(True, "เพิ่มเวอร์ชันของโปรแกรมลงใน Infotext"), "disable_weights_auto_swap": OptionInfo(True, "ไม่ใช้ข้อมูล checkpoint จาก Infotext ที่วาง").info("ใช้เมื่อโหลดค่าพารามิเตอร์จากข้อความ Infotext"), "infotext_skip_pasting": OptionInfo([], "ข้ามฟิลด์บางรายการเมื่อวาง Infotext", ui_components.DropdownMulti, lambda: {"choices": shared_items.get_infotext_names()}), "infotext_styles": OptionInfo("Apply if any", "จัดการสไตล์จากพรอมต์ใน Infotext", gr.Radio, {"choices": ["Ignore", "Apply", "Discard", "Apply if any"]}).info("ใช้เมื่อโหลดค่าพารามิเตอร์จากข้อความ Infotext").html(""""""), })) options_templates.update(options_section(('ui', "พรีวิวภาพแบบเรียลไทม์", "ui"), { "show_progressbar": OptionInfo(True, "แสดงแถบความคืบหน้า"), "live_previews_enable": OptionInfo(True, "แสดงพรีวิวภาพแบบเรียลไทม์"), "live_previews_image_format": OptionInfo("png", "รูปแบบไฟล์ภาพพรีวิว", gr.Radio, {"choices": ["jpeg", "png", "webp"]}), "show_progress_grid": OptionInfo(True, "แสดงภาพทั้งหมดในชุดเป็นตารางขณะสร้างภาพ"), "show_progress_every_n_steps": OptionInfo(10, "ช่วงเวลาในการอัปเดตพรีวิว", gr.Slider, {"minimum": -1, "maximum": 32, "step": 1}).info("ระบุเป็นจำนวนขั้นตอนที่ใช้ในการสร้างภาพ; -1 = แสดงเมื่อเสร็จชุด"), "show_progress_type": OptionInfo("Approx NN", "วิธีการแสดงพรีวิว", gr.Radio, {"choices": ["Full", "Approx NN", "Approx cheap", "TAESD"]}).info("Full = ชัดแต่ช้า; Approx NN และ TAESD = เร็วแต่คุณภาพต่ำ; Approx cheap = เร็วมากแต่คุณภาพแย่"), "live_preview_allow_lowvram_full": OptionInfo(False, "อนุญาตให้ใช้พรีวิวแบบ Full ร่วมกับโหมด lowvram/medvram").info("หากปิด จะใช้ Approx NN แทน; Full ส่งผลให้ทำงานช้าลงมากเมื่อใช้โหมด lowvram/medvram"), "live_preview_content": OptionInfo("Prompt", "เนื้อหาที่ใช้แสดงในพรีวิว", gr.Radio, {"choices": ["Combined", "Prompt", "Negative prompt"]}), "live_preview_refresh_period": OptionInfo(1000, "ช่วงเวลาในการอัปเดตแถบความคืบหน้าและพรีวิว").info("หน่วย: มิลลิวินาที"), "live_preview_fast_interrupt": OptionInfo(False, "คืนค่าภาพจากพรีวิวเมื่อกดหยุด").info("ช่วยให้หยุดการสร้างได้เร็วขึ้น"), "js_live_preview_in_modal_lightbox": OptionInfo(False, "แสดงพรีวิวภาพในโหมดแสดงภาพเต็มหน้าจอ"), "prevent_screen_sleep_during_generation": OptionInfo(True, "ป้องกันหน้าจอดับระหว่างสร้างภาพ"), })) options_templates.update(options_section(('sampler-params', "พารามิเตอร์ของ Sampler", "sd"), { "hide_samplers": OptionInfo([], "ซ่อน Sampler ในหน้าผู้ใช้", gr.CheckboxGroup, lambda: {"choices": [x.name for x in shared_items.list_samplers()]}).needs_reload_ui(), "eta_ddim": OptionInfo(0.0, "ค่า Eta สำหรับ DDIM", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}, infotext='Eta DDIM').info("ตัวคูณความแปรปรวนของ noise; ยิ่งสูงผลลัพธ์ยิ่งไม่คาดเดา"), "eta_ancestral": OptionInfo(1.0, "ค่า Eta สำหรับ k-diffusion samplers", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}, infotext='Eta').info("ตัวคูณความแปรปรวนของ noise; ใช้กับ ancestral samplers เช่น Euler a และ SDE"), "ddim_discretize": OptionInfo('uniform', "วิธีแยกขั้นตอนของ DDIM (img2img)", gr.Radio, {"choices": ['uniform', 'quad']}), 's_churn': OptionInfo(0.0, "Sigma churn", gr.Slider, {"minimum": 0.0, "maximum": 100.0, "step": 0.01}, infotext='Sigma churn').info("ระดับของความสุ่ม; ใช้กับ Euler, Heun, และ DPM2"), 's_tmin': OptionInfo(0.0, "Sigma tmin", gr.Slider, {"minimum": 0.0, "maximum": 10.0, "step": 0.01}, infotext='Sigma tmin').info("ค่าต่ำสุดของช่วง sigma; เปิด stochasticity"), 's_tmax': OptionInfo(0.0, "Sigma tmax", gr.Slider, {"minimum": 0.0, "maximum": 999.0, "step": 0.01}, infotext='Sigma tmax').info("0 = inf; ค่าสูงสุดของช่วง sigma"), 's_noise': OptionInfo(1.0, "Sigma noise", gr.Slider, {"minimum": 0.0, "maximum": 1.1, "step": 0.001}, infotext='Sigma noise').info("เพิ่ม noise เพื่อชดเชยรายละเอียดที่สูญหาย"), 'sigma_min': OptionInfo(0.0, "Sigma ต่ำสุด", gr.Number, infotext='Schedule min sigma').info("0 = ค่าเริ่มต้น (~0.03); ค่าความแรงของ noise ต่ำสุดใน scheduler"), 'sigma_max': OptionInfo(0.0, "Sigma สูงสุด", gr.Number, infotext='Schedule max sigma').info("0 = ค่าเริ่มต้น (~14.6); ค่าความแรงของ noise สูงสุดใน scheduler"), 'rho': OptionInfo(0.0, "ค่า Rho", gr.Number, infotext='Schedule rho').info("0 = ค่าเริ่มต้น (7 สำหรับ karras, 1 สำหรับ polyexponential); ยิ่งมาก noise จะลดเร็ว"), 'eta_noise_seed_delta': OptionInfo(0, "Eta noise seed delta", gr.Number, {"precision": 0}, infotext='ENSD').info("ใช้สำหรับเปรียบเทียบภาพ ไม่ส่งผลต่อคุณภาพ"), 'always_discard_next_to_last_sigma': OptionInfo(False, "ตัดขั้น sigma รองสุดท้ายเสมอ", infotext='Discard penultimate sigma').link("PR", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/6044"), 'sgm_noise_multiplier': OptionInfo(False, "ตัวคูณ noise สำหรับ SGM", infotext='SGM noise multiplier').link("PR", "https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12818").info("ให้ผลตรงกับ SDXL ดั้งเดิม - ใช้เพื่อสร้างภาพซ้ำ"), 'uni_pc_variant': OptionInfo("bh1", "ตัวเลือก UniPC", gr.Radio, {"choices": ["bh1", "bh2", "vary_coeff"]}, infotext='UniPC variant'), 'uni_pc_skip_type': OptionInfo("time_uniform", "ประเภทการข้ามของ UniPC", gr.Radio, {"choices": ["time_uniform", "time_quadratic", "logSNR"]}, infotext='UniPC skip type'), 'uni_pc_order': OptionInfo(3, "ลำดับขั้นตอน UniPC", gr.Slider, {"minimum": 1, "maximum": 50, "step": 1}, infotext='UniPC order').info("ต้องน้อยกว่าจำนวนขั้นตอนการสร้าง"), 'uni_pc_lower_order_final': OptionInfo(True, "ใช้ขั้นต่ำสุดในขั้นตอนสุดท้ายของ UniPC", infotext='UniPC lower order final'), 'sd_noise_schedule': OptionInfo("Default", "ตาราง noise สำหรับ sampling", gr.Radio, {"choices": ["Default", "Zero Terminal SNR"]}, infotext="Noise Schedule").info("ใช้กับโมเดลที่ฝึกแบบ Zero Terminal SNR"), 'skip_early_cond': OptionInfo(0.0, "ไม่ใช้ negative prompt ในขั้นตอนเริ่มต้น", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}, infotext="Skip Early CFG").info("0 = ใช้ทั้งหมด, 1 = ไม่ใช้เลย; อาจช่วยให้คุณภาพและความหลากหลายดีขึ้น"), 'beta_dist_alpha': OptionInfo(0.6, "Beta scheduler - alpha", gr.Slider, {"minimum": 0.01, "maximum": 1.0, "step": 0.01}, infotext='Beta scheduler alpha').info('ค่า alpha ของการสุ่มแบบเบต้า (ค่าดั้งเดิม = 0.6)'), 'beta_dist_beta': OptionInfo(0.6, "Beta scheduler - beta", gr.Slider, {"minimum": 0.01, "maximum": 1.0, "step": 0.01}, infotext='Beta scheduler beta').info('ค่า beta ของการสุ่มแบบเบต้า (ค่าดั้งเดิม = 0.6)'), })) options_templates.update(options_section(('postprocessing', "การประมวลผลหลังสร้างภาพ", "postprocessing"), { 'postprocessing_enable_in_main_ui': OptionInfo([], "เปิดใช้งานการประมวลผลหลังในแท็บ txt2img และ img2img", ui_components.DropdownMulti, lambda: {"choices": [x.name for x in shared_items.postprocessing_scripts()]}), 'postprocessing_disable_in_extras': OptionInfo([], "ปิดใช้งานการประมวลผลหลังในแท็บ extras", ui_components.DropdownMulti, lambda: {"choices": [x.name for x in shared_items.postprocessing_scripts()]}), 'postprocessing_operation_order': OptionInfo([], "ลำดับการประมวลผลหลัง", ui_components.DropdownMulti, lambda: {"choices": [x.name for x in shared_items.postprocessing_scripts()]}), 'upscaling_max_images_in_cache': OptionInfo(5, "จำนวนภาพสูงสุดที่เก็บในแคชขณะอัปสเกล", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}), 'postprocessing_existing_caption_action': OptionInfo("Ignore", "การจัดการคำบรรยายที่มีอยู่", gr.Radio, {"choices": ["Ignore", "Keep", "Prepend", "Append"]}).info("ใช้เมื่อสร้างคำบรรยายใหม่: Ignore = ใช้ของใหม่, Keep = ใช้ของเดิม, Prepend/Append = รวมทั้งสอง"), })) options_templates.update(options_section((None, "ตัวเลือกที่ซ่อนไว้"), { "disabled_extensions": OptionInfo([], "ปิดใช้งานส่วนขยายเหล่านี้"), "disable_all_extensions": OptionInfo("none", "ปิดใช้งานส่วนขยายทั้งหมด (แต่ยังจำว่าอันไหนถูกปิดไว้)", gr.Radio, {"choices": ["none", "extra", "all"]}), "restore_config_state_file": OptionInfo("", "ไฟล์สถานะ config ที่จะเรียกคืน จากโฟลเดอร์ 'config-states/'"), "sd_checkpoint_hash": OptionInfo("", "ค่า SHA256 ของ checkpoint ที่ใช้อยู่"), }))