Spaces:
Sleeping
Sleeping
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()
|