milestone-5 / app.py
THERISHY's picture
Update app.py
2b8fe24
Raw
History Blame Contribute Delete
3.51 kB
import streamlit as st
import os
from pytube import YouTube
from bs4 import BeautifulSoup
from moviepy.editor import VideoFileClip
import whisper
import argostranslate.package
import argostranslate.translate
import torch
st.title("Foreign Whispers")
form = st.form("input URL")
url = form.text_input('Full Youtube VideoURL:',value='',placeholder='Full Youtube VideoURL')
form.form_submit_button("Get Video subs")
def get_videotext(url):
download_dir_video = "downloaded_videos"
os.makedirs(download_dir_video, exist_ok=True)
download_dir_captions = "downloaded_captions"
os.makedirs(download_dir_captions, exist_ok=True)
yt = YouTube(url)
video = yt.streams.filter(file_extension='mp4', res="720p").first()
video.download(output_path=download_dir_video)
#get audio
audio_dir = "audio"
os.makedirs(audio_dir, exist_ok=True)
video_filename = os.listdir(download_dir_video)[0]
audio_file_name = os.path.splitext(video_filename)[0]
video_file_path = os.path.join(download_dir_video, video_filename)
audio_file_path = os.path.join(audio_dir, f"{audio_file_name}.wav")
video = VideoFileClip(video_file_path)
video.audio.write_audiofile(audio_file_path)
##audio to text
model = whisper.load_model("base")
result = model.transcribe(os.path.join(audio_dir, f"{audio_file_name}.wav"))
segments = result.get("segments", [])
time_results = []
text_results = []
for segment in segments:
start_time_sec = segment.get("start", 0.0)
start_time_formatted = "{:02d}:{:02d}:{:06.3f}".format(
int(start_time_sec // 3600),
int((start_time_sec % 3600) // 60),
start_time_sec % 60
)
time_results.append(start_time_formatted)
text_results.append(segment.get("text", "").strip())
from_code = "en"
to_code = "zh"
argostranslate.package.update_package_index()
available_packages = argostranslate.package.get_available_packages()
package_to_install = next(
filter(
lambda x: x.from_code == from_code and x.to_code == to_code, available_packages
)
)
argostranslate.package.install_from_path(package_to_install.download())
translated_text_results = [argostranslate.translate.translate(text, from_code, to_code) for text in text_results]
return time_results, text_results, translated_text_results
print(url)
column_width = 100
with st.spinner('Generating🤔...'):
if url:
time_results, text_results, translated_text_results= get_videotext(url)
table_style = """
<style>
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
color: black;
}
</style>
"""
table_header = "<tr><th>TimeStamp</th><th>Original</th><th>Translated</th></tr>"
table_rows = "".join(f"<tr><td>{time}</td><td>{text}</td><td>{translated_text}</td></tr>"
for time, text, translated_text in zip(time_results, text_results, translated_text_results))
table_html = f"<table>{table_header}{table_rows}</table>"
st.write(table_style, unsafe_allow_html=True)
st.write(table_html, unsafe_allow_html=True)