ginipick commited on
Commit
cb7718b
ยท
verified ยท
1 Parent(s): 494ca26

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -386
app.py CHANGED
@@ -1,421 +1,186 @@
1
  import gradio as gr
2
- import numpy as np
3
- import random
4
  import torch
5
- from diffusers import DiffusionPipeline
6
- import spaces
7
- # ๊ธฐ๋ณธ ์„ค์ •
8
- dtype = torch.bfloat16
9
- device = "cuda" if torch.cuda.is_available() else "cpu"
10
-
11
- # ๋ชจ๋ธ ๋กœ๋“œ
12
- pipe = DiffusionPipeline.from_pretrained(
13
- "black-forest-labs/FLUX.1-schnell",
14
- torch_dtype=dtype
15
- ).to(device)
16
-
17
- MAX_SEED = np.iinfo(np.int32).max
18
- MAX_IMAGE_SIZE = 2048
19
-
20
- # Enhanced examples with more detailed prompts and specific styling
21
- EXAMPLES = [
22
- {
23
- "title": "Knowledge Tree",
24
- "prompt": """A handrawn colorful mind map diagram, educational style, vibrant colors, clear hierarchy, golden ratio layout.
25
- KNOWLEDGE
26
- โ”œโ”€โ”€ ACQUISITION [Brain with Lightning ~60px]
27
- โ”‚ โ”œโ”€โ”€ READING [Open Book with Glow]
28
- โ”‚ โ”œโ”€โ”€ PRACTICE [Hands-on Tools]
29
- โ”‚ โ””โ”€โ”€ OBSERVATION [Eye with Magnifier]
30
- โ”œโ”€โ”€ PROCESSING [Gear Network ~50px]
31
- โ”‚ โ”œโ”€โ”€ ANALYSIS [Graph Trending Up]
32
- โ”‚ โ””โ”€โ”€ SYNTHESIS [Puzzle Pieces]
33
- โ”œโ”€โ”€ RETENTION [Memory Chip ~45px]
34
- โ”‚ โ”œโ”€โ”€ SHORT-TERM [Quick Flash]
35
- โ”‚ โ””โ”€โ”€ LONG-TERM [Solid Archive]
36
- โ””โ”€โ”€ APPLICATION
37
- โ”œโ”€โ”€ CREATION [Artist Palette]
38
- โ””โ”€โ”€ INNOVATION [Lightbulb Constellation]""",
39
- "width": 1024,
40
- "height": 1024
41
- },
42
- {
43
- "title": "Digital Transformation",
44
- "prompt": """A handrawn colorful mind map diagram, tech-focused style, neon accents, circuit board patterns.
45
- DIGITAL TRANSFORM
46
- โ”œโ”€โ”€ CLOUD [Cloud with Data Rain ~55px]
47
- โ”‚ โ”œโ”€โ”€ STORAGE [Database Cluster]
48
- โ”‚ โ””โ”€โ”€ COMPUTING [Server Array]
49
- โ”œโ”€โ”€ AUTOMATION [Robot Arm ~50px]
50
- โ”‚ โ”œโ”€โ”€ WORKFLOWS [Flowchart]
51
- โ”‚ โ””โ”€โ”€ AI/ML [Neural Network]
52
- โ”œโ”€โ”€ SECURITY [Shield Matrix ~45px]
53
- โ”‚ โ”œโ”€โ”€ ENCRYPTION [Lock Code]
54
- โ”‚ โ””โ”€โ”€ MONITORING [Radar Screen]
55
- โ””โ”€โ”€ INTEGRATION
56
- โ”œโ”€โ”€ APIS [Puzzle Connect]
57
- โ””โ”€โ”€ MICROSERVICES [Building Blocks]""",
58
- "width": 1024,
59
- "height": 1024
60
- },
61
- {
62
- "title": "Creative Process",
63
- "prompt": """A handrawn colorful mind map diagram, artistic style, watercolor effects, flowing connections.
64
- CREATIVITY
65
- โ”œโ”€โ”€ INSPIRATION [Constellation Stars ~60px]
66
- โ”‚ โ”œโ”€โ”€ NATURE [Organic Patterns]
67
- โ”‚ โ””โ”€โ”€ CULTURE [Global Icons]
68
- โ”œโ”€โ”€ IDEATION [Floating Bubbles ~50px]
69
- โ”‚ โ”œโ”€โ”€ BRAINSTORM [Thunder Cloud]
70
- โ”‚ โ””โ”€โ”€ REFINEMENT [Diamond Polish]
71
- โ”œโ”€โ”€ EXECUTION [Artist Tools ~45px]
72
- โ”‚ โ”œโ”€โ”€ TECHNIQUE [Skilled Hands]
73
- โ”‚ โ””โ”€โ”€ MEDIUM [Palette Mix]
74
- โ””โ”€โ”€ PRESENTATION
75
- โ”œโ”€โ”€ GALLERY [Frame Display]
76
- โ””โ”€โ”€ FEEDBACK [Echo Ripples]""",
77
- "width": 1024,
78
- "height": 1024
79
- },
80
- {
81
- "title": "Future Cities",
82
- "prompt": """A handrawn colorful mind map diagram, futuristic style, holographic elements, sustainable themes.
83
- SMART CITY
84
- โ”œโ”€โ”€ MOBILITY [Hover Transport ~60px]
85
- โ”‚ โ”œโ”€โ”€ AUTONOMOUS [Self-Driving]
86
- โ”‚ โ””โ”€โ”€ CONNECTED [Network Grid]
87
- โ”œโ”€โ”€ ENERGY [Solar Crystal ~55px]
88
- โ”‚ โ”œโ”€โ”€ RENEWABLE [Green Power]
89
- โ”‚ โ””โ”€โ”€ STORAGE [Battery Hub]
90
- โ”œโ”€โ”€ LIVING [Eco Building ~50px]
91
- โ”‚ โ”œโ”€โ”€ VERTICAL [Sky Gardens]
92
- โ”‚ โ””โ”€โ”€ COMMUNITY [People Connect]
93
- โ””โ”€โ”€ INFRASTRUCTURE
94
- โ”œโ”€โ”€ AI GRID [Neural City]
95
- โ””โ”€โ”€ ECO SYSTEM [Nature Tech]""",
96
- "width": 1024,
97
- "height": 1024
98
- },
99
- {
100
- "title": "Health Evolution",
101
- "prompt": """A handrawn colorful mind map diagram, medical style, DNA helix patterns, wellness focus.
102
- HEALTH 3.0
103
- โ”œโ”€โ”€ PREVENTION [Shield DNA ~60px]
104
- โ”‚ โ”œโ”€โ”€ LIFESTYLE [Activity Pulse]
105
- โ”‚ โ””โ”€โ”€ MONITORING [Health Watch]
106
- โ”œโ”€โ”€ TREATMENT [Caduceus Tech ~55px]
107
- โ”‚ โ”œโ”€โ”€ PERSONALIZED [DNA Code]
108
- โ”‚ โ””โ”€โ”€ REGENERATIVE [Cell Renew]
109
- โ”œโ”€โ”€ ENHANCEMENT [Upgrade Spiral ~50px]
110
- โ”‚ โ”œโ”€โ”€ COGNITIVE [Brain Boost]
111
- โ”‚ โ””โ”€โ”€ PHYSICAL [Body Optimize]
112
- โ””โ”€โ”€ INTEGRATION
113
- โ”œโ”€โ”€ AI HEALTH [Smart Doctor]
114
- โ””โ”€โ”€ COMMUNITY [Global Care]""",
115
- "width": 1024,
116
- "height": 1024
117
- },
118
- {
119
- "title": "Space Exploration",
120
- "prompt": """A handrawn colorful mind map diagram, cosmic style, star field background, planetary elements.
121
- SPACE FRONTIER
122
- โ”œโ”€โ”€ DISCOVERY [Telescope Array ~60px]
123
- โ”‚ โ”œโ”€โ”€ MAPPING [Star Charts]
124
- โ”‚ โ””โ”€โ”€ ANALYSIS [Data Stream]
125
- โ”œโ”€โ”€ TRAVEL [Rocket Launch ~55px]
126
- โ”‚ โ”œโ”€โ”€ PROPULSION [Energy Core]
127
- โ”‚ โ””โ”€โ”€ NAVIGATION [Space Map]
128
- โ”œโ”€โ”€ COLONIZATION [Dome City ~50px]
129
- โ”‚ โ”œโ”€โ”€ HABITATS [Life Sphere]
130
- โ”‚ โ””โ”€โ”€ RESOURCES [Mine Extract]
131
- โ””โ”€โ”€ RESEARCH
132
- โ”œโ”€โ”€ ASTROBIOLOGY [Life Search]
133
- โ””โ”€โ”€ PHYSICS [Space Time]""",
134
- "width": 1024,
135
- "height": 1024
136
- },
137
- {
138
- "title": "Ocean Innovation",
139
- "prompt": """A handrawn colorful mind map diagram, marine style, wave patterns, aqua themes.
140
- OCEAN TECH
141
- โ”œโ”€โ”€ EXPLORATION [Deep Submersible ~60px]
142
- โ”‚ โ”œโ”€โ”€ MAPPING [Sonar Wave]
143
- โ”‚ โ””โ”€โ”€ RESEARCH [Lab Bubble]
144
- โ”œโ”€โ”€ CONSERVATION [Marine Life ~55px]
145
- โ”‚ โ”œโ”€โ”€ PROTECTION [Reef Shield]
146
- โ”‚ โ””โ”€โ”€ RESTORATION [Growth Core]
147
- โ”œโ”€โ”€ HARVESTING [Sustainable Net ~50px]
148
- โ”‚ โ”œโ”€โ”€ ENERGY [Wave Power]
149
- โ”‚ โ””โ”€โ”€ RESOURCES [Bio Extract]
150
- โ””โ”€โ”€ MONITORING
151
- โ”œโ”€โ”€ AI SYSTEMS [Smart Sensors]
152
- โ””โ”€โ”€ ECOLOGY [Life Web]""",
153
- "width": 1024,
154
- "height": 1024
155
- },
156
- {
157
- "title": "Quantum Computing",
158
- "prompt": """A handrawn colorful mind map diagram, quantum style, wave-particle duality, matrix patterns.
159
- QUANTUM TECH
160
- โ”œโ”€โ”€ COMPUTATION [Qubit Matrix ~60px]
161
- โ”‚ โ”œโ”€โ”€ PROCESSING [Wave Function]
162
- โ”‚ โ””โ”€โ”€ ALGORITHMS [Code Quantum]
163
- โ”œโ”€โ”€ APPLICATIONS [Use Cases ~55px]
164
- โ”‚ โ”œโ”€โ”€ SIMULATION [Model World]
165
- โ”‚ โ””โ”€โ”€ OPTIMIZATION [Peak Find]
166
- โ”œโ”€โ”€ INFRASTRUCTURE [Q-Hardware ~50px]
167
- โ”‚ โ”œโ”€โ”€ CONTROL [Pulse Shape]
168
- โ”‚ โ””โ”€โ”€ COOLING [Zero Point]
169
- โ””โ”€โ”€ DEVELOPMENT
170
- โ”œโ”€โ”€ SOFTWARE [Q-Code Web]
171
- โ””โ”€โ”€ INTEGRATION [Classical Bridge]""",
172
- "width": 1024,
173
- "height": 1024
174
- },
175
- {
176
- "title": "Bio Engineering",
177
- "prompt": """A handrawn colorful mind map diagram, biological style, DNA patterns, organic flow.
178
- BIOTECH
179
- โ”œโ”€โ”€ GENETICS [DNA Helix ~60px]
180
- โ”‚ โ”œโ”€โ”€ EDITING [CRISPR Tool]
181
- โ”‚ โ””โ”€โ”€ SYNTHESIS [Gene Build]
182
- โ”œโ”€โ”€ APPLICATIONS [Lab Array ~55px]
183
- โ”‚ โ”œโ”€โ”€ MEDICINE [Heal Cell]
184
- โ”‚ โ””โ”€โ”€ AGRICULTURE [Grow Plus]
185
- โ”œโ”€โ”€ PLATFORMS [Bio Factory ~50px]
186
- โ”‚ โ”œโ”€โ”€ SENSORS [Live Detect]
187
- โ”‚ โ””โ”€โ”€ PROCESSORS [Cell Compute]
188
- โ””โ”€โ”€ INTEGRATION
189
- โ”œโ”€โ”€ AI BIOLOGY [Smart Life]
190
- โ””โ”€โ”€ ECOSYSTEM [Nature Net]""",
191
- "width": 1024,
192
- "height": 1024
193
- },
194
- {
195
- "title": "AI Evolution",
196
- "prompt": """A handrawn colorful mind map diagram, neural network style, digital patterns, intelligence flow.
197
- AI FUTURE
198
- โ”œโ”€โ”€ COGNITION [Brain Network ~60px]
199
- โ”‚ โ”œโ”€โ”€ LEARNING [Growth Path]
200
- โ”‚ โ””โ”€โ”€ REASONING [Logic Tree]
201
- โ”œโ”€โ”€ PERCEPTION [Sensor Array ~55px]
202
- โ”‚ โ”œโ”€โ”€ VISION [Eye Matrix]
203
- โ”‚ โ””โ”€โ”€ LANGUAGE [Word Web]
204
- โ”œโ”€โ”€ INTERACTION [Connect Hub ~50px]
205
- โ”‚ โ”œโ”€โ”€ HUMAN [Bridge Link]
206
- โ”‚ โ””โ”€โ”€ MACHINE [Code Path]
207
- โ””โ”€โ”€ EVOLUTION
208
- โ”œโ”€โ”€ CONSCIOUSNESS [Mind Spark]
209
- โ””โ”€โ”€ CREATIVITY [Art Core]""",
210
- "width": 1024,
211
- "height": 1024
212
- }
213
- ]
214
 
