a
File size: 16,986 Bytes
b5cdf56
 
 
 
 
 
 
 
 
 
3850923
 
b5cdf56
3850923
 
b5cdf56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3850923
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b5cdf56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3850923
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b5cdf56
 
 
3850923
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
import gradio as gr
from gradio_client import Client, handle_file
import re

# Instantiate a Client object from gradio_client pointing to the 'selfit-camera/Omni-Image-Editor' Space.
client = Client("selfit-camera/Omni-Image-Editor")

# Instantiate a Client object for video generation using alexnasa/ltx-2-TURBO Space.
video_client = Client("alexnasa/ltx-2-TURBO")

# Instantiate a Client object for Omni Video Factory
omni_video_client = Client("FrameAI4687/Omni-Video-Factory")

# Instantiate a Client object for Omni Video Factory
omni_video_client = Client("FrameAI4687/Omni-Video-Factory")

# Define a Python function for text-to-image generation
def generate_image(prompt):
    """
    Generate an image from a text prompt using the Omni Image Editor API.
    
    Args:
        prompt (str): Text description of the image to generate
        
    Returns:
        str: URL of the generated image or error message
    """
    try:
        # Call the client.predict() method with the user's prompt, aspect_ratio='16:9', and api_name='/text_to_image_interface'.
        result = client.predict(
            prompt=prompt,
            aspect_ratio="16:9",
            api_name="/text_to_image_interface"
        )

        # The predict method returns a tuple. The first element of this tuple is an HTML string containing the image.
        # Extract the image URL from this HTML string.
        html_string = result[0]
        match = re.search(r"src='([^']+)'", html_string)
        if match:
            image_url = match.group(1)
            return image_url
        else:
            # Handle cases where the URL might not be found
            return "https://via.placeholder.com/400x200?text=Error:Image+Not+Found"
    except Exception as e:
        return f"Error generating image: {str(e)}"

# Define a Python function for image editing
def edit_image(input_image, edit_prompt):
    """
    Edit an image based on a text prompt using the Omni Image Editor API.
    
    Args:
        input_image (str): Path to the image file or image object
        edit_prompt (str): Text description of the edits to apply
        
    Returns:
        str: URL of the edited image or error message
    """
    try:
        if input_image is None:
            return "Please upload an image first"
        
        # Use handle_file to properly handle the image upload
        result = client.predict(
            input_image=handle_file(input_image),
            prompt=edit_prompt,
            api_name="/edit_image_interface"
        )
        
        # Extract the image URL from the HTML response
        if isinstance(result, tuple) and len(result) > 0:
            html_string = result[0]
            match = re.search(r"src='([^']+)'", html_string)
            if match:
                image_url = match.group(1)
                return image_url
            else:
                return "https://via.placeholder.com/400x200?text=Error:Image+Not+Found"
        else:
            return str(result)
            
    except Exception as e:
        return f"Error editing image: {str(e)}"

# Define a Python function for image upscaling
def upscale_image(input_image):
    """
    Upscale an image to higher resolution using the Omni Image Editor API.
    
    Args:
        input_image (str): Path to the image file or image object to upscale
        
    Returns:
        str: URL of the upscaled image or error message
    """
    try:
        if input_image is None:
            return "Please upload an image first"
        
        # Use handle_file to properly handle the image upload
        result = client.predict(
            input_image=handle_file(input_image),
            api_name="/image_upscale_interface"
        )
        
        # Extract the image URL from the HTML response
        if isinstance(result, tuple) and len(result) > 0:
            html_string = result[0]
            match = re.search(r"src='([^']+)'", html_string)
            if match:
                image_url = match.group(1)
                return image_url
            else:
                return "https://via.placeholder.com/400x200?text=Error:Image+Not+Found"
        else:
            return str(result)
            
    except Exception as e:
        return f"Error upscaling image: {str(e)}"

