Spaces:
Sleeping
Sleeping
| import os | |
| os.system('pip install moviepy imageio[ffmpeg]') | |
| from moviepy.editor import * | |
| import streamlit as st | |
| import openai | |
| from googleapiclient.discovery import build | |
| from googleapiclient.http import MediaFileUpload | |
| import requests | |
| from PIL import Image | |
| from io import BytesIO | |
| import os | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| # Setup API keys | |
| google_api_key = AIzaSyBYfDKsd8jGFs3dNijZo62n9fiD4D2ewmI | |
| google_drive_folder_id = "1kE94BgYdAiCHFSCDa6jhCyJcPEv94cQ-" | |
| def generate_presentation_text(input_data): | |
| """Generate presentation content based on input data using GPT.""" | |
| prompt = f"Generate a professional presentation based on the following details:\n{input_data}\nInclude slide titles, bullet points, and a brief summary for each slide." | |
| response = openai.ChatCompletion.create( | |
| model="gpt-4", | |
| messages=[{"role": "user", "content": prompt}], | |
| temperature=0.7 | |
| ) | |
| return response['choices'][0]['message']['content'] | |
| def fetch_background_image(query): | |
| """Fetch background image from Unsplash or another source.""" | |
| url = f"https://source.unsplash.com/1920x1080/?{query}" | |
| response = requests.get(url) | |
| if response.status_code == 200: | |
| return Image.open(BytesIO(response.content)) | |
| else: | |
| return None | |
| def create_google_docs_presentation(presentation_text, output_file): | |
| """Create a Google Docs presentation using the Google Drive API.""" | |
| try: | |
| # Google Docs API setup | |
| service = build('drive', 'v3', developerKey=google_api_key) | |
| # Write the text to a .docx file | |
| with open(output_file, "w") as doc_file: | |
| doc_file.write(presentation_text) | |
| # Upload the document to Google Drive | |
| file_metadata = { | |
| "name": "Presentation.docx", | |
| "parents": [google_drive_folder_id], | |
| "mimeType": "application/vnd.google-apps.document" | |
| } | |
| media = MediaFileUpload(output_file, mimetype="application/vnd.openxmlformats-officedocument.wordprocessingml.document") | |
| uploaded_file = service.files().create(body=file_metadata, media_body=media, fields="id").execute() | |
| return f"https://docs.google.com/document/d/{uploaded_file.get('id')}/edit" | |
| except Exception as e: | |
| return str(e) | |
| def generate_presentation_video(slides): | |
| """Generate a video presentation from slides using MoviePy.""" | |
| clips = [] | |
| for slide in slides: | |
| text = slide.get("title") + "\n\n" + "\n".join(slide.get("points")) | |
| img = fetch_background_image(slide.get("image_query")) | |
| if img: | |
| img.save("slide.jpg") | |
| else: | |
| img = Image.new("RGB", (1920, 1080), color=(255, 255, 255)) | |
| img.save("slide.jpg") | |
| # Add text overlay to the image | |
| clip = ImageClip("slide.jpg").set_duration(5).fx(vfx.fadein, 1) | |
| text_clip = TextClip(text, fontsize=50, color='white', size=clip.size).set_duration(5) | |
| text_clip = text_clip.set_position("center") | |
| combined = CompositeVideoClip([clip, text_clip]) | |
| clips.append(combined) | |
| # Combine all clips | |
| final_video = concatenate_videoclips(clips, method="compose") | |
| final_video.write_videofile("presentation_video.mp4", fps=24) | |
| return "presentation_video.mp4" | |
| # Streamlit app UI | |
| st.title("Presentation Builder App") | |
| st.subheader("Generate a Google Docs presentation and an AI-powered video presentation.") | |
| # Input form | |
| with st.form("presentation_form"): | |
| st.write("**Enter your presentation details:**") | |
| input_data = st.text_area("Input Details (e.g., project goals, objectives, etc.)") | |
| video = st.checkbox("Generate AI video of presentation (optional)") | |
| submitted = st.form_submit_button("Generate Presentation") | |
| if submitted: | |
| st.write("Generating presentation...") | |
| presentation_text = generate_presentation_text(input_data) | |
| st.success("Presentation text generated!") | |
| # Display generated text | |
| st.write("**Generated Presentation:**") | |
| st.text_area("Generated Presentation", value=presentation_text, height=300) | |
| # Create Google Docs output | |
| doc_url = create_google_docs_presentation(presentation_text, "presentation.docx") | |
| if "http" in doc_url: | |
| st.success("Google Docs presentation created!") | |
| st.write(f"[View Document]({doc_url})") | |
| else: | |
| st.error("Error creating Google Docs presentation.") | |
| st.write(doc_url) | |
| # Generate video (optional) | |
| if video: | |
| slides = [ | |
| {"title": "Slide 1", "points": ["Point 1", "Point 2"], "image_query": "technology"}, | |
| {"title": "Slide 2", "points": ["Point 1", "Point 2"], "image_query": "business"}, | |
| ] | |
| video_path = generate_presentation_video(slides) | |
| st.success("Video presentation created!") | |
| st.video(video_path) | |