215
- # Convert examples to Gradio format
216
- GRADIO_EXAMPLES = [
217
- [example["prompt"], example["width"], example["height"]]
218
- for example in EXAMPLES
219
- ]
220
 
221
- @spaces.GPU() # ์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€
222
- def infer(prompt, seed=42, randomize_seed=False, width=1024, height=1024, num_inference_steps=4, progress=gr.Progress(track_tqdm=True)):
223
- if randomize_seed:
224
- seed = random.randint(0, MAX_SEED)
225
- generator = torch.Generator().manual_seed(seed)
226
- image = pipe(
227
- prompt=prompt,
228
- width=width,
229
- height=height,
230
- num_inference_steps=num_inference_steps,
231
- generator=generator,
232
- guidance_scale=0.0
233
- ).images[0]
234
- return image, seed
235
-
236
- # CSS ์Šคํƒ€์ผ ์ˆ˜์ •
237
- css = """
238
- .container {
239
- display: flex;
240
- flex-direction: row;
241
- height: 100%;
242
- }
243
-
244
- .input-column {
245
- flex: 1;
246
- padding: 20px;
247
- border-right: 2px solid #eee;
248
- max-width: 800px; /* ์ฆ๊ฐ€๋œ ์ตœ๋Œ€ ๋„ˆ๋น„ */
249
- }
250
 
251
- .examples-column {
252
- flex: 1;
253
- padding: 20px;
254
- overflow-y: auto;
255
- background: #f7f7f7;
256
- }
257
 
258
- .title {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  text-align: center;
260
- color: #2a2a2a;
261
- padding: 20px;
262
- font-size: 2.5em;
263
  font-weight: bold;
264
- background: linear-gradient(90deg, #f0f0f0 0%, #ffffff 100%);
265
- border-bottom: 3px solid #ddd;
266
- margin-bottom: 30px;
267
  }
268
-
269
- .subtitle {
270
  text-align: center;
271
  color: #666;
272
  margin-bottom: 30px;
 
273
  }
274
-
275
- .input-box {
 
 
276
  background: white;
 
277
  padding: 20px;
278
- border-radius: 10px;
279
  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
280
- margin-bottom: 20px;
281
- width: 100%; /* ์ „์ฒด ๋„ˆ๋น„ ์‚ฌ์šฉ */
282
  }
283
-
284
- /* ํ…์ŠคํŠธ ์ž…๋ ฅ ๋ฐ•์Šค ์Šคํƒ€์ผ */
285
- .input-box textarea {
286
- width: 100% !important; /* ๊ฐ•์ œ ๋„ˆ๋น„ 100% */
287
- min-width: 600px !important; /* ์ตœ์†Œ ๋„ˆ๋น„ ์„ค์ • */
288
  font-size: 14px !important;
289
- line-height: 1.5 !important;
290
- padding: 12px !important;
291
  }
292
-
293
- .example-card {
294
- background: white;
295
- padding: 15px;
296
- margin: 10px 0;
297
- border-radius: 8px;
298
- box-shadow: 0 2px 5px rgba(0,0,0,0.05);
299
- }
300
-
301
- .example-title {
302
- font-weight: bold;
303
- color: #2a2a2a;
304
- margin-bottom: 10px;
305
- }
306
-
307
- /* ๋ ˆ์ด์•„์›ƒ ์กฐ์ • */
308
- .contain {
309
- max-width: 1400px !important; /* ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ ๋„ˆ๋น„ ์ฆ๊ฐ€ */
310
- margin: 0 auto !important;
311
- }
312
-
313
- /* ์ž…๋ ฅ ์˜์—ญ ์กฐ์ • */
314
- .input-area {
315
- flex: 2 !important; /* ์ž…๋ ฅ ์˜์—ญ ๋น„์œจ ์ฆ๊ฐ€ */
316
  }
317
-
318
- /* ์˜ˆ์ œ ์˜์—ญ ์กฐ์ • */
319
- .examples-area {
320
- flex: 1 !important;
 
321
  }
322
  """
