2025-08-20 11:39:34 +08:00

125 lines
5.1 KiB
Python

import streamlit as st
import os, sys
from core.st_utils.imports_and_utils import *
from core import *
# SET PATH
current_dir = os.path.dirname(os.path.abspath(__file__))
os.environ['PATH'] += os.pathsep + current_dir
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
st.set_page_config(page_title="VideoLingo", page_icon="docs/logo.svg")
SUB_VIDEO = "output/output_sub.mp4"
DUB_VIDEO = "output/output_dub.mp4"
def text_processing_section():
st.header(t("b. Translate and Generate Subtitles"))
with st.container(border=True):
st.markdown(f"""
<p style='font-size: 20px;'>
{t("This stage includes the following steps:")}
<p style='font-size: 20px;'>
1. {t("WhisperX word-level transcription")}<br>
2. {t("Sentence segmentation using NLP and LLM")}<br>
3. {t("Summarization and multi-step translation")}<br>
4. {t("Cutting and aligning long subtitles")}<br>
5. {t("Generating timeline and subtitles")}<br>
6. {t("Merging subtitles into the video")}
""", unsafe_allow_html=True)
if not os.path.exists(SUB_VIDEO):
if st.button(t("Start Processing Subtitles"), key="text_processing_button"):
process_text()
st.rerun()
else:
if load_key("burn_subtitles"):
st.video(SUB_VIDEO)
download_subtitle_zip_button(text=t("Download All Srt Files"))
if st.button(t("Archive to 'history'"), key="cleanup_in_text_processing"):
cleanup()
st.rerun()
return True
def process_text():
with st.spinner(t("Using Whisper for transcription...")):
_2_asr.transcribe()
with st.spinner(t("Splitting long sentences...")):
_3_1_split_nlp.split_by_spacy()
_3_2_split_meaning.split_sentences_by_meaning()
with st.spinner(t("Summarizing and translating...")):
_4_1_summarize.get_summary()
if load_key("pause_before_translate"):
input(t("⚠️ PAUSE_BEFORE_TRANSLATE. Go to `output/log/terminology.json` to edit terminology. Then press ENTER to continue..."))
_4_2_translate.translate_all()
with st.spinner(t("Processing and aligning subtitles...")):
_5_split_sub.split_for_sub_main()
_6_gen_sub.align_timestamp_main()
with st.spinner(t("Merging subtitles to video...")):
_7_sub_into_vid.merge_subtitles_to_video()
st.success(t("Subtitle processing complete! 🎉"))
st.balloons()
def audio_processing_section():
st.header(t("c. Dubbing"))
with st.container(border=True):
st.markdown(f"""
<p style='font-size: 20px;'>
{t("This stage includes the following steps:")}
<p style='font-size: 20px;'>
1. {t("Generate audio tasks and chunks")}<br>
2. {t("Extract reference audio")}<br>
3. {t("Generate and merge audio files")}<br>
4. {t("Merge final audio into video")}
""", unsafe_allow_html=True)
if not os.path.exists(DUB_VIDEO):
if st.button(t("Start Audio Processing"), key="audio_processing_button"):
process_audio()
st.rerun()
else:
st.success(t("Audio processing is complete! You can check the audio files in the `output` folder."))
if load_key("burn_subtitles"):
st.video(DUB_VIDEO)
if st.button(t("Delete dubbing files"), key="delete_dubbing_files"):
delete_dubbing_files()
st.rerun()
if st.button(t("Archive to 'history'"), key="cleanup_in_audio_processing"):
cleanup()
st.rerun()
def process_audio():
with st.spinner(t("Generate audio tasks")):
_8_1_audio_task.gen_audio_task_main()
_8_2_dub_chunks.gen_dub_chunks()
with st.spinner(t("Extract refer audio")):
_9_refer_audio.extract_refer_audio_main()
with st.spinner(t("Generate all audio")):
_10_gen_audio.gen_audio()
with st.spinner(t("Merge full audio")):
_11_merge_audio.merge_full_audio()
with st.spinner(t("Merge dubbing to the video")):
_12_dub_to_vid.merge_video_audio()
st.success(t("Audio processing complete! 🎇"))
st.balloons()
def main():
logo_col, _ = st.columns([1,1])
with logo_col:
st.image("docs/logo.png", use_column_width=True)
st.markdown(button_style, unsafe_allow_html=True)
welcome_text = t("Hello, welcome to VideoLingo. If you encounter any issues, feel free to get instant answers with our Free QA Agent <a href=\"https://share.fastgpt.in/chat/share?shareId=066w11n3r9aq6879r4z0v9rh\" target=\"_blank\">here</a>! You can also try out our SaaS website at <a href=\"https://videolingo.io\" target=\"_blank\">videolingo.io</a> for free!")
st.markdown(f"<p style='font-size: 20px; color: #808080;'>{welcome_text}</p>", unsafe_allow_html=True)
# add settings
with st.sidebar:
page_setting()
st.markdown(give_star_button, unsafe_allow_html=True)
download_video_section()
text_processing_section()
audio_processing_section()
if __name__ == "__main__":
main()