# Define a Python function for video generation from images
def generate_video(first_frame, end_frame, prompt, duration, height, width, enhance_prompt, seed, randomize_seed, camera_lora):
    """
    Generate a video from start and end frames using the LTX-2-TURBO API.
    
    Args:
        first_frame (str): Path to the starting frame image
        end_frame (str): Path to the ending frame image
        prompt (str): Text description of the video to generate
        duration (int): Duration of the video in seconds
        height (int): Height of the video in pixels
        width (int): Width of the video in pixels
        enhance_prompt (bool): Whether to enhance the prompt with AI
        seed (int): Random seed for reproducibility
        randomize_seed (bool): Whether to randomize the seed
        camera_lora (str): Camera LoRA setting
        
    Returns:
        str: Path to the generated video or error message
    """
    try:
        if first_frame is None or end_frame is None:
            return "Please upload both start and end frame images"
        
        if not prompt.strip():
            return "Please enter a video prompt"
        
        # Use handle_file to properly handle the image uploads
        result = video_client.predict(
            first_frame=handle_file(first_frame),
            end_frame=handle_file(end_frame),
            prompt=prompt,
            duration=duration,
            input_video=None,
            generation_mode="Image-to-Video",
            enhance_prompt=enhance_prompt,
            seed=seed,
            randomize_seed=randomize_seed,
            height=height,
            width=width,
            camera_lora=camera_lora,
            audio_path=None,
            api_name="/generate_video"
        )
        
        # Return the result directly (should be a video file path)
        if result:
            return result
        else:
            return "Error: No video generated"
            
    except Exception as e:
        return f"Error generating video: {str(e)}"

# Define a Python function for Omni Video Factory generation
def generate_omni_video(base_prompt, scene_count, seconds_per_scene):
    """
    Generate a video using the Omni Video Factory API.
    
    Args:
        base_prompt (str): Base prompt describing the video scene
        scene_count (str): Number of scenes to generate
        seconds_per_scene (str): Duration of each scene in seconds
        
    Returns:
        str: Path to the generated video or error message
    """
    try:
        if not base_prompt or not base_prompt.strip():
            return "Please enter a video prompt"
        
        if not scene_count or int(scene_count) < 1:
            return "Please enter a valid scene count (minimum 1)"
        
        if not seconds_per_scene or int(seconds_per_scene) < 1:
            return "Please enter a valid duration per scene (minimum 1 second)"
        
        # Call the Omni Video Factory API
        result = omni_video_client.predict(
            base_prompt=base_prompt,
            scene_count=str(scene_count),
            seconds_per_scene=str(seconds_per_scene),
            api_name="/_generate_i2v_scenes"
        )
        
        # Return the result directly (should be a video file path)
        if result:
            return result
        else:
            return "Error: No video generated"
            
    except Exception as e:
        return f"Error generating video: {str(e)}"

