File size: 4,363 Bytes
736d327
 
 
 
 
6903bca
23e8597
736d327
 
23e8597
 
 
 
3eba90e
e89f57c
 
 
23e8597
a88794e
 
e89f57c
23e8597
a88794e
 
 
 
e89f57c
 
a88794e
770992d
e89f57c
 
a88794e
e89f57c
a88794e
 
3eba90e
a88794e
e89f57c
23e8597
a88794e
 
 
 
e89f57c
 
 
 
 
a88794e
e89f57c
a88794e
 
3eba90e
a88794e
e89f57c
23e8597
a88794e
 
 
 
e89f57c
 
 
 
 
 
 
 
 
 
a88794e
e89f57c
23e8597
 
 
 
 
a88794e
 
e89f57c
23e8597
3eba90e
e89f57c
 
736d327
23e8597
 
 
736d327
23e8597
736d327
23e8597
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
736d327
b0d56ee
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
120
121
122
123
from moviepy import VideoFileClip
import gradio as gr
import requests
import os
import time
from gradio_client import Client, handle_file
from pathlib import Path


# Store processed videos temporarily
PROCESSED_DIR = "processed_videos"
Path(PROCESSED_DIR).mkdir(exist_ok=True)

def main(url, parameters, progress=gr.Progress()):
    try:
        font_type, font_size, font_color, service, target, style, subject = parameters.split(',')
        progress(0, desc="پردازش شروع شد")
        yield "پردازش شروع شد", gr.DownloadButton.update(visible=False)

        # Transcription Stage
        progress(0.35, desc="تبدیل صوت به متن")
        yield "تبدیل صوت به متن", gr.DownloadButton.update(visible=False)
        
        transcribe_client = Client("rayesh/transcribe")
        try:
            job = transcribe_client.submit(url, api_name="/transcribe")
            while not job.done():
                time.sleep(0.5)
                
            results = job.outputs()[0]
            if len(results) != 3:
                raise ValueError(f"Expected 3 outputs, got {len(results)}")
                
            srt_file, video, mp3_file = results
        finally:
            transcribe_client.close()

        # Translation Stage
        progress(0.55, desc="در حال ترجمه")
        yield "در حال ترجمه", gr.DownloadButton.update(visible=False)
        
        translate_client = Client("rayesh/translate")
        try:
            job = translate_client.submit(
                handle_file(srt_file),
                3000,
                api_name="/translate"
            )
            while not job.done():
                time.sleep(0.3)
            subtitle_file = job.outputs()[0]
        finally:
            translate_client.close()

        # Video Processing Stage
        progress(0.75, desc="پردازش ویدئو")
        yield "درحال پردازش ویدئو", gr.DownloadButton.update(visible=False)
        
        video_client = Client("SPACERUNNER99/video_edite")
        try:
            job = video_client.submit(
                handle_file(subtitle_file),
                {"video": handle_file(video["video"])},
                font_color,
                font_type,
                font_size,
                handle_file(mp3_file),
                api_name="/video_edit"
            )
            while not job.done():
                time.sleep(0.5)
                
            output_video = job.outputs()[0]['video']
            
            # Save to processed directory with unique name
            final_path = str(Path(PROCESSED_DIR) / f"output_{int(time.time())}.mp4")
            Path(output_video).rename(final_path)
            
        finally:
            video_client.close()

        yield "پردازش کامل شد", gr.DownloadButton.update(value=final_path, visible=True)

    except Exception as e:
        raise gr.Error(f"خطا در پردازش: {str(e)}")

def after_download():
    return [gr.DownloadButton.update(visible=False), gr.Button.update(visible=True)]

with gr.Blocks() as demo:
    gr.Markdown("## ویدئو خود را آپلود کنید یا لینک وارد نمایید")
    with gr.Column():
        progress_output = gr.Textbox(label="وضعیت پردازش", visible=False)
        with gr.Row():
            video_file_input = gr.Text(label="لینک ویدئو")
            upload_btn = gr.UploadButton("فایل ویدئویی", file_types=["video/*"])
        parameters = gr.Text(label="تنظیمات زیرنویس (فونت,اندازه,رنگ)")
        create_btn = gr.Button("شروع پردازش")
        download_btn = gr.DownloadButton("دانلود ویدئو نهایی", visible=False)
    
    # Handle file upload
    upload_btn.upload(
        lambda f: [gr.Textbox.update(value=f.name), gr.DownloadButton.update(visible=False)],
        upload_btn,
        [video_file_input, download_btn]
    )
    
    # Processing handler
    create_btn.click(
        fn=main,
        inputs=[video_file_input, parameters],
        outputs=[progress_output, download_btn],
        concurrency_limit=4,
    )
    
    # Download completion handler
    download_btn.click(
        fn=after_download,
        inputs=None,
        outputs=[download_btn, create_btn]
    )

demo.launch(debug=True)