File size: 4,919 Bytes
efe586f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import streamlit as st
import os
import subprocess
import time
from PIL import Image
from io import BytesIO

from persona import Persona

url = 'https://iiitaphyd-my.sharepoint.com/personal/radrabha_m_research_iiit_ac_in/_layouts/15/download.aspx?share=EdjI7bZlgApMqsVoEUUXpLsBxqXbn5z8VTmoxp55YNDcIA'
output_path = 'wav2lip/wav2lip_gan.pth'

# Check if the file does not exist
if not os.path.exists(output_path):
    try:
        # Using subprocess to call wget
        subprocess.run(['wget', '-c', '--read-timeout=5', '-O', output_path, url], check=True)
    except subprocess.CalledProcessError as e:
        print(f"An error occurred: {e}")
else:
    print(f"The file '{output_path}' already exists.")

# Initialize a session state variable that tracks the sidebar state (either 'expanded' or 'collapsed').
if 'sidebar_state' not in st.session_state:
    st.session_state.sidebar_state = 'expanded'

# Streamlit page configuration
# st.set_page_config(page_title="Talking Head Generator", layout="wide")
st.set_page_config(initial_sidebar_state=st.session_state.sidebar_state, page_title="Talking Head Generator", layout="wide")

@st.cache_data
def generate_talking_head(text_prompt, voice, speed, image_file, driver_video):
    video_file = Persona(text_prompt, voice, speed, image_file, driver_video)
    time.sleep(5)  # Simulating processing time
    return video_file

@st.cache_data
def save_uploaded_file(uploaded_file, destination_dir="temp"):
    file_path = os.path.join(destination_dir, uploaded_file.name)
    
    # Create the destination directory if it doesn't exist
    os.makedirs(destination_dir, exist_ok=True)
    
    # Check if the source and destination are the same
    if os.path.abspath(uploaded_file.name) != os.path.abspath(file_path):
        try:
            with open(file_path, "wb") as f:
                f.write(uploaded_file.getbuffer())
            return file_path
        except Exception as e:
            st.error(f"Error saving file: {e}")
            return None
    else:
        # If the file already exists in the destination, return its path
        return file_path


# UI Layout
col1, col2, col3 = st.columns([0.5, 4, 1])

# Column 1: Input Prompt and Image Upload
with col1:
    # st.header("Your Inputs")
    # st.sidebar.markdown('Your Inputs')
    text_prompt = st.sidebar.text_area("Enter your text prompt:", height = 200)
    voice = st.sidebar.selectbox(
    'Choose Voices?',('alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'))
    speed = st.sidebar.slider('Talking speed?', 1, 10, 1)
    uploaded_image = st.sidebar.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])
    uploaded_driver_video = st.sidebar.file_uploader("Upload a driver video", type=["mp4"])

# Column 2: Display Logo, Title, Description and Trigger Button
with col2:
    st.image("images/logo1.jpg", width=650)
    #st.title("Talking Head Generator")
    # st.write("Generate realistic talking heads from **text prompts** and **images**.")
    generate_button = st.button("Generate Talking Head")
    st.write('β€’αŠαŠ||၊|။||||α‹β€Œβ€Œβ€Œβ€Œβ€ŒαŠ|  β€’   Voice Selected :', voice)

# Column 3: Download Button
with col3:
    st.subheader("##πŸŽ₯")
    display_video = st.empty()
    download_button = st.empty()


# Handling Button Click
if generate_button and text_prompt and voice and speed and uploaded_image and uploaded_driver_video:
    with st.spinner('Generating Talking Head...'):
        image_path = save_uploaded_file(uploaded_image)
        driver_video_path = save_uploaded_file(uploaded_driver_video)
        video_path = generate_talking_head(text_prompt, voice, speed, image_path, driver_video_path)
        # Display progress bar
        progress_bar = st.progress(0)
        for percent_complete in range(100):
            time.sleep(0.1)
            progress_bar.progress(percent_complete + 1)
        progress_bar.empty()
        # display video
        with display_video:
            if os.path.exists(video_path):
                video_file = open(video_path, 'rb')
                video_bytes = video_file.read()
                st.video(video_bytes)
            else:
                st.error("Video file not found. Please ensure the video generation process completes successfully.")
        # Show download button
        with download_button:
            if os.path.exists(video_path):
                with open(video_path, "rb") as file:
                    btn = st.download_button(
                        label="Download Video",
                        data=file,
                        file_name="talking_head.mp4",
                        mime="video/mp4")
            else:
                st.error("Video file not found. Please ensure the video generation process completes successfully.")
                

# Placeholder for external Python script integration
# This part should include the actual calls to the scripts provided.