323
 
324
-
325
- # Gradio ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ •
326
- with gr.Blocks(css=css) as demo:
327
- gr.Markdown(
328
- """
329
- <div class="title">FLUX Mindmap Generator</div>
330
- <div class="subtitle">Create beautiful hand-drawn style diagrams using FLUX AI</div>
331
- """)
332
-
333
-
334
-
335
- with gr.Row(equal_height=True) as main_row:
336
- # ์™ผ์ชฝ ์ž…๋ ฅ ์ปฌ๋Ÿผ
337
- with gr.Column(elem_id="input-column", scale=2): # scale ๊ฐ’ ์ฆ๊ฐ€
338
- with gr.Group(elem_classes="input-box"):
339
- prompt = gr.Text(
340
- label="Diagram Prompt",
341
- placeholder="Enter your diagram structure...",
342
- lines=10, # ์ค„ ์ˆ˜ ์ฆ๊ฐ€
343
- elem_classes="prompt-input" # CSS ํด๋ž˜์Šค ์ถ”๊ฐ€
 
 
 
 
 
 
 
344
  )
345
-
346
- run_button = gr.Button("Generate Diagram", variant="primary")
347
- result = gr.Image(label="Generated Diagram")
348
-
349
- with gr.Accordion("Advanced Settings", open=False):
350
- seed = gr.Slider(
351
- label="Seed",
352
- minimum=0,
353
- maximum=MAX_SEED,
354
- step=1,
355
- value=0,
356
  )
