|
import gradio as gr
|
|
import plotly.graph_objs as go
|
|
import numpy as np
|
|
import time
|
|
import google.generativeai as genai
|
|
from hardCodedData import *
|
|
from Helper import *
|
|
import google
|
|
|
|
'''
|
|
Model Information
|
|
Gemini 1.5 pro
|
|
'''
|
|
GOOGLE_API_KEY = "api"
|
|
genai.configure(api_key="AIzaSyC6msuJuuRiXTplyOzgnlZchpu5_olBXYs")
|
|
generation_config = genai.GenerationConfig(temperature=0.5)
|
|
|
|
|
|
model = genai.GenerativeModel(
|
|
model_name='gemini-1.5-pro-latest',
|
|
system_instruction= """
|
|
You are an assistant chatbot for a Speech Language Pathologist (SLP).
|
|
Your task is to help analyze a provided video of a therapy session and answer questions accurately.
|
|
Provide timestamps for specific events or behaviors mentioned. Conclude each response with possible follow-up questions.
|
|
|
|
Follow these steps:
|
|
|
|
1. Suggest to the user to ask, “To get started, you can try asking me how many people there are in the video.”
|
|
2. Detect how many people are in the video.
|
|
2. Suggest to the user to tell you the names of the people in the video, starting from left to right.
|
|
3. After receiving the names, respond with, “Ok thank you! Now you can ask me any questions about this video.”
|
|
4. If the user asks about a behavior, respond with, “My understanding of this behavior is [xxx - AI generated output]. Is this a behavior that you want to track? If it is, please define this behavior and tell me more about it so I can analyze it more accurately according to your practice.”
|
|
5. If you receive names, confirm that these are the names of the people from left to right.
|
|
"""
|
|
)
|
|
|
|
|
|
|
|
'''
|
|
Video
|
|
'''
|
|
video_file = None
|
|
|
|
def handle_video(video=None):
|
|
global video_file
|
|
if video is None:
|
|
|
|
video = "./TEST.mp4"
|
|
isTest = True
|
|
|
|
video_file = genai.upload_file(path=video)
|
|
|
|
while video_file.state.name == "PROCESSING":
|
|
print(".", end="")
|
|
time.sleep(10)
|
|
video_file = genai.get_file(video_file.name)
|
|
|
|
if video_file.state.name == "FAILED":
|
|
raise ValueError(video_file.state.name)
|
|
|
|
if isTest:
|
|
return video
|
|
else:
|
|
return video_file
|
|
|
|
'''
|
|
Chatbot
|
|
'''
|
|
chat_history = []
|
|
def new_prompt(prompt):
|
|
global chat_history, video_file
|
|
|
|
|
|
chat_history.append({'role': 'user', 'parts': [prompt]})
|
|
try:
|
|
|
|
if video_file:
|
|
|
|
chat_history[-1]['parts'].extend([" from video: ", video_file])
|
|
response = model.generate_content(chat_history, request_options={"timeout": 600})
|
|
else:
|
|
|
|
response = model.generate_content(chat_history)
|
|
|
|
|
|
assistant_message = response.candidates[0].content.parts[0].text
|
|
chat_history.append({'role': 'model', 'parts': [assistant_message]})
|
|
|
|
except google.api_core.exceptions.ResourceExhausted:
|
|
assistant_message = "API rate limit has been reached. Please wait a moment and try again."
|
|
chat_history.append({'role': 'model', 'parts': [assistant_message]})
|
|
except Exception as e:
|
|
assistant_message = f"An error occurred: {str(e)}"
|
|
chat_history.append({'role': 'model', 'parts': [assistant_message]})
|
|
|
|
return chat_history
|
|
|
|
def user_input(user_message, history):
|
|
return "", history + [[user_message, None]]
|
|
|
|
def bot_response(history):
|
|
user_message = history[-1][0]
|
|
print(history)
|
|
updated_history = new_prompt(user_message)
|
|
print(updated_history)
|
|
assistant_message = updated_history[-1]['parts'][0]
|
|
for i in range(len(assistant_message)):
|
|
time.sleep(0.05)
|
|
history[-1][1] = assistant_message[:i+1]
|
|
yield history
|
|
|
|
|
|
'''
|
|
Behaivor box
|
|
'''
|
|
initial_behaviors = [
|
|
("Initiating Behavioral Request (IBR)",
|
|
("The child's skill in using behavior(s) to elicit aid in obtaining an object, or object related event",
|
|
["00:10", "00:45", "01:30"])),
|
|
|
|
("Initiating Joint Attention (IJA)",
|
|
("The child's skill in using behavior(s) to initiate shared attention to objects or events.",
|
|
["00:15", "00:50", "01:40"])),
|
|
|
|
("Responding to Joint Attention (RJA)",
|
|
("The child's skill in following the examiner’s line of regard and pointing gestures.",
|
|
["00:20", "01:00", "02:00"])),
|
|
|
|
("Initiating Social Interaction (ISI)",
|
|
("The child's skill at initiating turn-taking sequences and the tendency to tease the tester",
|
|
["00:20", "00:50", "02:00"])),
|
|
|
|
("Responding to Social Interaction (RSI)",
|
|
("The child’s skill in responding to turn-taking interactions initiated by the examiner.",
|
|
["00:20", "01:00", "02:00"]))
|
|
]
|
|
|
|
behaviors = initial_behaviors
|
|
behavior_bank = []
|
|
|
|
def add_or_update_behavior(name, definition, timestamps, selected_behavior):
|
|
global behaviors, behavior_bank
|
|
if selected_behavior:
|
|
for i, (old_name, _) in enumerate(behaviors):
|
|
if old_name == selected_behavior:
|
|
behaviors[i] = (name, (definition, timestamps))
|
|
break
|
|
|
|
behavior_bank = [name if b == selected_behavior else b for b in behavior_bank]
|
|
else:
|
|
new_behavior = (name, (definition, timestamps))
|
|
behaviors.append(new_behavior)
|
|
choices = [b[0] for b in behaviors]
|
|
return gr.Dropdown(choices=choices, value=None, interactive=True), gr.CheckboxGroup(choices=behavior_bank, value=behavior_bank, interactive=True), "", "", ""
|
|
|
|
def add_to_behaivor_bank(selected_behavior, checkbox_group_values):
|
|
global behavior_bank
|
|
if selected_behavior and selected_behavior not in checkbox_group_values:
|
|
checkbox_group_values.append(selected_behavior)
|
|
behavior_bank = checkbox_group_values
|
|
return gr.CheckboxGroup(choices=checkbox_group_values, value=checkbox_group_values, interactive=True), gr.Dropdown(value=None,interactive=True)
|
|
|
|
def delete_behavior(selected_behavior, checkbox_group_values):
|
|
global behaviors, behavior_bank
|
|
behaviors = [b for b in behaviors if b[0] != selected_behavior]
|
|
behavior_bank = [b for b in behavior_bank if b != selected_behavior]
|
|
updated_choices = [b[0] for b in behaviors]
|
|
updated_checkbox_group = [cb for cb in checkbox_group_values if cb != selected_behavior]
|
|
return gr.Dropdown(choices=updated_choices, value=None, interactive=True), gr.CheckboxGroup(choices=updated_checkbox_group, value=updated_checkbox_group, interactive=True)
|
|
|
|
def edit_behavior(selected_behavior):
|
|
for name, (definition, timestamps) in behaviors:
|
|
if name == selected_behavior:
|
|
|
|
return name, definition, timestamps
|
|
return "", "", ""
|
|
|
|
|
|
welcome_message = """
|
|
Hello! I'm your AI assistant.
|
|
I can help you analyze your video sessions following your instructions.
|
|
To get started, please upload a video or add your behaviors to the Behavior Bank using the Behavior Manager.
|
|
"""
|
|
|
|
|
|
css="""
|
|
body {
|
|
background-color: #edf1fa; /* offwhite */
|
|
}
|
|
.gradio-container {
|
|
background-color: #edf1fa; /* offwhite */
|
|
}
|
|
.column-form .wrap {
|
|
flex-direction: column;
|
|
}
|
|
.sidebar {
|
|
background: #ffffff;
|
|
padding: 10px;
|
|
border-right: 1px solid #dee2e6;
|
|
}
|
|
.content {
|
|
padding: 10px;
|
|
}
|
|
"""
|
|
|
|
'''
|
|
Gradio Demo
|
|
'''
|
|
with gr.Blocks(theme='base', css=css, title="Soap.AI") as demo:
|
|
gr.Markdown("# 🤖 AI-Supported SOAP Generation")
|
|
|
|
with gr.Row():
|
|
with gr.Column():
|
|
video = gr.Video(label="Video", visible=True, height=360, container=True)
|
|
with gr.Row():
|
|
with gr.Column(min_width=1, scale=1):
|
|
video_upload_button = gr.Button("Analyze Video", variant="primary")
|
|
with gr.Column(min_width=1, scale=1):
|
|
example_video_button = gr.Button("Load Example Video")
|
|
|
|
video_upload_button.click(handle_video, inputs=video, outputs=video)
|
|
example_video_button.click(handle_video, None, outputs=video)
|
|
|
|
with gr.Column():
|
|
chat_section = gr.Group(visible=True)
|
|
with chat_section:
|
|
chatbot = gr.Chatbot(elem_id="chatbot",
|
|
container=True,
|
|
likeable=True,
|
|
value=[[None, welcome_message]],
|
|
avatar_images=(None, "./avatar.webp"))
|
|
with gr.Row():
|
|
txt = gr.Textbox(show_label=False, placeholder="Type here!")
|
|
with gr.Row():
|
|
send_btn = gr.Button("Send Message", elem_id="send-btn", variant="primary")
|
|
clear_btn = gr.Button("Clear Chat", elem_id="clear-btn")
|
|
|
|
with gr.Row():
|
|
behaivor_bank = gr.CheckboxGroup(label="Behavior Bank",
|
|
choices=[],
|
|
interactive=True,
|
|
info="A space to store all the behaviors you want to analyze.")
|
|
open_sidebar_btn = gr.Button("Show Behavior Manager", scale=0)
|
|
close_sidebar_btn = gr.Button("Hide Behavior Manager", visible=False, scale=0)
|
|
|
|
txt.submit(user_input, [txt, chatbot], [txt, chatbot], queue=False).then(
|
|
bot_response, chatbot, chatbot)
|
|
send_btn.click(user_input, [txt, chatbot], [txt, chatbot], queue=False).then(
|
|
bot_response, chatbot, chatbot)
|
|
clear_btn.click(lambda: None, None, chatbot, queue=False)
|
|
|
|
|
|
with gr.Column(visible=False, min_width=200, scale=0.5, elem_classes="sidebar") as sidebar:
|
|
behavior_dropdown = gr.Dropdown(label="Behavior Collection",
|
|
choices=behaviors,
|
|
interactive=True,
|
|
container=True,
|
|
elem_classes="column-form",
|
|
info="Choose a behavior to add to the bank, edit or remove.")
|
|
with gr.Row():
|
|
add_toBank_button = gr.Button("Add Behavior to Bank", variant="primary")
|
|
edit_button = gr.Button("Edit Behavior")
|
|
delete_button = gr.Button("Remove Behavior")
|
|
|
|
with gr.Row():
|
|
name_input = gr.Textbox(label="Behavior Name",
|
|
placeholder="(e.g., IBR)",
|
|
info="The name you give to the specific behavior you're tracking or analyzing.")
|
|
timestamps_input = gr.Textbox(label="Timestamps MM:SS",
|
|
placeholder="(e.g., (01:15,01:35) )",
|
|
info="The exact times during a session when you saw the behavior. The first two digits represent minutes and the last two digits represent seconds.")
|
|
definition_input = gr.Textbox(lines=3,
|
|
label="Behavior Definition",
|
|
placeholder="(e.g., the child's skill in using behavior(s) to elicit aid in obtaining an object, or object related event)",
|
|
info="Provide a clear definition of the behavior.")
|
|
|
|
with gr.Row():
|
|
submit_button = gr.Button("Save Behavior", variant="primary")
|
|
|
|
submit_button.click(fn=add_or_update_behavior,
|
|
inputs=[name_input, definition_input, timestamps_input, behavior_dropdown],
|
|
outputs=[behavior_dropdown, behaivor_bank, name_input, definition_input, timestamps_input])
|
|
|
|
add_toBank_button.click(fn=add_to_behaivor_bank,
|
|
inputs=[behavior_dropdown, behaivor_bank],
|
|
outputs=[behaivor_bank, behavior_dropdown])
|
|
|
|
delete_button.click(fn=delete_behavior,
|
|
inputs=[behavior_dropdown, behaivor_bank],
|
|
outputs=[behavior_dropdown, behaivor_bank])
|
|
|
|
edit_button.click(fn=edit_behavior,
|
|
inputs=[behavior_dropdown],
|
|
outputs=[name_input, definition_input, timestamps_input])
|
|
|
|
|
|
open_sidebar_btn.click(lambda: {
|
|
open_sidebar_btn: gr.Button(visible=False),
|
|
close_sidebar_btn: gr.Button(visible=True),
|
|
sidebar: gr.Column(visible=True)
|
|
}, outputs=[open_sidebar_btn, close_sidebar_btn, sidebar])
|
|
|
|
|
|
close_sidebar_btn.click(lambda: {
|
|
open_sidebar_btn: gr.Button(visible=True),
|
|
close_sidebar_btn: gr.Button(visible=False),
|
|
sidebar: gr.Column(visible=False)
|
|
}, outputs=[open_sidebar_btn, close_sidebar_btn, sidebar])
|
|
|
|
|
|
demo.launch(share=True) |