| | """ |
| | Gradio Tab Definitions |
| | |
| | Defines all 6 tabs for the StackNetdemo application. |
| | """ |
| |
|
| | import gradio as gr |
| |
|
| |
|
| | def create_text_to_music_tab(): |
| | """Create the Text to Music tab components.""" |
| | with gr.Column(): |
| | gr.Markdown("### Generate original music from a text description") |
| |
|
| | prompt = gr.Textbox( |
| | label="Describe your music", |
| | placeholder="e.g., upbeat jazz with piano and saxophone, cheerful summer vibes", |
| | lines=3 |
| | ) |
| |
|
| | with gr.Row(): |
| | tags = gr.Textbox( |
| | label="Genre/Style Tags", |
| | placeholder="jazz, piano, instrumental", |
| | scale=2 |
| | ) |
| | instrumental = gr.Checkbox( |
| | label="Instrumental Only", |
| | value=False, |
| | scale=1 |
| | ) |
| |
|
| | lyrics = gr.Textbox( |
| | label="Lyrics (optional)", |
| | placeholder="Write your lyrics here...", |
| | lines=4, |
| | visible=True |
| | ) |
| |
|
| | title = gr.Textbox( |
| | label="Song Title (optional)", |
| | placeholder="My Song" |
| | ) |
| |
|
| | generate_btn = gr.Button("Generate Music", variant="primary", size="lg") |
| |
|
| | status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | output_audio = gr.Audio(label="Generated Music", type="filepath") |
| |
|
| | |
| | instrumental.change( |
| | fn=lambda x: gr.update(visible=not x), |
| | inputs=[instrumental], |
| | outputs=[lyrics], |
| | api_name=None |
| | ) |
| |
|
| | return { |
| | "prompt": prompt, |
| | "tags": tags, |
| | "instrumental": instrumental, |
| | "lyrics": lyrics, |
| | "title": title, |
| | "generate_btn": generate_btn, |
| | "status": status, |
| | "output_audio": output_audio |
| | } |
| |
|
| |
|
| | def create_music_to_music_tab(): |
| | """Create the Music to Music tab with sub-tabs for Cover and Stems.""" |
| | with gr.Tabs() as sub_tabs: |
| | |
| | with gr.Tab("Create Cover"): |
| | with gr.Column(): |
| | gr.Markdown("### Create music from reference audio (Diffusion)") |
| |
|
| | cover_audio_input = gr.Audio( |
| | label="Upload Audio", |
| | type="filepath" |
| | ) |
| |
|
| | cover_style_prompt = gr.Textbox( |
| | label="Style Direction", |
| | placeholder="e.g., rock version with electric guitar, female vocalist", |
| | lines=2 |
| | ) |
| |
|
| | cover_tags = gr.Textbox( |
| | label="Style Tags", |
| | placeholder="rock, electric guitar" |
| | ) |
| |
|
| | cover_title = gr.Textbox( |
| | label="Title (optional)", |
| | placeholder="My Song" |
| | ) |
| |
|
| | cover_btn = gr.Button("Create", variant="primary", size="lg") |
| |
|
| | cover_status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | cover_output = gr.Audio(label="Song", type="filepath") |
| |
|
| | |
| | with gr.Tab("Extract Stems"): |
| | with gr.Column(): |
| | gr.Markdown("### Separate audio into individual stems") |
| |
|
| | stems_audio_input = gr.Audio( |
| | label="Upload Audio", |
| | type="filepath" |
| | ) |
| |
|
| | stems_btn = gr.Button("Extract Stems", variant="primary", size="lg") |
| |
|
| | stems_status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | gr.Markdown("**Extracted Stems:**") |
| | with gr.Row(): |
| | vocals_output = gr.Audio(label="Vocals", type="filepath") |
| | drums_output = gr.Audio(label="Drums", type="filepath") |
| | with gr.Row(): |
| | bass_output = gr.Audio(label="Bass", type="filepath") |
| | other_output = gr.Audio(label="Other", type="filepath") |
| |
|
| | return { |
| | |
| | "cover_audio_input": cover_audio_input, |
| | "cover_style_prompt": cover_style_prompt, |
| | "cover_tags": cover_tags, |
| | "cover_title": cover_title, |
| | "cover_btn": cover_btn, |
| | "cover_status": cover_status, |
| | "cover_output": cover_output, |
| | |
| | "stems_audio_input": stems_audio_input, |
| | "stems_btn": stems_btn, |
| | "stems_status": stems_status, |
| | "vocals_output": vocals_output, |
| | "drums_output": drums_output, |
| | "bass_output": bass_output, |
| | "other_output": other_output |
| | } |
| |
|
| |
|
| | def create_text_to_image_tab(): |
| | """Create the Text to Image tab components.""" |
| | with gr.Column(): |
| | gr.Markdown("### Generate images from a text description") |
| |
|
| | prompt = gr.Textbox( |
| | label="Describe your image", |
| | placeholder="e.g., a serene mountain landscape at sunset with snow-capped peaks", |
| | lines=3 |
| | ) |
| |
|
| | |
| | with gr.Row(): |
| | example1_btn = gr.Button("Example 1", size="sm") |
| | example2_btn = gr.Button("Example 2", size="sm") |
| | example3_btn = gr.Button("Example 3", size="sm") |
| | example4_btn = gr.Button("Example 4", size="sm") |
| |
|
| | format_type = gr.Dropdown( |
| | label="Format", |
| | choices=["image", "multi", "3d"], |
| | value="image" |
| | ) |
| |
|
| | generate_btn = gr.Button("Generate", variant="primary", size="lg") |
| |
|
| | status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | |
| | output_image = gr.Image(label="Generated Image", type="filepath", visible=True) |
| |
|
| | |
| | output_model = gr.Model3D(label="Generated 3D Model", visible=False) |
| |
|
| | |
| | format_type.change( |
| | fn=lambda fmt: ( |
| | gr.update(visible=(fmt != "3d")), |
| | gr.update(visible=(fmt == "3d")) |
| | ), |
| | inputs=[format_type], |
| | outputs=[output_image, output_model], |
| | api_name=None |
| | ) |
| |
|
| | |
| | example_prompts = [ |
| | "An Adorable Alien Rambutan with large round eyes wearing acid-etched armor, in the style of a Pixar character design, soft studio lighting, highly detailed fur texture, whimsical expression, floating in a cosmic fruit bowl surrounded by stardust, 8k resolution, cinematic composition", |
| | "panning photo of a red 1989 two-door Mercedes-Benz 450 SLC driving at high speed along a coastal highway, golden hour lighting, motion blur on wheels and background, sharp focus on car body, Mediterranean Sea visible in background, professional automotive photography", |
| | "A high-contrast flash photograph captured on Fuji Superia X-Tra 400 film showing an elderly woman in a floral housedress washing a bright yellow Lamborghini Countach in her suburban driveway, garden hose in hand, curlers in hair, bemused expression, mundane meets extraordinary", |
| | '{"subject": "great horned owl", "setting": "ancient library at midnight", "style": "Dutch Golden Age painting", "lighting": "single candle illumination with dramatic chiaroscuro", "details": "owl perched on stack of leather-bound books, spectacles on beak, quill pen nearby", "mood": "scholarly and mysterious", "technical": "oil painting texture, visible brushstrokes, museum quality"}' |
| | ] |
| |
|
| | |
| | example1_btn.click( |
| | fn=lambda: example_prompts[0], |
| | inputs=[], |
| | outputs=[prompt], |
| | api_name=None |
| | ) |
| | example2_btn.click( |
| | fn=lambda: example_prompts[1], |
| | inputs=[], |
| | outputs=[prompt], |
| | api_name=None |
| | ) |
| | example3_btn.click( |
| | fn=lambda: example_prompts[2], |
| | inputs=[], |
| | outputs=[prompt], |
| | api_name=None |
| | ) |
| | example4_btn.click( |
| | fn=lambda: example_prompts[3], |
| | inputs=[], |
| | outputs=[prompt], |
| | api_name=None |
| | ) |
| |
|
| | return { |
| | "prompt": prompt, |
| | "format_type": format_type, |
| | "generate_btn": generate_btn, |
| | "status": status, |
| | "output_image": output_image, |
| | "output_model": output_model |
| | } |
| |
|
| |
|
| | def create_image_to_image_tab(): |
| | """Create the Image to Image tab components.""" |
| | with gr.Column(): |
| | gr.Markdown("### Transform or edit an existing image") |
| |
|
| | with gr.Row(): |
| | input_image = gr.Image( |
| | label="Upload Image", |
| | type="filepath", |
| | scale=1 |
| | ) |
| |
|
| | with gr.Column(scale=1): |
| | edit_prompt = gr.Textbox( |
| | label="Edit Instructions", |
| | placeholder="e.g., add dramatic sunset lighting, make it look like a painting", |
| | lines=3 |
| | ) |
| |
|
| | strength = gr.Slider( |
| | label="Edit Strength", |
| | minimum=0.1, |
| | maximum=1.0, |
| | value=0.5, |
| | step=0.1 |
| | ) |
| |
|
| | edit_btn = gr.Button("Transform Image", variant="primary", size="lg") |
| |
|
| | status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | output_image = gr.Image(label="Transformed Image", type="filepath") |
| |
|
| | return { |
| | "input_image": input_image, |
| | "edit_prompt": edit_prompt, |
| | "strength": strength, |
| | "edit_btn": edit_btn, |
| | "status": status, |
| | "output_image": output_image |
| | } |
| |
|
| |
|
| | def create_text_to_video_tab(): |
| | """Create the Text to Video tab components.""" |
| | with gr.Column(): |
| | gr.Markdown("### Generate videos from a text description") |
| |
|
| | prompt = gr.Textbox( |
| | label="Describe your video", |
| | placeholder="e.g., a drone shot flying over a tropical beach at golden hour", |
| | lines=3 |
| | ) |
| |
|
| | with gr.Row(): |
| | duration = gr.Slider( |
| | label="Duration (seconds)", |
| | minimum=3, |
| | maximum=30, |
| | value=10, |
| | step=1, |
| | scale=1 |
| | ) |
| | style = gr.Dropdown( |
| | label="Style", |
| | choices=["Cinematic", "Animation", "Documentary", "Abstract"], |
| | value="Cinematic", |
| | scale=1 |
| | ) |
| |
|
| | generate_btn = gr.Button("Generate Video", variant="primary", size="lg") |
| |
|
| | status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | output_video = gr.Video(label="Generated Video") |
| |
|
| | return { |
| | "prompt": prompt, |
| | "duration": duration, |
| | "style": style, |
| | "generate_btn": generate_btn, |
| | "status": status, |
| | "output_video": output_video |
| | } |
| |
|
| |
|
| | def create_image_to_video_tab(): |
| | """Create the Image to Video tab components.""" |
| | with gr.Column(): |
| | gr.Markdown("### Animate a static image into video") |
| |
|
| | with gr.Row(): |
| | input_image = gr.Image( |
| | label="Upload Image", |
| | type="filepath", |
| | scale=1 |
| | ) |
| |
|
| | with gr.Column(scale=1): |
| | motion_prompt = gr.Textbox( |
| | label="Motion Description", |
| | placeholder="e.g., gentle zoom in, clouds moving slowly, water rippling", |
| | lines=3 |
| | ) |
| |
|
| | duration = gr.Slider( |
| | label="Duration (seconds)", |
| | minimum=3, |
| | maximum=15, |
| | value=5, |
| | step=1 |
| | ) |
| |
|
| | animate_btn = gr.Button("Animate Image", variant="primary", size="lg") |
| |
|
| | status = gr.Textbox(label="Status", interactive=False, visible=False) |
| |
|
| | output_video = gr.Video(label="Animated Video") |
| |
|
| | return { |
| | "input_image": input_image, |
| | "motion_prompt": motion_prompt, |
| | "duration": duration, |
| | "animate_btn": animate_btn, |
| | "status": status, |
| | "output_video": output_video |
| | } |
| |
|
| |
|
| | def create_all_tabs(): |
| | """Create all tabs and return component references.""" |
| | tabs = {} |
| |
|
| | with gr.Tab("Text to Music", id="text-to-music"): |
| | tabs["text_to_music"] = create_text_to_music_tab() |
| |
|
| | with gr.Tab("Music to Music", id="music-to-music"): |
| | tabs["music_to_music"] = create_music_to_music_tab() |
| |
|
| | with gr.Tab("Text to Image", id="text-to-image"): |
| | tabs["text_to_image"] = create_text_to_image_tab() |
| |
|
| | with gr.Tab("Image to Image", id="image-to-image"): |
| | tabs["image_to_image"] = create_image_to_image_tab() |
| |
|
| | with gr.Tab("Text to Video", id="text-to-video"): |
| | tabs["text_to_video"] = create_text_to_video_tab() |
| |
|
| | with gr.Tab("Image to Video", id="image-to-video"): |
| | tabs["image_to_video"] = create_image_to_video_tab() |
| |
|
| | return tabs |
| |
|