import gradio as gr
def wire_events(demo, components, assistant):
c = components
def handle_describe(webcam_img, upload_img, task, voice):
is_webcam = webcam_img is not None
img = webcam_img if is_webcam else upload_img
if img is None:
return gr.update(), gr.update(), f'
Please provide an image.
'
import numpy as np
import cv2
# If the image came from the webcam, it is likely horizontally mirrored by Gradio.
# We must un-mirror it so text and spatial relationships are correct!
if is_webcam and isinstance(img, np.ndarray):
img = cv2.flip(img, 1)
text, audio, status = assistant.process_image(img, task, voice, force=True)
return text or gr.update(), audio or gr.update(), f'{status}
'
c["describe_btn"].click(
handle_describe,
inputs=[c["webcam"], c["upload"], c["task_radio"], c["voice_dropdown"]],
outputs=[c["caption_box"], c["audio_player"], c["status_bar"]]
)
def toggle_rt(is_active):
new_state = not is_active
btn_text = "⚫ Stop Realtime (R)" if new_state else "⚫ Start Realtime (R)"
status_msg = "Realtime Started" if new_state else "Realtime Paused"
return new_state, gr.update(value=btn_text), f'{status_msg}
'
c["realtime_btn"].click(
toggle_rt,
inputs=[c["rt_state"]],
outputs=[c["rt_state"], c["realtime_btn"], c["status_bar"]]
)
def handle_rt_stream(image, task, voice, is_active):
print(f"DEBUG stream: is_active={is_active}, task={task}, voice={voice}")
if is_active is False:
return gr.update(), gr.update(), f'Realtime Paused
'
if not is_active:
# Fallback if None
is_active = True
if image is None:
return gr.update(), gr.update(), f'No Camera
'
import numpy as np
import cv2
# Un-mirror the webcam feed for backend processing
if isinstance(image, np.ndarray):
image = cv2.flip(image, 1)
text, audio, status = assistant.process_image(image, task, voice, force=False)
return text or gr.update(), audio or gr.update(), f'{status}
'
c["webcam"].stream(
handle_rt_stream,
inputs=[c["webcam"], c["task_radio"], c["voice_dropdown"], c["rt_state"]],
outputs=[c["caption_box"], c["audio_player"], c["status_bar"]],
stream_every=3.0
)