CTP_HW9 / app.py
Lucasstranger1's picture
update
3e57df9 verified
raw
history blame
3.4 kB
import os
import requests
import openai
import streamlit as st
from PIL import Image
from dotenv import load_dotenv
import torch
from transformers import AutoProcessor, AutoModelForImageClassification
# Load environment variables from .env file
load_dotenv()
# Set up the Hugging Face API for emotion detection
emotion_model_url = "https://api-inference.huggingface.co/models/trpakov/vit-face-expression"
headers = {"Authorization": f"Bearer {os.getenv('HUGGINGFACE_API_KEY')}"}
# Set up OpenAI API key
openai.api_key = os.getenv('OPENAI_API_KEY')
# Function to query the facial expression recognition model
def query_emotion(image):
# Load the processor and model
processor = AutoProcessor.from_pretrained("trpakov/vit-face-expression")
model = AutoModelForImageClassification.from_pretrained("trpakov/vit-face-expression")
# Preprocess the image
inputs = processor(images=image, return_tensors="pt")
# Perform inference
with torch.no_grad():
outputs = model(**inputs)
# Get predicted class index
logits = outputs.logits
predicted_class_idx = torch.argmax(logits, dim=-1).item()
# Get the predicted label
predicted_label = processor.decode(predicted_class_idx)
return predicted_label
# Function to generate a response using OpenAI based on detected emotion
def generate_text_based_on_mood(emotion):
try:
# Create a dynamic prompt based on the detected emotion
prompt = f"Generate a light-hearted joke or 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
# Streamlit UI
st.title("Facial Expression Mood Detector")
st.write("Upload an image of a face to detect mood and receive uplifting messages or jokes.")
# 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)
st.write(f"Detected emotion: {emotion}")
# Generate text based on detected emotion
message = generate_text_based_on_mood(emotion)
st.write("Here's something to cheer you up:")
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