qqwjq1981's picture
Rename main.py to app.py
17d314e verified
from typing import Dict
import gradio as gr
import json
from cinematic_planning import build_scene_sequence
from generation import generate_video
from prompt_template_control import generate_video_prompt_with_template
from storyboard import generate_multiple_storyboards
def save_storyboard_choice(choice: Dict[str, str]):
# Save the full dictionary as JSON (append mode)
with open("selected_storyboards.json", "a") as f:
f.write(json.dumps(choice) + "\n")
return f"βœ… Saved your selection to selected_storyboards.json:\n\n{json.dumps(choice, indent=2)}"
# Connect button
def run_pseudo_video_workflow(scene, shot_type, emotion, model_choice, num_keyframes):
# Build storyboard dict
storyboard = {
"scene": scene,
"shot_type": shot_type,
"emotion": emotion
}
# Call your iterative builder
scene_sequence = build_scene_sequence(
storyboard, model_choice, num_keyframes=num_keyframes
)
# Format result as text
result_text = ""
for i, step in enumerate(scene_sequence):
result_text += f"\nKeyframe {i + 1}:\n"
result_text += f"Transition: {step['transition_text']}\n"
result_text += f"Video Path: {step['video_path']}\n"
return result_text
if __name__ == "__main__":
with gr.Blocks() as demo:
gr.Markdown("# πŸŽ₯ Video Generator")
# Video Generator Interface
with gr.Row():
with gr.Column():
video_prompt = gr.Textbox(label="Enter your video prompt")
negative_prompt = gr.Textbox(label="Enter your negative prompt (optional: Wan2.1 Only)")
model_choice = gr.Radio(
choices=["SkyReels-V2", "Wan2.1", "Veo-2", "T2V-01-Director"],
label="Choose the video generation model"
)
generate_btn = gr.Button("Generate Video")
with gr.Column():
video_output = gr.Video(label="Generated Video")
generate_btn.click(
generate_video,
inputs=[video_prompt, model_choice, negative_prompt],
outputs=video_output
)
# Divider
gr.Markdown("---")
# Narrative to Storyboard interface
gr.Markdown("# 🎬 Narrative to Storyboard Grounding")
narrative_input = gr.Textbox(label="Enter your narrative")
generate_storyboards_btn = gr.Button("Generate 5 Storyboards")
storyboards_output = gr.Radio(
choices=[],
label="Select your preferred storyboard"
)
save_choice_btn = gr.Button("Save Selection")
save_output = gr.Textbox(label="Save Output", interactive=False)
# Generate the storyboards
def update_storyboards(narrative):
cards = generate_multiple_storyboards(narrative)
return gr.update(choices=cards)
generate_storyboards_btn.click(
update_storyboards,
inputs=narrative_input,
outputs=storyboards_output
)
# Save the choice
save_choice_btn.click(
save_storyboard_choice,
inputs=storyboards_output,
outputs=save_output
)
gr.Markdown("---")
# Prompt Injection + Template Control
gr.Markdown("# πŸŽ₯ Prompt Injection + Template Control (LLM + T2V)")
# Modular controls
role_input = gr.Textbox(label="Role", placeholder="e.g., Product demo")
setting_input = gr.Textbox(label="Setting", placeholder="e.g., Urban bar")
emotion_input = gr.Textbox(label="Emotion", placeholder="e.g., Energetic")
shot_input = gr.Textbox(label="Shot Type", placeholder="e.g., Front-facing")
duration_input = gr.Textbox(label="Duration", placeholder="e.g., 5s loop")
# Model selection
model_choice = gr.Radio(
choices=["SkyReels-V2", "Veo-2", "Runway", "T2V-01-Director"],
label="Choose video generation model"
)
# Generate final natural language prompt
generate_prompt_btn = gr.Button("Generate Final Prompt")
final_prompt_output = gr.Textbox(label="Final Video Prompt", interactive=False)
# Generate video
generate_video_btn = gr.Button("Generate Video")
video_output = gr.Video(label="Generated Video")
# Connect callbacks
generate_prompt_btn.click(
generate_video_prompt_with_template,
inputs=[role_input, setting_input, emotion_input, shot_input, duration_input],
outputs=final_prompt_output
)
generate_video_btn.click(
generate_video,
inputs=[final_prompt_output, model_choice, negative_prompt],
outputs=video_output
)
gr.Markdown("# 🎞️ Pseudo Video Workflow (Storyboard β†’ Scene Builder)")
# Storyboard inputs
pseudo_scene_input = gr.Textbox(label="Scene", placeholder="e.g., Misty forest")
pseudo_shot_input = gr.Textbox(label="Shot Type", placeholder="e.g., Wide shot")
pseudo_emotion_input = gr.Textbox(label="Emotion", placeholder="e.g., Mysterious")
pseudo_model_choice = gr.Radio(
choices=["SkyReels-V2", "Wan2.1", "Veo-2", "T2V-01-Director"],
label="Choose video generation model"
)
num_keyframes_input = gr.Slider(minimum=1, maximum=20, value=12, label="Number of Keyframes")
run_pseudo_video_btn = gr.Button("Build Pseudo Video Workflow")
pseudo_output = gr.Textbox(label="Workflow Result", lines=10)
# Hook to Gradio button
run_pseudo_video_btn.click(
run_pseudo_video_workflow,
inputs=[
pseudo_scene_input,
pseudo_shot_input,
pseudo_emotion_input,
pseudo_model_choice,
num_keyframes_input
],
outputs=pseudo_output
)
demo.launch()