imBesideYou / app.py
itsdvirani's picture
Upload 6 files
625572e verified
raw
history blame
12.9 kB
import streamlit as st
import pandas as pd
import os
import google.generativeai as genai
genai.configure(api_key='AIzaSyBDeJo3pioFL92ErFTtmRBmWt5diryp0E0')
from emotion import (
load_and_preprocess_data as emotion_load_and_preprocess_data,
visualize_comparison as emotion_visualize_comparison,
visualize_single_candidate as emotion_visualize_single_candidate,
generate_response as emotion_generate_response,
)
from transcrip_score import (
load_and_preprocess_data as transcript_score_load_and_preprocess_data,
visualize_comparison as transcript_score_visualize_comparison,
visualize_single_candidate as transcript_score_visualize_single_candidate,
generate_response as transcript_score_generate_response,
)
from gaze import (
load_and_preprocess_data as gaze_load_and_preprocess_data,
visualize_gaze_distribution,
visualize_single_movie,
generate_response as gaze_generate_response,
)
from transcrip import (
load_candidate_data,
generate_response as transcript_generate_response,
)
def summarize_response(response):
model = genai.GenerativeModel('gemini-pro')
prompt_template = (
"Please summarize the following response:\n\n"
f"{response}\n\n"
"The summary should be concise and capture the main points."
)
summry = model.generate_content(prompt_template)
if hasattr(summry, 'candidates'):
if summry.candidates:
content = summry.candidates[0].content
if hasattr(content, 'parts'):
for part in content.parts:
if hasattr(part, 'text'):
return part.text
def main():
st.title("Multi-Candidate Analysis Interface")
num_candidates = st.number_input("How many candidates would you like to compare?", min_value=1, max_value=10, value=1)
data_dict = {}
for i in range(num_candidates):
st.subheader(f"Candidate {i + 1}")
files = {}
for file_type in ['emotion', 'transcript_score', 'gaze']:
files[file_type] = st.file_uploader(f"Choose {file_type}.csv for Candidate {i + 1}", type="csv", key=f"candidate_{i + 1}_{file_type}")
files['transcript'] = st.file_uploader(f"Choose transcript.txt for Candidate {i + 1}", type="txt", key=f"candidate_{i + 1}_transcript")
if all(files.values()):
data_dict[f"Candidate {i + 1}"] = files
if len(data_dict) == num_candidates:
st.success("All files uploaded successfully. You can now start analyzing!")
query_type = st.selectbox("Select the type of query:", ['emotion', 'transcript score', 'gaze', 'transcript comparison', 'overall comparison'])
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
selected_candidates = st.multiselect("Select candidates to compare:", list(data_dict.keys()))
if not selected_candidates:
selected_candidates = list(data_dict.keys())
if query_type == 'emotion':
emotions = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']
st.write("Available Emotions:", emotions)
if prompt := st.chat_input("What would you like to know about the candidates' emotions?"):
st.chat_message("user").markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
selected_emotions = []
if "all" in prompt.lower():
selected_emotions = ['all']
else:
for emotion in emotions:
if emotion in prompt.lower():
selected_emotions.append(emotion)
if not selected_emotions:
selected_emotions = ['all']
emotion_data = {candidate: emotion_load_and_preprocess_data(data_dict[candidate]['emotion']) for candidate in selected_candidates}
emotion_percentages = None
with st.chat_message("assistant"):
if len(selected_candidates) == 1:
emotion_percentages = emotion_visualize_single_candidate(emotion_data[selected_candidates[0]], selected_emotions)
elif any(keyword in prompt.lower() for keyword in ["graph", "compare", "visualize", "show"]):
emotion_percentages = emotion_visualize_comparison(emotion_data, selected_emotions, selected_candidates)
response = emotion_generate_response(prompt, emotion_data, selected_emotions, selected_candidates, emotion_percentages)
with st.chat_message("assistant"):
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
elif query_type == 'transcript score':
features = ['positive', 'negative', 'neutral', 'confident', 'hesitant', 'concise', 'enthusiastic', 'speech_speed']
st.write("Available Features:", features)
if prompt := st.chat_input("What would you like to know about the candidates' transcript scores?"):
st.chat_message("user").markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
selected_features = []
if any(keyword in prompt.lower() for keyword in ["all features", "all transcript", "compare all"]):
selected_features = ['all']
else:
for feature in features:
if feature in prompt.lower():
selected_features.append(feature)
if not selected_features:
selected_features = ['all']
transcript_data = {candidate: transcript_score_load_and_preprocess_data(data_dict[candidate]['transcript_score']) for candidate in selected_candidates}
feature_percentages = None
with st.chat_message("assistant"):
if len(selected_candidates) == 1:
feature_percentages = transcript_score_visualize_single_candidate(transcript_data[selected_candidates[0]], selected_features)
else:
feature_percentages = transcript_score_visualize_comparison(transcript_data, selected_features, selected_candidates)
response = transcript_score_generate_response(prompt, transcript_data, selected_features, selected_candidates, feature_percentages)
with st.chat_message("assistant"):
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
elif query_type == 'gaze':
features = ['gaze', 'blink', 'eye_offset']
st.write("Available Features:", features)
if prompt := st.chat_input("What would you like to know about the candidates' gaze data?"):
st.chat_message("user").markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
selected_features = [feature for feature in features if feature in prompt.lower()]
if not selected_features:
selected_features = features
gaze_data = {candidate: gaze_load_and_preprocess_data(data_dict[candidate]['gaze']) for candidate in selected_candidates}
with st.chat_message("assistant"):
if len(selected_candidates) == 1:
visualize_single_movie(gaze_data[selected_candidates[0]], selected_features)
elif any(keyword in prompt.lower() for keyword in ["graph", "compare", "visualize", "show"]):
visualize_gaze_distribution(gaze_data, selected_features, selected_candidates)
response = gaze_generate_response(prompt, gaze_data, selected_features, selected_candidates)
with st.chat_message("assistant"):
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
elif query_type == 'transcript comparison':
transcript_data = {candidate: load_candidate_data(data_dict[candidate]['transcript']) for candidate in selected_candidates}
if prompt := st.chat_input("What would you like to know about the candidates' transcripts?"):
st.chat_message("user").markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
response = transcript_generate_response(prompt, transcript_data, selected_candidates)
with st.chat_message("assistant"):
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
elif query_type == 'overall comparison':
if prompt := st.chat_input("What would you like to know about the overall comparison of candidates?"):
st.chat_message("user").markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("assistant"):
# Transcript information
st.subheader("Transcript Information")
transcript_data = {candidate: load_candidate_data(data_dict[candidate]['transcript']) for candidate in selected_candidates}
transcript_response = transcript_generate_response(prompt, transcript_data, selected_candidates)
st.markdown(transcript_response)
# Emotion comparison
st.subheader("Emotion Comparison")
emotion_data = {candidate: emotion_load_and_preprocess_data(data_dict[candidate]['emotion']) for candidate in selected_candidates}
emotion_percentages = emotion_visualize_comparison(emotion_data, ['all'], selected_candidates)
emotion_response = emotion_generate_response(prompt, emotion_data, ['all'], selected_candidates, emotion_percentages)
st.markdown(summarize_response(emotion_response))
# Gaze comparison
st.subheader("Gaze Comparison")
gaze_data = {candidate: gaze_load_and_preprocess_data(data_dict[candidate]['gaze']) for candidate in selected_candidates}
visualize_gaze_distribution(gaze_data, ['gaze', 'blink', 'eye_offset'], selected_candidates)
gaze_response = gaze_generate_response(prompt, gaze_data, ['gaze', 'blink', 'eye_offset'], selected_candidates)
st.markdown(summarize_response(gaze_response))
# Transcript score comparison
st.subheader("Transcript Score Comparison")
transcript_score_data = {candidate: transcript_score_load_and_preprocess_data(data_dict[candidate]['transcript_score']) for candidate in selected_candidates}
feature_percentages = transcript_score_visualize_comparison(transcript_score_data, ['all'], selected_candidates)
transcript_score_response = transcript_score_generate_response(prompt, transcript_score_data, ['all'], selected_candidates, feature_percentages)
st.markdown(summarize_response(transcript_score_response))
overall_response = f"""
Here's an overall comparison of the candidates:
1. Transcript Analysis: {transcript_response}
2. Emotion Analysis: {summarize_response(emotion_response)}
3. Gaze Analysis: {summarize_response(gaze_response)}
4. Transcript Score Analysis: {summarize_response(transcript_score_response)}
"""
st.session_state.messages.append({"role": "assistant", "content": overall_response})
if st.checkbox("Show raw data"):
for candidate in selected_candidates:
st.subheader(f"{candidate} Data")
st.write("Emotion Data:")
st.write(emotion_load_and_preprocess_data(data_dict[candidate]['emotion']))
st.write("Transcript Score Data:")
st.write(transcript_score_load_and_preprocess_data(data_dict[candidate]['transcript_score']))
st.write("Gaze Data:")
st.write(gaze_load_and_preprocess_data(data_dict[candidate]['gaze']))
st.write("Transcript Data:")
st.write(load_candidate_data(data_dict[candidate]['transcript']))
if __name__ == "__main__":
main()