357
- randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
358
-
359
- with gr.Row():
360
- width = gr.Slider(
361
- label="Width",
362
- minimum=256,
363
- maximum=MAX_IMAGE_SIZE,
364
- step=32,
365
- value=1024,
366
- )
367
- height = gr.Slider(
368
- label="Height",
369
- minimum=256,
370
- maximum=MAX_IMAGE_SIZE,
371
- step=32,
372
- value=1024,
373
- )
374
-
375
  num_inference_steps = gr.Slider(
376
  label="Number of inference steps",
 
377
  minimum=1,
378
  maximum=50,
379
- step=1,
380
- value=4,
 
 
 
 
 
 
381
  )
382
-
383
- # ์˜ค๋ฅธ์ชฝ ์˜ˆ์ œ ์ปฌ๋Ÿผ
384
- with gr.Column(elem_id="examples-column", scale=1):
385
- gr.Markdown("### Example Diagrams")
386
- for example in EXAMPLES:
387
- with gr.Group(elem_classes="example-card"):
388
- gr.Markdown(f"#### {example['title']}")
389
- gr.Markdown(f"```\n{example['prompt']}\n```")
390
-
391
- def create_example_handler(ex):
392
- def handler():
393
- return {
394
- prompt: ex["prompt"],
395
- width: ex["width"],
396
- height: ex["height"]
397
- }
398
- return handler
399
-
400
- gr.Button("Use This Example", size="sm").click(
401
- fn=create_example_handler(example),
402
- outputs=[prompt, width, height]
403
- )
 
 
 
 
 
 
 
