import gradio as gr
# Custom CSS: smaller arrow, pushed down, video enlarged
mycss = """
.arrow {
display: flex;
align-items: center;
justify-content: center;
margin: 80px auto;
}
.arrow-tail {
width: 150px;
height: 20px;
background-color: black;
}
.arrow-head {
width: 0;
height: 0;
border-top: 30px solid transparent;
border-bottom: 30px solid transparent;
border-left: 60px solid black;
}
@media (prefers-color-scheme: dark) {
.arrow-tail { background-color: white; }
.arrow-head { border-left-color: white; }
}
/* ensure the video container has enough space */
#generated-video {
min-height: 360px;
}
/* enlarge the video */
#generated-video video {
width: 640px !important;
height: auto !important;
}
"""
# Arrow HTML
myhtml = """
"""
def generate_media(echo_idx, ecg_idx):
echo_path = f"resources/examples/ef{echo_idx}.png"
ecg_path = f"resources/examples/ecg{ecg_idx}.png"
video_path = f"resources/examples/ef{echo_idx}.mp4"
return echo_path, ecg_path, video_path
with gr.Blocks(css=mycss) as demo:
gr.Markdown("""
# ECHOPULSE: ECG-Controlled Echocardiogram Video Generation
Enter the example index for your ECHO image and ECG image below, then click **Generate Video** to load both images and play the corresponding video.
""")
# Two input fields for the example index
echo_idx_input = gr.Textbox(label="Patient's Past ECHO Example Index (i)", placeholder="e.g. 0000")
ecg_idx_input = gr.Textbox(label="Patient's ECG Example Index (i)", placeholder="e.g. 0000")
with gr.Row():
# Column 1: ECHO + ECG images
with gr.Column():
echo_image = gr.Image(interactive=False, label="ECHO Image")
ecg_image = gr.Image(interactive=False, label="ECG Image")
# Column 2: arrow + button
with gr.Column():
gr.HTML(myhtml)
gen_button = gr.Button("Generate Video")
# Column 3: video output
with gr.Column():
video_out = gr.Video(interactive=False,
autoplay=True,
label="Generated Video",
elem_id="generated-video")
# Wire up the button to load images & video based on the indices
gen_button.click(
fn=generate_media,
inputs=[echo_idx_input, ecg_idx_input],
outputs=[echo_image, ecg_image, video_out]
)
# Delay display of the