CTP_HW9 / app.py
Lucasstranger1's picture
Update app.py
75f7b62 verified
#############################################################################################################################
# Filename : app.py
# Description: A Streamlit application to detect facial expressions from images and provide responses.
# Author : Lucas Yao
#
# Copyright © 2024 by Lucas Yao
#############################################################################################################################
# Import libraries.
import os # Load environment variable(s).
import streamlit as st # Build the GUI of the application.
from PIL import Image # Handle image operations.
from dotenv import load_dotenv # Load environment variables.
from fer import FER # Import the FER model for facial expression recognition.
import numpy as np # Import NumPy for array handling
import openai # OpenAI API for generating text responses.
#############################################################################################################################
# Load environment variable(s).
load_dotenv()
# Set up OpenAI API key.
openai.api_key = os.getenv('OPENAI_API_KEY')
#############################################################################################################################
# Function to query the facial expression recognition model using FER.
def query_emotion(image):
# Convert the PIL Image to a NumPy array
image_np = np.array(image)
detector = FER()
emotions = detector.detect_emotions(image_np)
if emotions:
# Get the emotion with the highest score.
dominant_emotion = max(emotions[0]['emotions'], key=emotions[0]['emotions'].get)
return dominant_emotion
else:
st.error("Could not detect any emotion.")
return None
#############################################################################################################################
# Function to generate a response using OpenAI based on detected emotion.
def generate_text_based_on_mood(emotion, response_type):
try:
if response_type == "Joke":
prompt = f"Generate a light-hearted joke for someone who is feeling {emotion}."
elif response_type == "Motivational Message":
prompt = f"Generate a motivational message for someone who is feeling {emotion}."
elif response_type == "Compliment":
prompt = f"Generate a heartfelt compliment for someone who is feeling {emotion}."
elif response_type == "Song Recommendation":
prompt = f"Recommend a song that would suit someone who is feeling {emotion}. Include the song title and artist."
# Call OpenAI's API using GPT-4.
response = openai.ChatCompletion.create(
model="gpt-4", # Specify the GPT-4 model
messages=[
{"role": "user", "content": prompt}
]
)
# Extract the generated text.
generated_text = response['choices'][0]['message']['content']
return generated_text.strip()
except Exception as e:
st.error(f"Error generating text: {e}")
return "Sorry, I couldn't come up with a message at this moment."
#############################################################################################################################
# Function to convert text to speech using gTTS.
def text_to_speech(text):
from gtts import gTTS
try:
tts = gTTS(text, lang='en')
audio_file = "output.mp3"
tts.save(audio_file) # Save the audio file.
return audio_file
except Exception as e:
st.error(f"Error with TTS: {e}")
return None
#############################################################################################################################
# Main function to create the Streamlit web application.
def main():
st.title("Facial Expression Mood Detector")
st.write("Upload an image of a face to detect mood and receive a response.")
# Upload image.
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
# Load and display the image.
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded Image', use_column_width=True)
# Detect facial expression.
emotion = query_emotion(image)
if emotion:
st.write(f"Detected emotion: {emotion}")
# Dropdown for selecting response type.
response_type = st.selectbox("Select the type of response:", ["Joke", "Motivational Message", "Compliment", "Song Recommendation"])
# Generate text based on detected emotion and user preference.
if st.button("Get Response"):
message = generate_text_based_on_mood(emotion, response_type)
# Display the generated message (song recommendation or other response)
st.write("Here's your response:")
st.write(message)
# Convert the generated message to audio if it's not a song recommendation (optional)
if response_type != "Song Recommendation":
audio_file = text_to_speech(message)
if audio_file:
st.audio(audio_file) # Streamlit will handle playback.
#############################################################################################################################
# Run the application.
if __name__ == "__main__":
main()