interview-bot / app.py
adeelshuaib's picture
Update app.py
734f006 verified
raw
history blame
4.04 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()
def process_audio_response(audio):
# Check if the audio input is None
if audio is None:
return "No audio provided"
# Process the audio if it's a valid input
try:
text_response = asr_model.transcribe_file(audio)
return text_response
except Exception as e:
return f"Error processing audio: {str(e)}"
# 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):
# Check if any audio response is invalid (None)
valid_audio_responses = [process_audio_response(audio) for audio in audio_responses if audio is not None]
# If all responses are invalid, return an error message
if not valid_audio_responses:
return "No valid audio responses provided", None
traits = analyze_text_responses(valid_audio_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()