404
 
405
- gr.on(
406
- triggers=[run_button.click, prompt.submit],
407
- fn=infer,
408
- inputs=[prompt, seed, randomize_seed, width, height, num_inference_steps],
409
- outputs=[result, seed]
410
  )
411
 
412
- # ์•ฑ ์‹คํ–‰
413
  if __name__ == "__main__":
414
  demo.queue()
415
- demo.launch(
416
- server_name="0.0.0.0",
417
- server_port=7860,
418
- share=False,
419
- show_error=True,
420
- debug=True
421
- )
 
1
  import gradio as gr
 
 
2
  import torch
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
+ # Transformers์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ด์šฉํ•ด ๋ฒˆ์—ญ์šฉ ํŒŒ์ดํ”„๋ผ์ธ ๋กœ๋“œ
5
+ from transformers import pipeline as translation_pipeline
6
+ translator = translation_pipeline("translation", model="Helsinki-NLP/opus-mt-ko-en", device="cpu")
 
 
7
 
8
+ # Diffusers ๋ชจ๋ธ ๋กœ๋“œ
9
+ from diffusers import DiffusionPipeline
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ # -- Stable Diffusion ๊ณ„์—ด ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • --
12
+ # (๋ชจ๋ธ ์˜ˆ์‹œ: black-forest-labs/FLUX.1-schnell -> ๋งˆ์ธ๋“œ๋งต์šฉ์œผ๋กœ ์ปค์Šคํ…€๋œ ๋ชจ๋ธ์ด์ง€๋งŒ,
13
+ # ์—ฌ๊ธฐ์„œ๋Š” "์Šคํ† ๋ฆฌ๋ณด๋“œ" ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ๋„ ์‹œ๋„ ๊ฐ€๋Šฅ)
14
+ model_id = "black-forest-labs/FLUX.1-schnell"
 
 
15
 
