Spaces:
Running
Running
File size: 4,874 Bytes
b878745 3f51327 b878745 3f51327 b878745 3f51327 b878745 4a17310 e1d89e6 b878745 c884652 b878745 3f51327 3e57df9 3f51327 e1d89e6 b878745 3f51327 2bbfd62 4a17310 2bbfd62 b878745 c884652 2bbfd62 c884652 b878745 edbb580 c884652 4a17310 a1b1b7f e1d89e6 b878745 e436a2e dc26248 b878745 dc26248 ceb1369 e436a2e b878745 2bbfd62 b878745 e1d89e6 b878745 e1d89e6 b878745 3f51327 e1d89e6 3f51327 2bbfd62 3f51327 3e57df9 3f51327 3e57df9 3f51327 3e57df9 b878745 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#############################################################################################################################
# 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 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):
detector = FER()
emotions = detector.detect_emotions(image)
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}."
else: # Motivational Message
prompt = f"Generate a motivational message for someone who is feeling {emotion}."
# 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"])
# Generate text based on detected emotion and user preference.
if st.button("Get Response"):
message = generate_text_based_on_mood(emotion, response_type)
st.write("Here's your response:")
st.write(message)
# Convert the generated message to audio.
audio_file = text_to_speech(message)
# Provide an audio player in the Streamlit app if audio file exists.
if audio_file:
st.audio(audio_file) # Streamlit will handle playback.
#############################################################################################################################
# Run the application.
if __name__ == "__main__":
main()
|