# Create a Gradio application using gr.Blocks for more granular control.
with gr.Blocks(
    title='Omni Image Editor with Gradio',
    theme=gr.themes.Soft()
) as demo:
    gr.Markdown("# Omni Image Editor Studio")
    gr.Markdown("Generate images from text descriptions or edit existing images with AI-powered tools.")
    
    with gr.Tabs():
        # Text-to-Image Tab (API-based)
        with gr.TabItem("Text to Image Generator"):
            gr.Markdown("### Generate Images from Text")
            gr.Markdown("Describe the image you want to generate in detail for best results.")
            
            with gr.Row():
                with gr.Column():
                    prompt_input = gr.Textbox(
                        label='Image Description',
                        placeholder='e.g., A futuristic city at sunset with flying cars, neon lights, cyberpunk style, high quality',
                        lines=3
                    )
                    generate_btn = gr.Button("🎨 Generate Image", variant="primary")
            
            generated_image = gr.Image(label='Generated Image', type='filepath')
            
            # Bind the generate_image function to the button click event
            generate_btn.click(
                fn=generate_image,
                inputs=[prompt_input],
                outputs=[generated_image]
            )
        
        # Image Editing Tab
        with gr.TabItem("Image Editor"):
            gr.Markdown("### Edit Images with AI")
            gr.Markdown("Upload an image and describe the changes you want to make.")
            
            with gr.Row():
                with gr.Column():
                    input_image = gr.Image(
                        label='Upload Image',
                        type='filepath'
                    )
                    
            with gr.Row():
                with gr.Column():
                    edit_prompt = gr.Textbox(
                        label='Edit Instructions',
                        placeholder='e.g., Change the sky to sunset colors, add stars, increase contrast',
                        lines=3
                    )
                    edit_btn = gr.Button("✨ Edit Image", variant="primary")
            
            edited_image = gr.Image(label='Edited Image', type='filepath')
            
            # Bind the edit_image function to the button click event
            edit_btn.click(
                fn=edit_image,
                inputs=[input_image, edit_prompt],
                outputs=[edited_image]
            )
        
        # Image Upscaling Tab
        with gr.TabItem("Image Upscaler"):
            gr.Markdown("### Upscale Images to Higher Resolution")
            gr.Markdown("Upload an image and enhance it to higher resolution using AI-powered upscaling.")
            
            with gr.Row():
                with gr.Column():
                    upscale_input = gr.Image(
                        label='Upload Image to Upscale',
                        type='filepath'
                    )
                    upscale_btn = gr.Button("⬆️ Upscale Image", variant="primary")
            
            upscaled_image = gr.Image(label='Upscaled Image', type='filepath')
            
            # Bind the upscale_image function to the button click event
            upscale_btn.click(
                fn=upscale_image,
                inputs=[upscale_input],
                outputs=[upscaled_image]
            )
        
        # Video Generation Tab
        with gr.TabItem("Video Generator"):
            gr.Markdown("### Generate Videos from Images")
            gr.Markdown("Upload start and end frame images and describe the motion you want to create.")
            
            with gr.Row():
                with gr.Column():
                    video_first_frame = gr.Image(
                        label='First Frame (Start Image)',
                        type='filepath'
                    )
                with gr.Column():
                    video_end_frame = gr.Image(
                        label='End Frame (Final Image)',
                        type='filepath'
                    )
            
            with gr.Row():
                with gr.Column():
                    video_prompt = gr.Textbox(
                        label='Video Description',
                        placeholder='e.g., Make this image come alive with cinematic motion, smooth camera pan, 4K quality',
                        lines=3
                    )
            
            with gr.Row():
                with gr.Column():
                    video_duration = gr.Slider(
                        label='Duration (seconds)',
                        minimum=1,
                        maximum=10,
                        value=5,
                        step=1
                    )
                with gr.Column():
                    video_height = gr.Slider(
                        label='Height (pixels)',
                        minimum=256,
                        maximum=1024,
                        value=512,
                        step=64
                    )
                with gr.Column():
                    video_width = gr.Slider(
                        label='Width (pixels)',
                        minimum=256,
                        maximum=1024,
                        value=768,
                        step=64
                    )
            
            with gr.Row():
                with gr.Column():
                    video_enhance = gr.Checkbox(
                        label='Enhance Prompt with AI',
                        value=True
                    )
                with gr.Column():
                    video_randomize = gr.Checkbox(
                        label='Randomize Seed',
                        value=True
                    )
                with gr.Column():
                    video_seed = gr.Number(
                        label='Seed',
                        value=10,
                        precision=0
                    )
            
            with gr.Row():
                with gr.Column():
                    video_camera = gr.Dropdown(
                        label='Camera LoRA',
                        choices=['No LoRA', 'Pan Left', 'Pan Right', 'Zoom In', 'Zoom Out', 'Rotate CW', 'Rotate CCW'],
                        value='No LoRA'
                    )
            
            with gr.Row():
                video_generate_btn = gr.Button("🎬 Generate Video", variant="primary", size='lg')
            
            generated_video = gr.Video(label='Generated Video')
            
            # Bind the generate_video function to the button click event
            video_generate_btn.click(
                fn=generate_video,
                inputs=[
                    video_first_frame,
                    video_end_frame,
                    video_prompt,
                    video_duration,
                    video_height,
                    video_width,
                    video_enhance,
                    video_seed,
                    video_randomize,
                    video_camera
                ],
                outputs=[generated_video]
            )
        
        # Omni Video Factory Tab
        with gr.TabItem("Omni Video Factory"):
            gr.Markdown("### Generate Videos with Scene Sequences")
            gr.Markdown("Create multi-scene videos from text prompts using the Omni Video Factory API.")
            
            with gr.Row():
                with gr.Column():
                    omni_prompt = gr.Textbox(
                        label='Video Description',
                        placeholder='e.g., A drone shot over mountains with sunset, then a close-up of a waterfall, cinematic style',
                        lines=3
                    )
            
            with gr.Row():
                with gr.Column():
                    omni_scene_count = gr.Slider(
                        label='Number of Scenes',
                        minimum=1,
                        maximum=5,
                        value=1,
                        step=1
                    )
                with gr.Column():
                    omni_duration = gr.Slider(
                        label='Seconds Per Scene',
                        minimum=1,
                        maximum=10,
                        value=3,
                        step=1
                    )
            
            with gr.Row():
                omni_generate_btn = gr.Button("🎥 Generate Video Scenes", variant="primary", size='lg')
            
            omni_generated_video = gr.Video(label='Generated Video with Scenes')
            
            # Bind the generate_omni_video function to the button click event
            omni_generate_btn.click(
                fn=generate_omni_video,
                inputs=[
                    omni_prompt,
                    omni_scene_count,
                    omni_duration
                ],
                outputs=[omni_generated_video]
            )

# Launch the Gradio application.
if __name__ == "__main__":
    demo.launch(share=True)