presentation / app.py
arif670's picture
Update app.py
e14ebc1 verified
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)