File size: 3,507 Bytes
e5e22ee
6cd5edc
 
 
 
668129b
 
 
 
6cd5edc
80c3b35
 
26d882b
80c3b35
 
1b2859f
6cd5edc
26d882b
ebffca7
 
 
 
6f9d093
ebffca7
 
668129b
ebffca7
 
935b5df
 
ebffca7
 
 
935b5df
ebffca7
 
668129b
 
 
 
359f7a4
 
 
668129b
 
359f7a4
 
 
 
 
 
 
 
 
 
668129b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee60c69
43125f8
6fd36fe
26d882b
 
668129b
21bba44
 
 
 
 
 
 
 
 
 
 
 
 
680219b
21bba44
 
 
 
2b8fe24
21bba44
 
 
 
 
 
 
 
 
9ccaeb6
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
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)