HardSubExtract / app.py
Ketengan-Diffusion-Lab's picture
Update app.py
c64f927 verified
raw
history blame
4.37 kB
import gradio as gr
import os
from videocr import save_subtitles_to_file
# Define path for demo video
DEMO_VIDEO_PATH = "demo.mp4"
# Function to list files in /data directory
def list_files():
files = os.listdir('/data')
file_paths = [f"/data/{file}" for file in files]
return file_paths
# Define OCR function
def run_video_ocr(use_demo_video, input_video, output_file_name, language_code, use_gpu, start_time, end_time, confidence_threshold, similarity_threshold, frames_to_skip, crop_x, crop_y, crop_width, crop_height):
try:
# Ensure the output directory exists
persistent_dir = '/data'
if not os.path.exists(persistent_dir):
os.makedirs(persistent_dir)
# Check whether to use demo video or uploaded video
video_path = DEMO_VIDEO_PATH if use_demo_video else input_video
# Define full path for the output file
output_path = os.path.join(persistent_dir, output_file_name)
# Save the subtitles to file
save_subtitles_to_file(
video_path, # Use demo video or uploaded video path
output_path, # Output .srt file path
lang=language_code,
use_gpu=use_gpu,
time_start=start_time,
time_end=end_time,
conf_threshold=confidence_threshold,
sim_threshold=similarity_threshold,
frames_to_skip=frames_to_skip,
crop_x=crop_x,
crop_y=crop_y,
crop_width=crop_width,
crop_height=crop_height
)
return f"Subtitle extraction completed! File saved to {output_path}"
except Exception as e:
return f"Error: {str(e)}"
# Define Gradio interface
def video_ocr_interface():
with gr.Blocks() as demo:
with gr.Row():
# Radio button for video selection
use_demo_video = gr.Radio(choices=["Upload Video", "Use Demo Video"], label="Choose Video", value="Upload Video")
input_video = gr.File(label="Upload Video", type="filepath", visible=True)
output_file_name = gr.Textbox(label="Output File Name (.srt)", value="subtitle.srt")
language_code = gr.Textbox(label="Language Code", value="ch")
use_gpu = gr.Checkbox(label="Use GPU", value=True)
with gr.Row():
start_time = gr.Textbox(label="Start Time (HH:MM:SS)", value="00:00:00")
end_time = gr.Textbox(label="End Time (HH:MM:SS)", value="")
with gr.Row():
confidence_threshold = gr.Slider(label="Confidence Threshold", minimum=0, maximum=100, value=75)
similarity_threshold = gr.Slider(label="Similarity Threshold", minimum=0, maximum=100, value=80)
with gr.Row():
frames_to_skip = gr.Slider(label="Frames to Skip", minimum=0, maximum=10, value=0)
crop_x = gr.Number(label="Crop X", value=0)
crop_y = gr.Number(label="Crop Y", value=0)
crop_width = gr.Number(label="Crop Width", value=0)
crop_height = gr.Number(label="Crop Height", value=0)
submit_btn = gr.Button("Start OCR")
output_label = gr.Textbox(label="Status", interactive=False)
# Define the file explorer component
file_list = gr.File(label="Download Extracted .srt Files", interactive=True)
# Refresh button to update the list of files
refresh_btn = gr.Button("Refresh File List")
# Define the visibility toggle for upload based on the radio button
def toggle_video_input(selected_option):
return {"visible": selected_option == "Upload Video"}
use_demo_video.change(fn=toggle_video_input, inputs=use_demo_video, outputs=input_video)
# Define what happens when the button is clicked
submit_btn.click(
fn=run_video_ocr,
inputs=[use_demo_video, input_video, output_file_name, language_code, use_gpu, start_time, end_time, confidence_threshold, similarity_threshold, frames_to_skip, crop_x, crop_y, crop_width, crop_height],
outputs=output_label
)
# Refresh the file explorer when the refresh button is clicked
refresh_btn.click(fn=list_files, inputs=[], outputs=file_list)
return demo
# Launch the Gradio interface
demo = video_ocr_interface()
demo.launch()