File size: 4,107 Bytes
0835fb6
a3cd4b3
0835fb6
 
e7124c9
e129053
e8d7638
2fcdb31
cb1ba7f
23d4cfa
 
8bec4e8
 
 
 
 
 
 
0835fb6
a3cd4b3
8bec4e8
de207be
8bec4e8
 
 
 
 
 
0835fb6
c980ffd
47db964
a3cd4b3
47db964
 
a3cd4b3
 
47db964
 
 
a3cd4b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0835fb6
 
a3cd4b3
0835fb6
a3cd4b3
 
7090097
a3cd4b3
 
 
 
 
 
 
 
 
 
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
from transcribe import transcribe
from moviepy import VideoFileClip
from translate import translate  
from edite_video import video_edit
import gradio as gr
import requests
import os
from dub import dub


def extract_audio(input_video_name):
    # Define the input video file and output audio file
    mp3_file = "audio.mp3"
    # Load the video clip
    video_clip = VideoFileClip(input_video_name)

    # Extract the audio from the video clip
    audio_clip = video_clip.audio
    duration = audio_clip.duration
    print(f"Audio duration: {duration}")
    # Write the audio to a separate file
    audio_clip.write_audiofile(mp3_file)

    # Close the video and audio clips
    audio_clip.close()
    video_clip.close()

    print("Audio extraction successful!")
    return mp3_file, duration


def download_video(url):
    response = requests.get(url, stream=True)
    response.raise_for_status()
    video_file = "video.mp4"
    with open(video_file, 'wb') as file:
        for chunk in response.iter_content(chunk_size=8192):
            if chunk:
                file.write(chunk)
    print("Video downloaded successfully!")
    return video_file


def main(url, clip_type, parameters, progress=gr.Progress()):
    """
    This function reports progress by yielding intermediate updates. 
    Gradio watches these yields to update the progress bar.
    """
    if clip_type == "dub":
        progress(0, desc="پردازش شروع شد")
        yield "پردازش شروع شد", None

        video = download_video(url)
        progress(5, desc="در حال دریافت ویدئو")
        yield "در حال دریافت ویدئو", None

        mp3_file, duration = extract_audio(video)
        progress(10, desc="استخراج صوت")
        yield "استخراج صوت", None

        srt_list = transcribe(mp3_file)
        progress(35, desc="تبدیل متن به صوت")
        yield "تبدیل متن به صوت", None

        subtitle_file = translate(srt_list)
        progress(55, desc="در حال ترجمه")
        yield "در حال ترجمه", None

        output_video_file = dub(subtitle_file, video)
        progress(100, desc="Dubbing complete")
        yield "درحال پردازش ویدئو", output_video_file
        os.remove(subtitle_file)

    else:
        # Assume parameters is a comma-separated string: "color,font"
        color, font = parameters.split(",")
        progress(0, desc="پردازش شروع شد")
        yield "پردازش شروع شد", None

        video = download_video(url)
        progress(5, desc="در حال دریافت ویدئو")
        yield "در حال دریافت ویدئو", None

        mp3_file, duration = extract_audio(video)
        progress(10, desc="استخراج صوت")
        yield "استخراج صوت", None

        srt_list = transcribe(mp3_file)
        progress(35, desc="تبدیل متن به صوت")
        yield "تبدیل متن به صوت", None

        subtitle_file = translate(srt_list)
        progress(55, desc="در حال ترجمه")
        yield "در حال ترجمه", None

        
        output_video_file = video_edit(subtitle_file, video, color, font, input_audio="audio.mp3")
        progress(100, desc="Video editing complete")
        yield "درحال پردازش ویدئو", output_video_file
        os.remove(subtitle_file)


with gr.Blocks() as demo:
    gr.Markdown("Start typing below and then click **Run** to see the progress and final output.")
    with gr.Column():
        progress_output = gr.Textbox(label="Progress", visible=False)
        video_file_input = gr.Text(label="Video URL")
        clip_type = gr.Dropdown(["dub", "sub"], label="Clip Type")
        parameters = gr.Text(label="Additional Parameters (for subtitles: color,font)")
        btn = gr.Button("Create")
        video_file_output = gr.Video(label="Result Video")
        btn.click(
            fn=main,
            inputs=[video_file_input, clip_type, parameters],
            outputs=[progress_output, video_file_output],
        )

demo.launch(debug=True)