a / app5.py
drdudddd's picture
Rename app.py to app5.py
52d9529 verified
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)