|
import streamlit as st |
|
import os |
|
import tempfile |
|
import uuid |
|
import logging |
|
from utils import get_summarization, get_image_prompts, segments_to_chunks, generate_images, generate_video |
|
import constants |
|
from groq import Groq |
|
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') |
|
logger = logging.getLogger() |
|
|
|
client = Groq() |
|
|
|
|
|
if 'session_id' not in st.session_state: |
|
st.session_state.session_id = str(uuid.uuid4()) |
|
logger.info(f"New session created with ID: {st.session_state.session_id}") |
|
|
|
session_id = st.session_state.session_id |
|
|
|
|
|
state_variables = [ |
|
'transcript_visible', 'uploaded_file_name', |
|
'audio', 'was_converted', 'transcript', |
|
'generated_video', 'image_prompts', 'generated_images', 'video_generated', |
|
'summary' |
|
] |
|
|
|
for var in state_variables: |
|
if f'{var}_{session_id}' not in st.session_state: |
|
st.session_state[f'{var}_{session_id}'] = None |
|
logger.info(f"Initialized state variable: {var}_{session_id}") |
|
|
|
|
|
st.markdown( |
|
"<h1 style='text-align: center;'>AI Video Generator</h1>", |
|
unsafe_allow_html=True |
|
) |
|
st.markdown("<p style='text-align: center;'>Leave a Like if it works for you! ❤️</p>", unsafe_allow_html=True) |
|
st.info("**Video Generation Feature** - Functional But Can be Buggy") |
|
|
|
|
|
audio_option = st.radio("Choose audio input method:", ("Upload Audio File", "Record Audio"), horizontal=True) |
|
|
|
if audio_option == "Upload Audio File": |
|
|
|
audio_file = st.file_uploader("🔼 Upload your audio file:", type=constants.SUPPORTED_FORMATS) |
|
else: |
|
audio_file = st.audio_input("🔊 Record Audio") |
|
|
|
logger.debug(f"Audio option selected: {audio_option}") |
|
|
|
if audio_file: |
|
logger.info(f"Audio file received: {audio_file.name}") |
|
|
|
|
|
if st.session_state[f'uploaded_file_name_{session_id}'] != audio_file.name: |
|
st.session_state[f'uploaded_file_name_{session_id}'] = audio_file.name |
|
st.session_state[f'audio_{session_id}'] = audio_file |
|
st.session_state[f'transcript_{session_id}'] = None |
|
st.session_state[f'image_prompts_{session_id}'] = None |
|
st.session_state[f'generated_images_{session_id}'] = None |
|
st.session_state[f'generated_video_{session_id}'] = None |
|
st.session_state[f'video_generated_{session_id}'] = False |
|
logger.info("State variables reset due to new audio file upload.") |
|
|
|
|
|
file_bytes = audio_file.read() |
|
logger.debug("Audio file bytes read successfully.") |
|
|
|
|
|
try: |
|
result = client.audio.transcriptions.create( |
|
file=(audio_file.name, file_bytes), |
|
model="whisper-large-v3-turbo", |
|
prompt="Take Note of Overall Context of the Audio", |
|
response_format="verbose_json", |
|
temperature=0.0, |
|
) |
|
st.session_state[f'transcript_{session_id}'] = result.text |
|
st.session_state[f'segments_{session_id}'] = result.segments |
|
logger.info("Transcription created successfully.") |
|
except Exception as e: |
|
logger.error(f"Error during transcription: {e}") |
|
st.error("An error occurred during transcription.") |
|
|
|
st.audio(st.session_state[f'audio_{session_id}'], format=f"audio/{audio_file.type}") |
|
|
|
|
|
toggle_transcript = st.checkbox("Show Transcript", value=st.session_state[f'transcript_visible_{session_id}'], key="toggle_transcript") |
|
st.session_state[f'transcript_visible_{session_id}'] = toggle_transcript |
|
|
|
if st.session_state[f'transcript_visible_{session_id}']: |
|
st.write("### Transcription:") |
|
st.write(st.session_state[f'transcript_{session_id}']) |
|
|
|
|
|
if st.session_state[f'transcript_{session_id}'] and st.session_state[f'summary_{session_id}'] is None: |
|
with st.spinner("Generating summary... Please wait."): |
|
st.session_state[f'summary_{session_id}'] = get_summarization(st.session_state[f'transcript_{session_id}']) |
|
logger.info("Summary generated successfully.") |
|
|
|
|
|
if st.session_state[f'transcript_{session_id}'] and st.session_state[f'image_prompts_{session_id}'] is None: |
|
with st.spinner("Generating image prompts... Please wait."): |
|
st.session_state[f'image_prompts_{session_id}'] = get_image_prompts( |
|
segments_to_chunks(st.session_state[f'segments_{session_id}']), |
|
st.session_state[f'summary_{session_id}'] |
|
)['image_prompts'] |
|
logger.info("Image prompts generated successfully.") |
|
|
|
|
|
if f'generated_images_{session_id}' not in st.session_state or st.session_state[f'generated_images_{session_id}'] is None: |
|
st.session_state[f'generated_images_{session_id}'] = [] |
|
|
|
|
|
if st.session_state[f'image_prompts_{session_id}'] and not st.session_state[f'generated_images_{session_id}']: |
|
progress_placeholder = st.empty() |
|
progress_bar = st.progress(0) |
|
total_images = len(st.session_state[f'image_prompts_{session_id}']) |
|
progress_placeholder.text(f"Generating images. Please be patient...") |
|
|
|
for idx, (prompt, image_path) in enumerate(generate_images(st.session_state[f'image_prompts_{session_id}'])): |
|
st.session_state[f'generated_images_{session_id}'].append((prompt, image_path)) |
|
progress = (idx + 1) / total_images |
|
progress_bar.progress(progress) |
|
progress_placeholder.text(f"Generated image {idx + 1} of {total_images}: {prompt[:50]}...") |
|
|
|
progress_placeholder.text("✅ All images generated successfully!") |
|
progress_bar.empty() |
|
logger.info("All images generated successfully.") |
|
|
|
|
|
if st.session_state[f'generated_images_{session_id}'] and st.session_state[f'audio_{session_id}'] and not st.session_state[f'video_generated_{session_id}']: |
|
with st.spinner("Generating video... Please wait."): |
|
|
|
temp_dir = tempfile.gettempdir() |
|
video_filename = f"generated_video_{session_id}.mp4" |
|
video_path = os.path.join(temp_dir, video_filename) |
|
|
|
|
|
image_paths = [img[1] for img in st.session_state[f'generated_images_{session_id}']] |
|
generated_video_path = generate_video( |
|
audio_file=st.session_state[f'audio_{session_id}'], |
|
images=image_paths, |
|
segments=st.session_state[f'segments_{session_id}'] |
|
) |
|
st.session_state[f'generated_video_{session_id}'] = generated_video_path |
|
st.session_state[f'video_generated_{session_id}'] = True |
|
st.success("Video generated successfully!") |
|
logger.info("Video generated successfully.") |
|
|
|
|
|
if st.session_state[f'generated_video_{session_id}']: |
|
st.video(st.session_state[f'generated_video_{session_id}']) |
|
|
|
|
|
with open(st.session_state[f'generated_video_{session_id}'], "rb") as file: |
|
st.download_button( |
|
label="Download Video", |
|
data=file, |
|
file_name=f"generated_video_{session_id}.mp4", |
|
mime="video/mp4" |
|
) |
|
|
|
else: |
|
st.warning("Please upload an audio file to proceed.") |
|
logger.warning("No audio file uploaded.") |
|
|
|
|
|
|