16
+ pipe = DiffusionPipeline.from_pretrained(
17
+ model_id,
18
+ torch_dtype=torch.float32
19
+ ).to("cpu") # CPU ์‚ฌ์šฉ
20
+
21
+ # ํ•œ๊ธ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์˜์–ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํ—ฌํผ ํ•จ์ˆ˜
22
+ def translate_prompt_if_korean(prompt_text: str) -> str:
23
+ # ๊ฐ„๋‹จํžˆ, ๋ฌธ์ž์—ด ๋‚ด์— ํ•œ๊ธ€์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ ํ›„ ๋ฒˆ์—ญ
24
+ # (์˜์–ด ์ž…๋ ฅ์ผ ๊ฒฝ์šฐ ๋ฒˆ์—ญ์„ ์Šคํ‚ต)
25
+ if any("๊ฐ€" <= ch <= "ํžฃ" for ch in prompt_text):
26
+ result = translator(prompt_text)
27
+ return result[0]['translation_text']
28
+ return prompt_text
29
+
30
+ def generate_storyboard(
31
+ prompt,
32
+ width=768,
33
+ height=512,
34
+ num_inference_steps=10,
35
+ guidance_scale=7.5,
36
+ seed=42
37
+ ):
38
+ # ๋ฒˆ์—ญ ์ฒ˜๋ฆฌ (ํ•œ๊ธ€ -> ์˜์–ด)
39
+ prompt_en = translate_prompt_if_korean(prompt)
40
+
41
+ # ์‹œ๋“œ ์ƒ์„ฑ
42
+ generator = torch.Generator(device="cpu").manual_seed(seed)
43
+
44
+ # ์ด๋ฏธ์ง€ ์ƒ์„ฑ
45
+ with torch.autocast("cpu"):
46
+ result = pipe(
47
+ prompt=prompt_en,
48
+ width=width,
49
+ height=height,
50
+ num_inference_steps=num_inference_steps,
51
+ guidance_scale=guidance_scale,
52
+ generator=generator
53
+ ).images[0]
54
+ return result
55
+
56
+
57
+ # --- ๋น„์ฃผ์–ผ & ์„ธ๋ จ๋œ UI๋ฅผ ์œ„ํ•œ CSS ---
58
+ custom_css = """
59
+ #title {
60
  text-align: center;
61
+ font-size: 3em;
 
 
62
  font-weight: bold;
63
+ margin: 20px 0;
64
+ color: #333;
 
65
  }
66
+ #subtitle {
 
67
  text-align: center;
68
  color: #666;
69
  margin-bottom: 30px;
70
+ font-size: 1.2em;
71
  }
72
+ .gradio-container {
73
+ background: linear-gradient(120deg, #f8f8f8 0%, #ffffff 100%);
74
+ }
75
+ .input-panel, .output-panel {
76
  background: white;
77
+ border-radius: 12px;
78
  padding: 20px;
 
79
  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
 
 
80
  }
81
+ #prompt-input {
 
 
 
 
82
  font-size: 14px !important;
83
+ min-height: 140px !important;
 
84
  }
85
+ .advanced-settings {
86
+ font-size: 0.9em;
87
+ color: #444;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  }
89
+ .example-box {
90
+ background: #f9f9f9;
91
+ padding: 10px;
92
+ margin-top: 10px;
93
+ border-radius: 8px;
94
  }
95
  """
