interview-bot / app.py
adeelshuaib's picture
Update app.py
bcd4212 verified
raw
history blame
3.59 kB
import gradio as gr
from transformers import pipeline
from speechbrain.pretrained import Tacotron2, HIFIGAN, EncoderDecoderASR
import matplotlib.pyplot as plt
import pandas as pd
# Initialize psychometric model
psych_model_name = "KevSun/Personality_LM"
psych_model = pipeline("text-classification", model=psych_model_name)
# Initialize ASR and TTS models
asr_model = EncoderDecoderASR.from_hparams(source="speechbrain/asr-crdnn-rnnlm-librispeech", savedir="tmp_asr")
tts_model = Tacotron2.from_hparams(source="speechbrain/tts-tacotron2-ljspeech", savedir="tmp_tts")
voc_model = HIFIGAN.from_hparams(source="speechbrain/tts-hifigan-ljspeech", savedir="tmp_voc")
# Psychometric Test Questions
text_questions = [
"How do you handle criticism?",
"Describe a time when you overcame a challenge.",
"What motivates you to work hard?"
]
audio_questions = [
"What does teamwork mean to you?",
"How do you handle stressful situations?"
]
# Function to analyze text responses
def analyze_text_responses(responses):
analysis = [psych_model(response)[0] for response in responses]
traits = {response["label"]: response["score"] for response in analysis}
return traits
# Function to handle TTS
def generate_audio_question(question):
mel_output, alignment, _ = tts_model.encode_text(question)
waveforms = voc_model.decode_batch(mel_output)
return waveforms[0].numpy()
# Function to process audio response
def process_audio_response(audio):
text_response = asr_model.transcribe_file(audio)
return text_response
# Gradio interface functions
def text_part(candidate_name, responses):
traits = analyze_text_responses(responses)
df = pd.DataFrame(traits.items(), columns=["Trait", "Score"])
plt.figure(figsize=(8, 6))
plt.bar(df["Trait"], df["Score"], color="skyblue")
plt.title(f"Psychometric Analysis for {candidate_name}")
plt.xlabel("Traits")
plt.ylabel("Score")
plt.xticks(rotation=45)
plt.tight_layout()
return df, plt
def audio_part(candidate_name, audio_responses):
text_responses = [process_audio_response(audio) for audio in audio_responses]
traits = analyze_text_responses(text_responses)
df = pd.DataFrame(traits.items(), columns=["Trait", "Score"])
plt.figure(figsize=(8, 6))
plt.bar(df["Trait"], df["Score"], color="lightcoral")
plt.title(f"Audio Psychometric Analysis for {candidate_name}")
plt.xlabel("Traits")
plt.ylabel("Score")
plt.xticks(rotation=45)
plt.tight_layout()
return df, plt
# Gradio UI function
def chat_interface(candidate_name, *responses):
# Separate text responses and audio responses
num_text_questions = len(text_questions)
text_responses = responses[:num_text_questions]
audio_responses = responses[num_text_questions:]
# Process text responses
text_df, text_plot = text_part(candidate_name, text_responses)
# Process audio responses
audio_df, audio_plot = audio_part(candidate_name, audio_responses)
return text_df, text_plot, audio_df, audio_plot
# Create text inputs and audio inputs
text_inputs = [gr.Textbox(label=f"Response to Q{i+1}: {q}") for i, q in enumerate(text_questions)]
audio_inputs = [gr.Audio(label=f"Response to Q{i+1}: {q}", type="filepath") for i, q in enumerate(audio_questions)]
interface = gr.Interface(
fn=chat_interface,
inputs=[gr.Textbox(label="Candidate Name")] + text_inputs + audio_inputs,
outputs=["dataframe", "plot", "dataframe", "plot"],
title="Psychometric Analysis Chatbot"
)
# Launch the interface
interface.launch()