Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import subprocess | |
| import tempfile | |
| from pathlib import Path | |
| # Set environment variables | |
| os.environ['SDL_AUDIODRIVER'] = 'dummy' | |
| os.environ['XDG_RUNTIME_DIR'] = '/tmp' | |
| def generate_story_video(topic, groq_api_key, pexels_key): | |
| """Generate story video from topic""" | |
| if not groq_api_key or not pexels_key: | |
| return None, "Please provide both API keys" | |
| # Set API keys | |
| os.environ['GROQ_API_KEY'] = groq_api_key | |
| os.environ['PEXELS_KEY'] = pexels_key | |
| try: | |
| # Run the original app.py script | |
| result = subprocess.run([ | |
| 'python', 'story_generator.py', topic | |
| ], capture_output=True, text=True, timeout=300) | |
| if result.returncode == 0: | |
| # Check if video was generated | |
| video_path = 'rendered_video.mp4' | |
| if os.path.exists(video_path): | |
| return video_path, "Video generated successfully!" | |
| else: | |
| return None, "Video generation completed but file not found" | |
| else: | |
| return None, f"Error: {result.stderr}" | |
| except subprocess.TimeoutExpired: | |
| return None, "Generation timed out (5 minutes limit)" | |
| except Exception as e: | |
| return None, f"Error: {str(e)}" | |
| # Create Gradio interface | |
| with gr.Blocks(title="StoryForge - AI Story Video Generator") as demo: | |
| gr.Markdown("# 🎬 StoryForge") | |
| gr.Markdown("Transform any topic into a fully-rendered, narrated short video with AI-generated script, voiceover, and background visuals.") | |
| with gr.Row(): | |
| with gr.Column(): | |
| topic_input = gr.Textbox( | |
| label="Story Topic", | |
| placeholder="e.g., Adventure journey of a boy in a small town", | |
| lines=2 | |
| ) | |
| groq_key = gr.Textbox( | |
| label="Groq API Key", | |
| placeholder="Your Groq API key for script generation", | |
| type="password" | |
| ) | |
| pexels_key = gr.Textbox( | |
| label="Pexels API Key", | |
| placeholder="Your Pexels API key for background videos", | |
| type="password" | |
| ) | |
| generate_btn = gr.Button("Generate Story Video", variant="primary") | |
| with gr.Column(): | |
| output_video = gr.Video(label="Generated Video") | |
| status_text = gr.Textbox(label="Status", interactive=False) | |
| # API Key instructions | |
| gr.Markdown(""" | |
| ### 🔑 Getting API Keys: | |
| - **Groq API**: Sign up at [console.groq.com](https://console.groq.com) for free LLM access | |
| - **Pexels API**: Get free key at [pexels.com/api](https://www.pexels.com/api/) | |
| ### ⏱️ Processing Time: | |
| Video generation typically takes 2-5 minutes depending on content complexity. | |
| """) | |
| generate_btn.click( | |
| fn=generate_story_video, | |
| inputs=[topic_input, groq_key, pexels_key], | |
| outputs=[output_video, status_text] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(server_name="0.0.0.0", server_port=7860) |