import streamlit as st import requests import time import os from moviepy.editor import VideoFileClip from heygen import upload_photo, create_video, get_video_status, download_video, list_talking_photos, split_video, AUDIO_URL from utils import * # Streamlit App Configuration st.set_page_config( page_title="Number to Video", page_icon="🎥", initial_sidebar_state="expanded", ) # Session State Initialization if "talking_photo_id" not in st.session_state: st.subheader("Photo Requirements") st.write(""" - The face should be intact and clearly visible. - Preferably use real human faces. - Ensure only one face is visible in the photo. - Face resolution should be larger than 200x200 pixels. - The photo should be in JPEG or PNG format. """) st.image("sample.jpg", use_container_width=True) st.session_state.talking_photo_id = None if "video_id" not in st.session_state: st.session_state.video_id = None if "video_url" not in st.session_state: st.session_state.video_url = None # Sidebar st.sidebar.title("Settings") uploaded_photo = st.sidebar.file_uploader("Upload a photo", type=["jpeg", "png"]) upload = st.sidebar.button("Upload Photo", use_container_width=True) if uploaded_photo and upload: file_path = f"uploaded_photo.{uploaded_photo.type.split('/')[1]}" with open(file_path, "wb") as f: f.write(uploaded_photo.read()) file_type = "image/jpeg" if uploaded_photo.type in ["image/jpg", "image/jpeg"] else "image/png" st.session_state.talking_photo_id = upload_photo(file_path, file_type) st.info("Photo uploaded successfully.") st.info("Now generate the video.") # Video Creation if st.session_state.talking_photo_id: create_video_button = st.sidebar.button("Generate Video", use_container_width=True, key="generate_video") if create_video_button: title="Number to Video" st.session_state.video_id = create_video(title, st.session_state.talking_photo_id, AUDIO_URL) # st.sidebar.write(f"Video ID: {st.session_state.video_id}") # Video Status Check if st.session_state.video_id: with st.spinner("Generating video... This may take 2-5 minutes."): while True: video_status = get_video_status(st.session_state.video_id) st.sidebar.info(f"Video Status: {video_status['status']}") if video_status["status"] == "completed": st.session_state.video_url = video_status["video_url"] st.sidebar.info("Video generation completed.") break elif video_status["status"] == "failed": st.sidebar.warning("Video generation failed. Please try again.") break time.sleep(20) # Video Download and Display if st.session_state.video_url: video_id = st.session_state.video_id video_url = st.session_state.video_url if not os.path.exists(f"{video_id}.mp4"): download_video(video_id, video_url) split_video(video_id) video_path = f"{video_id}.mp4" # download_video(video_id, video_url) # split_video(video_id) # Input number number = st.text_input("Enter a number between 1 and 99,99,999", "24") number = int(number) col1, col2 = st.columns(2) with col1: with st.container(border=True): # st.subheader("Photo avatar") # st.divider() # st.image("uploaded_photo.jpg", use_container_width=True) # Generate clip sequence based on the number clips = generate_clip_sequence(number) if clips: st.write("Generated Clips Sequence:") st.divider() for i, clip in enumerate(clips): st.write(f"Clip {i + 1}: {clip}") submit = st.button("Create Video", use_container_width=True, key="create_video") with col2: with st.container(border=True): st.subheader("Output") output_file = f"{video_id}_{number}_output.mp4" if submit: combine_video(number, video_id, output_file) st.video(output_file, autoplay=True)