96
 
97
+ # --- Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ ---
98
+ with gr.Blocks(css=custom_css) as demo:
99
+ gr.Markdown("<div id='title'>Gini Storyboard</div>")
100
+ gr.Markdown("<div id='subtitle'>Generate a hand-drawn style storyboard in black & white film noir or any style you wish!</div>")
101
+
102
+ with gr.Row():
103
+ with gr.Column(elem_classes="input-panel", scale=1):
104
+ prompt = gr.Textbox(
105
+ label="Storyboard Prompt",
106
+ placeholder="Enter your scene descriptions here (in English or Korean)",
107
+ lines=8,
108
+ elem_id="prompt-input"
109
+ )
110
+ seed = gr.Slider(
111
+ label="Seed",
112
+ value=42,
113
+ minimum=0,
114
+ maximum=999999,
115
+ step=1
116
+ )
117
+ with gr.Row():
118
+ width = gr.Slider(
119
+ label="Width",
120
+ minimum=256,
121
+ maximum=1280,
122
+ value=768,
123
+ step=64
124
  )
125
+ height = gr.Slider(
126
+ label="Height",
127
+ minimum=256,
128
+ maximum=1280,
129
+ value=512,
130
+ step=64
 
 
 
 
 
131
  )
132
+ with gr.Accordion("Advanced Settings", open=False, elem_classes="advanced-settings"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  num_inference_steps = gr.Slider(
134
  label="Number of inference steps",
135
+ value=10,
136
  minimum=1,
137
  maximum=50,
138
+ step=1
139
+ )
140
+ guidance_scale = gr.Slider(
141
+ label="Guidance Scale",
142
+ value=7.5,
143
+ minimum=0.0,
144
+ maximum=20.0,
145
+ step=0.5
146
  )
147
+
148
+ run_button = gr.Button("Generate Storyboard", variant="primary")
149
+
150
+ with gr.Column(elem_classes="output-panel", scale=1):
151
+ result = gr.Image(label="Storyboard Result")
152
+
153
+ # ์˜ˆ์ œ ํ”„๋กฌํ”„ํŠธ
154
+ gr.Markdown("### Example Prompt")
155
+ with gr.Box(elem_classes="example-box"):
156
+ example_text = (
157
+ "A hand-drawn storyboard style, film noir theme, black and white.\n"
158
+ "SCENE 1: A detective enters a dark alley [Frame 1]\n"
159
+ "SCENE 2: He notices a shadow [Frame 2]\n"
160
+ "SCENE 3: A sudden flash of light reveals a clue [Frame 3]"
161
+ )
162
+ gr.Markdown(f"```\n{example_text}\n```")
163
+ example_button = gr.Button("Use Example")
164
+
165
+ # ์˜ˆ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ”„๋กฌํ”„ํŠธ์— ๋ฐ˜์˜
166
+ def load_example():
167
+ return example_text
168
+ example_button.click(fn=load_example, outputs=[prompt])
169
+
170
+ # ๋ฒ„ํŠผ ํด๋ฆญ & ํ”„๋กฌํ”„ํŠธ Enter ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
171
+ run_button.click(
172
+ fn=generate_storyboard,
173
+ inputs=[prompt, width, height, num_inference_steps, guidance_scale, seed],
174
+ outputs=[result]
175
+ )
176
 
177
+ prompt.submit(
178
+ fn=generate_storyboard,
179
+ inputs=[prompt, width, height, num_inference_steps, guidance_scale, seed],
180
+ outputs=[result]
 
181
  )
182
 
183
+ # ์‹คํ–‰
184
  if __name__ == "__main__":
185
  demo.queue()
186
+ demo.launch(server_name="0.0.0.0", server_port=7860, share=False)