File size: 3,802 Bytes
01c8adf
b328ffc
4e882ad
9785ef7
5afb15a
4e882ad
90747f7
9785ef7
 
 
db8da32
 
 
9785ef7
 
faab551
db8da32
 
 
 
 
 
 
183d3ae
90747f7
5afb15a
90747f7
5afb15a
90747f7
db8da32
b328ffc
 
faab551
b328ffc
db8da32
9785ef7
 
 
db8da32
90747f7
5afb15a
9785ef7
 
4e882ad
183d3ae
 
9785ef7
 
b328ffc
90747f7
9785ef7
faab551
db8da32
faab551
 
9785ef7
90747f7
9785ef7
5afb15a
db8da32
9785ef7
 
 
 
 
5afb15a
9785ef7
 
 
 
faab551
 
 
9785ef7
 
 
f9ebaf2
b328ffc
90747f7
 
5afb15a
 
90747f7
faab551
db8da32
 
 
 
 
9785ef7
90747f7
5afb15a
90747f7
b328ffc
183d3ae
faab551
 
 
 
90747f7
faab551
90747f7
183d3ae
90747f7
9785ef7
faab551
b328ffc
 
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
import cv2
import gradio as gr
from paddleocr import PaddleOCR
import os
import gc

# Time Formatter (SRT Standard)
def format_srt_time(seconds):
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

def extract_srt(video_path, lang_choice):
    if not video_path:
        return None
    
    lang_codes = {
        "Chinese (S)": "ch", "Chinese (T)": "chinese_cht", 
        "English": "en", "Japanese": "japan", 
        "Korean": "korean", "Thai": "th"
    }
    
    # Error ကင်းစေရန် Parameter α€‘α€žα€…α€Ία€™α€»α€¬α€Έα€–α€Όα€„α€·α€Ί α€•α€Όα€„α€Ία€†α€„α€Ία€‘α€¬α€Έα€žα€Šα€Ί
    try:
        ocr = PaddleOCR(use_angle_cls=True, lang=lang_codes[lang_choice], use_gpu=False)
    except Exception as e:
        return None

    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    if fps <= 0: fps = 24
    
    subs = []
    current_text = ""
    start_time = 0
    frame_idx = 0
    
    # ၁ α€…α€€α€Ήα€€α€”α€·α€Ία€œα€»α€Ύα€„α€Ί ၄ ကြိမ်နှုန်းဖြင့် α€…α€¬α€žα€¬α€Έα€€α€­α€― α€‘α€žα€±α€Έα€…α€­α€α€Ία€–α€α€Ία€™α€Šα€Ί
    interval = max(1, int(fps / 4))

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret: break
        
        if frame_idx % interval == 0:
            timestamp = frame_idx / fps
            
            result = ocr.ocr(frame, cls=True)
            frame_text = ""
            
            if result and result[0]:
                lines = [line[1][0] for line in result[0]]
                frame_text = " ".join(lines).strip()
            
            # α€…α€¬α€žα€¬α€Έα€‘α€•α€Όα€±α€¬α€„α€Ία€Έα€‘α€œα€²α€•α€±α€«α€Ία€™α€°α€α€Šα€Ία Timer α€žα€α€Ία€™α€Ύα€α€Ία€α€Όα€„α€Ία€Έ
            if frame_text != current_text:
                if current_text:
                    subs.append({
                        "start": format_srt_time(start_time),
                        "end": format_srt_time(timestamp),
                        "text": current_text
                    })
                
                if frame_text:
                    start_time = timestamp
                    current_text = frame_text
                else:
                    current_text = ""
            
            del frame
            gc.collect()
                    
        frame_idx += 1
    
    cap.release()

    # နောက်ဆုဢးစာကြောင်းထတွက် α€žα€­α€™α€Ία€Έα€†α€Šα€Ία€Έα€α€Όα€„α€Ία€Έ
    if current_text:
        subs.append({"start": format_srt_time(start_time), "end": format_srt_time(frame_idx/fps), "text": current_text})

    # SRT File ထဖြစ် ထုတ်ပေးခြင်း
    srt_path = "output_subtitles.srt"
    with open(srt_path, "w", encoding="utf-8") as f:
        for i, s in enumerate(subs):
            f.write(f"{i+1}\n{s['start']} --> {s['end']}\n{s['text']}\n\n")
            
    return srt_path

# UI Logic
with gr.Blocks() as demo:
    gr.Markdown("### 🎬 Video Hardsub to SRT (No-Error Version)")
    with gr.Row():
        with gr.Column():
            video_input = gr.Video()
            lang_dropdown = gr.Dropdown(
                choices=["Chinese (S)", "Chinese (T)", "English", "Japanese", "Korean", "Thai"], 
                value="Chinese (S)", 
                label="α€˜α€¬α€žα€¬α€…α€€α€¬α€Έα€›α€½α€±α€Έα€•α€«"
            )
            process_btn = gr.Button("SRT α€–α€­α€―α€„α€Ία€‘α€―α€α€Ία€šα€°α€™α€Šα€Ί", variant="primary")
        with gr.Column():
            file_output = gr.File(label="Download Subtitles (.srt)")

    process_btn.click(extract_srt, inputs=[video_input, lang_dropdown], outputs=file_output)

demo.launch()