import os import requests import streamlit as st from transformers import pipeline from PIL import Image from dotenv import load_dotenv # Load environment variables from .env file load_dotenv() # Set up the Hugging Face API URL and your API key API_URL = "https://api-inference.huggingface.co/models/trpakov/vit-face-expression" headers = {"Authorization": f"Bearer {os.getenv('HUGGINGFACE_API_KEY')}"} # Function to query the Hugging Face model for facial expression def query(filename): with open(filename, "rb") as f: data = f.read() response = requests.post(API_URL, headers=headers, data=data) if response.status_code == 200: return response.json() else: st.error("Error detecting facial expression: " + response.text) return None # Function to generate a joke or uplifting text based on the mood def generate_text_based_on_mood(emotion): try: # Predefined jokes for different emotions jokes = { "happy": [ "Why did the scarecrow win an award? Because he was outstanding in his field!", "What do you call fake spaghetti? An impasta!" ], "sad": [ "Why don’t scientists trust atoms? Because they make up everything!", "Why did the bicycle fall over? Because it was two-tired." ], "angry": [ "Why did the tomato turn red? Because it saw the salad dressing!", "What did one angry man say to the other? Nothing, he just threw a rock!" ], "surprised": [ "Did you hear about the claustrophobic astronaut? He just needed a little space!", "Why don’t skeletons fight each other? They don’t have the guts." ], "neutral": [ "What do you call cheese that isn't yours? Nacho cheese!" ] } # Use predefined jokes if available if emotion in jokes: return jokes[emotion][0] # Return the first joke for simplicity # If no predefined joke, use GPT-Neo generator = pipeline('text-generation', model='EleutherAI/gpt-neo-125M') prompt = f"Generate a light-hearted joke for someone who is feeling {emotion}." response = generator(prompt, max_length=50, num_return_sequences=1) return response[0]['generated_text'] except Exception as e: st.error(f"Error generating text: {e}") return "Sorry, I couldn't come up with a joke at this moment." # Function to convert text to speech using gTTS def text_to_speech(text): from gtts import gTTS tts = gTTS(text, lang='en') audio_file = "output.mp3" tts.save(audio_file) # Save the audio file return audio_file # 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) # Save the uploaded file temporarily with open("uploaded_image.jpg", "wb") as f: f.write(uploaded_file.getbuffer()) # Detect facial expression expression_output = query("uploaded_image.jpg") if expression_output: # Assuming the response has a 'label' field with the detected emotion emotion = expression_output[0]['label'] # Adjust based on response structure st.write(f"Detected emotion: {emotion}") # Generate text based on detected emotion joke = generate_text_based_on_mood(emotion) st.write("Here's something to cheer you up:") st.write(joke) # Convert the generated joke to audio audio_file = text_to_speech(joke) # Provide an audio player in the Streamlit app st.audio(audio_file) # Streamlit will handle playback