ginipick commited on
Commit
27e8bc2
ยท
verified ยท
1 Parent(s): 56c6f2f

Create app-backup.py

Browse files
Files changed (1) hide show
  1. app-backup.py +377 -0
app-backup.py ADDED
@@ -0,0 +1,377 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import gradio as gr
3
+ import torch
4
+ from PIL import Image
5
+ from diffusers import DiffusionPipeline
6
+ import random
7
+ from transformers import pipeline
8
+
9
+ torch.backends.cudnn.deterministic = True
10
+ torch.backends.cudnn.benchmark = False
11
+ torch.backends.cuda.matmul.allow_tf32 = True
12
+
13
+ # ๋ฒˆ์—ญ ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
14
+ translator = pipeline("translation", model="Helsinki-NLP/opus-mt-ko-en")
15
+
16
+ base_model = "black-forest-labs/FLUX.1-dev"
17
+ pipe = DiffusionPipeline.from_pretrained(base_model, torch_dtype=torch.bfloat16)
18
+
19
+ lora_repo = "prithivMLmods/Canopus-Clothing-Flux-LoRA"
20
+ trigger_word = ""
21
+ pipe.load_lora_weights(lora_repo)
22
+
23
+ pipe.to("cuda")
24
+
25
+ MAX_SEED = 2**32-1
26
+
27
+ @spaces.GPU()
28
+ def translate_and_generate(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale, progress=gr.Progress(track_tqdm=True)):
29
+ # ํ•œ๊ธ€ ๊ฐ์ง€ ๋ฐ ๋ฒˆ์—ญ
30
+ def contains_korean(text):
31
+ return any(ord('๊ฐ€') <= ord(char) <= ord('ํžฃ') for char in text)
32
+
33
+ if contains_korean(prompt):
34
+ # ํ•œ๊ธ€์„ ์˜์–ด๋กœ ๋ฒˆ์—ญ
35
+ translated = translator(prompt)[0]['translation_text']
36
+ actual_prompt = translated
37
+ else:
38
+ actual_prompt = prompt
39
+
40
+ if randomize_seed:
41
+ seed = random.randint(0, MAX_SEED)
42
+ generator = torch.Generator(device="cuda").manual_seed(seed)
43
+
44
+ progress(0, "Starting image generation...")
45
+
46
+ for i in range(1, steps + 1):
47
+ if i % (steps // 10) == 0:
48
+ progress(i / steps * 100, f"Processing step {i} of {steps}...")
49
+
50
+ image = pipe(
51
+ prompt=f"{actual_prompt} {trigger_word}",
52
+ num_inference_steps=steps,
53
+ guidance_scale=cfg_scale,
54
+ width=width,
55
+ height=height,
56
+ generator=generator,
57
+ joint_attention_kwargs={"scale": lora_scale},
58
+ ).images[0]
59
+
60
+ progress(100, "Completed!")
61
+ return image, seed
62
+
63
+ example_image_path = "example0.webp"
64
+ example_prompt = """Cozy winter scene with a Christmas atmosphere: a snow-covered cabin in the forest, warm light glowing from the windows, surrounded by sparkling Christmas decorations and a beautifully adorned Christmas tree. The sky is filled with stars, and soft snowflakes are gently falling, creating a serene and warm ambiance"""
65
+ example_cfg_scale = 3.2
66
+ example_steps = 32
67
+ example_width = 1152
68
+ example_height = 896
69
+ example_seed = 3981632454
70
+ example_lora_scale = 0.85
71
+
72
+ def load_example():
73
+ example_image = Image.open(example_image_path)
74
+ return example_prompt, example_cfg_scale, example_steps, True, example_seed, example_width, example_height, example_lora_scale, example_image
75
+
76
+
77
+ # CSS ์ •์˜
78
+ custom_css = """
79
+ /* ๊ธฐ๋ณธ ์Šคํƒ€์ผ */
80
+ body {
81
+ margin: 0;
82
+ padding: 0;
83
+ background: url('file/example0.webp') no-repeat center center fixed;
84
+ background-size: cover;
85
+ min-height: 100vh;
86
+ }
87
+
88
+ /* ์ปจํ…Œ์ด๋„ˆ */
89
+ .container {
90
+ max-width: 1200px;
91
+ margin: 0 auto;
92
+ padding: 20px;
93
+ box-sizing: border-box;
94
+ }
95
+
96
+ /* ํ—ค๋” */
97
+ .header {
98
+ text-align: center;
99
+ color: white;
100
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.7);
101
+ margin-bottom: 30px;
102
+ font-size: 2.5em;
103
+ }
104
+
105
+ /* ๋ฐ•์Šค ๊ณตํ†ต ์Šคํƒ€์ผ */
106
+ .box-common {
107
+ background-color: rgba(255, 255, 255, 0.85);
108
+ backdrop-filter: blur(10px);
109
+ border-radius: 15px;
110
+ padding: 20px;
111
+ margin: 20px 0;
112
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
113
+ }
114
+
115
+ /* ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€ ๋ฐ•์Šค */
116
+ .result-box {
117
+ width: 90%;
118
+ max-width: 1000px;
119
+ margin: 20px auto;
120
+ }
121
+
122
+ .image-output {
123
+ width: 100%;
124
+ max-width: 800px;
125
+ margin: 0 auto;
126
+ display: block;
127
+ }
128
+
129
+ /* ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ ๋ฐ•์Šค */
130
+ .prompt-box {
131
+ width: 90%;
132
+ max-width: 1000px;
133
+ margin: 20px auto;
134
+ }
135
+
136
+ /* ๋ฒ„ํŠผ ์Šคํƒ€์ผ */
137
+ .generate-btn {
138
+ background-color: #2ecc71 !important;
139
+ color: white !important;
140
+ padding: 12px 30px !important;
141
+ border-radius: 8px !important;
142
+ border: none !important;
143
+ font-size: 1.1em !important;
144
+ cursor: pointer !important;
145
+ transition: background-color 0.3s ease !important;
146
+ width: 200px !important;
147
+ margin: 20px auto !important;
148
+ display: block !important;
149
+ }
150
+
151
+ .generate-btn:hover {
152
+ background-color: #27ae60 !important;
153
+ }
154
+
155
+ /* ์•„์ฝ”๋””์–ธ ์Šคํƒ€์ผ */
156
+ .accordion {
157
+ width: 90%;
158
+ max-width: 1000px;
159
+ margin: 20px auto;
160
+ }
161
+
162
+ /* ์˜ค๋””์˜ค ์ปจํŠธ๋กค */
163
+ .audio-controls {
164
+ position: fixed;
165
+ bottom: 20px;
166
+ right: 20px;
167
+ z-index: 1000;
168
+ display: flex;
169
+ gap: 10px;
170
+ background-color: rgba(255, 255, 255, 0.9);
171
+ padding: 15px;
172
+ border-radius: 10px;
173
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
174
+ }
175
+
176
+ .audio-btn {
177
+ background-color: #3498db;
178
+ color: white;
179
+ border: none;
180
+ padding: 8px 15px;
181
+ border-radius: 5px;
182
+ cursor: pointer;
183
+ transition: background-color 0.3s ease;
184
+ }
185
+
186
+ .audio-btn:hover {
187
+ background-color: #2980b9;
188
+ }
189
+
190
+ /* ๋ˆˆ ๋‚ด๋ฆฌ๋Š” ํšจ๊ณผ */
191
+ @keyframes snowfall {
192
+ 0% {
193
+ transform: translateY(-10vh) translateX(0);
194
+ opacity: 1;
195
+ }
196
+ 100% {
197
+ transform: translateY(100vh) translateX(100px);
198
+ opacity: 0.3;
199
+ }
200
+ }
201
+
202
+ .snowflake {
203
+ position: fixed;
204
+ color: white;
205
+ font-size: 1.5em;
206
+ user-select: none;
207
+ z-index: 1000;
208
+ pointer-events: none;
209
+ animation: snowfall linear infinite;
210
+ }
211
+ """
212
+
213
+ # JavaScript ์ฝ”๋“œ
214
+ snow_js = """
215
+ function createSnowflake() {
216
+ const snowflake = document.createElement('div');
217
+ snowflake.innerHTML = 'โ„';
218
+ snowflake.className = 'snowflake';
219
+ snowflake.style.left = Math.random() * 100 + 'vw';
220
+ snowflake.style.animationDuration = Math.random() * 3 + 2 + 's';
221
+ snowflake.style.opacity = Math.random();
222
+ document.body.appendChild(snowflake);
223
+
224
+ setTimeout(() => {
225
+ snowflake.remove();
226
+ }, 5000);
227
+ }
228
+
229
+ setInterval(createSnowflake, 200);
230
+ """
231
+
232
+ audio_js = """
233
+ let currentlyPlaying = null;
234
+
235
+ function toggleAudio(num) {
236
+ const audio = document.getElementById('bgMusic' + num);
237
+ const otherAudio = document.getElementById('bgMusic' + (num === 1 ? 2 : 1));
238
+
239
+ if (currentlyPlaying === audio) {
240
+ audio.pause();
241
+ currentlyPlaying = null;
242
+ } else {
243
+ if (currentlyPlaying) {
244
+ currentlyPlaying.pause();
245
+ }
246
+ otherAudio.pause();
247
+ audio.play();
248
+ currentlyPlaying = audio;
249
+ }
250
+ }
251
+
252
+ function stopAllAudio() {
253
+ const audios = document.querySelectorAll('audio');
254
+ audios.forEach(audio => audio.pause());
255
+ currentlyPlaying = null;
256
+ }
257
+ """
258
+
259
+ # Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
260
+ app = gr.Blocks(css=custom_css,theme="Yntec/HaleyCH_Theme_Orange")
261
+
262
+ with app:
263
+ # JavaScript ์ดˆ๊ธฐํ™”
264
+ gr.HTML(f"<script>{snow_js}</script>")
265
+
266
+ with gr.Column(elem_classes="container"):
267
+ gr.Markdown("# ๐ŸŽ„ X-MAS LoRA", elem_classes="header")
268
+
269
+ # ์ด๋ฏธ์ง€ ์ถœ๋ ฅ ์˜์—ญ
270
+ with gr.Group(elem_classes="result-box box-common"):
271
+ gr.Markdown("### ๐Ÿ–ผ๏ธ Generated Image")
272
+ result = gr.Image(label="Result", elem_classes="image-output")
273
+
274
+ # ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ ์˜์—ญ
275
+ with gr.Group(elem_classes="prompt-box box-common"):
276
+ prompt = gr.TextArea(
277
+ label="โœ๏ธ Your Prompt (ํ•œ๊ธ€ ๋˜๋Š” ์˜์–ด)",
278
+ placeholder="์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”...",
279
+ lines=5
280
+ )
281
+ generate_button = gr.Button(
282
+ "๐Ÿš€ Generate Image",
283
+ elem_classes="generate-btn"
284
+ )
285
+
286
+ # ๊ณ ๊ธ‰ ์˜ต์…˜
287
+ with gr.Accordion("๐ŸŽจ Advanced Options", open=False, elem_classes="accordion box-common"):
288
+ with gr.Group(elem_classes="parameter-box"):
289
+ gr.Markdown("### ๐ŸŽ›๏ธ Generation Parameters")
290
+ with gr.Row():
291
+ with gr.Column():
292
+ cfg_scale = gr.Slider(
293
+ label="CFG Scale",
294
+ minimum=1,
295
+ maximum=20,
296
+ step=0.5,
297
+ value=example_cfg_scale
298
+ )
299
+ steps = gr.Slider(
300
+ label="Steps",
301
+ minimum=1,
302
+ maximum=100,
303
+ step=1,
304
+ value=example_steps
305
+ )
306
+ lora_scale = gr.Slider(
307
+ label="LoRA Scale",
308
+ minimum=0,
309
+ maximum=1,
310
+ step=0.01,
311
+ value=example_lora_scale
312
+ )
313
+
314
+ with gr.Group(elem_classes="parameter-box"):
315
+ gr.Markdown("### ๐Ÿ“ Image Dimensions")
316
+ with gr.Row():
317
+ width = gr.Slider(
318
+ label="Width",
319
+ minimum=256,
320
+ maximum=1536,
321
+ step=64,
322
+ value=example_width
323
+ )
324
+ height = gr.Slider(
325
+ label="Height",
326
+ minimum=256,
327
+ maximum=1536,
328
+ step=64,
329
+ value=example_height
330
+ )
331
+
332
+ with gr.Group(elem_classes="parameter-box"):
333
+ gr.Markdown("### ๐ŸŽฒ Seed Settings")
334
+ with gr.Row():
335
+ randomize_seed = gr.Checkbox(
336
+ True,
337
+ label="Randomize seed"
338
+ )
339
+ seed = gr.Slider(
340
+ label="Seed",
341
+ minimum=0,
342
+ maximum=MAX_SEED,
343
+ step=1,
344
+ value=example_seed
345
+ )
346
+
347
+ # ์˜ค๋””์˜ค ์ปจํŠธ๋กค
348
+ gr.HTML(f"""
349
+ <div class="audio-controls">
350
+ <button class="audio-btn" onclick="toggleAudio(1)">๐ŸŽต Music 1</button>
351
+ <button class="audio-btn" onclick="toggleAudio(2)">๐ŸŽต Music 2</button>
352
+ <button class="audio-btn" onclick="stopAllAudio()">โน Stop</button>
353
+ </div>
354
+ <audio id="bgMusic1" loop>
355
+ <source src="file/1.mp3" type="audio/mp3">
356
+ </audio>
357
+ <audio id="bgMusic2" loop>
358
+ <source src="file/2.mp3" type="audio/mp3">
359
+ </audio>
360
+ <script>{audio_js}</script>
361
+ """)
362
+
363
+ # ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
364
+ app.load(
365
+ load_example,
366
+ inputs=[],
367
+ outputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale, result]
368
+ )
369
+
370
+ generate_button.click(
371
+ translate_and_generate,
372
+ inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale],
373
+ outputs=[result, seed]
374
+ )
375
+
376
+ app.queue()
377
+ app.launch()