Spaces:
Runtime error
Runtime error
| # Import necessary libraries | |
| import torch | |
| import numpy as np | |
| import transformers | |
| import scipy.io.wavfile as wavfile | |
| import openai | |
| from transformers import pipeline | |
| from transformers import WhisperProcessor, WhisperForConditionalGeneration | |
| from gtts import gTTS | |
| import os | |
| import gradio as gr | |
| import librosa | |
| # Set your OpenAI API key (consider using environment variables for security) | |
| openai.api_key = "your_api_key_here" # Replace with your actual API key | |
| class MoodEnhancerModel: | |
| def __init__(self): | |
| print("Initializing Mood Enhancer Model...") | |
| # Initialize Whisper for speech recognition | |
| print("Loading Whisper model...") | |
| self.whisper_processor = WhisperProcessor.from_pretrained("openai/whisper-base") | |
| self.whisper_model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base") | |
| # Initialize BERT for sentiment analysis/mood detection | |
| print("Loading BERT model...") | |
| self.sentiment_analyzer = pipeline( | |
| "sentiment-analysis", | |
| model="nlptown/bert-base-multilingual-uncased-sentiment" | |
| ) | |
| print("All models loaded successfully!") | |
| def transcribe_audio(self, audio_file): | |
| """Transcribe audio using Whisper""" | |
| print("Transcribing audio...") | |
| # Process through Whisper API for better results | |
| try: | |
| with open(audio_file, "rb") as f: | |
| audio_data = f.read() | |
| transcript = openai.Audio.transcribe("whisper-1", audio_data) | |
| transcribed_text = transcript["text"] | |
| except Exception as e: | |
| print(f"OpenAI API error: {e}") | |
| # Fallback to local Whisper model | |
| # Load and preprocess the audio | |
| audio_array, sampling_rate = librosa.load(audio_file, sr=16000) | |
| input_features = self.whisper_processor( | |
| audio_array, sampling_rate=16000, return_tensors="pt" | |
| ).input_features | |
| # Generate token ids | |
| predicted_ids = self.whisper_model.generate(input_features) | |
| # Decode token ids to text | |
| transcribed_text = self.whisper_processor.batch_decode( | |
| predicted_ids, skip_special_tokens=True | |
| )[0] | |
| print(f"Transcribed text: {transcribed_text}") | |
| return transcribed_text | |
| def analyze_mood(self, text): | |
| """Analyze mood using BERT""" | |
| print("Analyzing mood...") | |
| results = self.sentiment_analyzer(text) | |
| # Convert 1-5 star rating to mood scale | |
| sentiment_score = int(results[0]['label'].split()[0]) | |
| moods = { | |
| 1: "very negative", | |
| 2: "negative", | |
| 3: "neutral", | |
| 4: "positive", | |
| 5: "very positive" | |
| } | |
| detected_mood = moods[sentiment_score] | |
| print(f"Detected mood: {detected_mood}") | |
| return detected_mood, sentiment_score | |
| def generate_response(self, text, mood, mood_score): | |
| """Generate mood enhancing response using OpenAI""" | |
| print("Generating mood enhancing response...") | |
| # Customize the prompt based on detected mood | |
| if mood_score <= 2: | |
| prompt = f""" | |
| The user seems to be feeling {mood}. Their message was: "{text}" | |
| Generate an empathetic and uplifting response that acknowledges their feelings | |
| but helps shift their perspective to something more positive. Keep the response | |
| conversational, warm and under 3 sentences. | |
| """ | |
| elif mood_score == 3: | |
| prompt = f""" | |
| The user seems to be feeling {mood}. Their message was: "{text}" | |
| Generate a cheerful response that builds on any positive aspects of their message | |
| and adds some encouraging thoughts. Keep the response conversational, | |
| warm and under 3 sentences. | |
| """ | |
| else: | |
| prompt = f""" | |
| The user seems to be feeling {mood}. Their message was: "{text}" | |
| Generate a response that celebrates their positive state and offers a way to | |
| maintain or enhance this good feeling. Keep the response conversational, | |
| warm and under 3 sentences. | |
| """ | |
| try: | |
| # Updated for OpenAI's current API format | |
| response = openai.ChatCompletion.create( | |
| model="gpt-3.5-turbo", | |
| messages=[ | |
| {"role": "system", "content": "You are an empathetic AI assistant designed to enhance the user's mood."}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| max_tokens=150, | |
| temperature=0.7 | |
| ) | |
| enhanced_response = response['choices'][0]['message']['content'].strip() | |
| print(f"Generated response: {enhanced_response}") | |
| return enhanced_response | |
| except Exception as e: | |
| print(f"Error with OpenAI API: {e}") | |
| # Fallback responses if API fails | |
| if mood_score <= 2: | |
| return "I notice you might be feeling down. Remember that challenging moments are temporary, and small positive steps can help shift your perspective." | |
| elif mood_score == 3: | |
| return "I sense a neutral mood. What's one small thing that brought you joy today? Focusing on positive moments, even tiny ones, can boost your overall wellbeing." | |
| else: | |
| return "It sounds like you're in a good mood! That's wonderful to hear. Savoring these positive feelings can help them last longer." | |
| def text_to_speech(self, text): | |
| """Convert text to speech""" | |
| print("Converting to speech...") | |
| tts = gTTS(text=text, lang='en', slow=False) | |
| output_path = "response.mp3" | |
| tts.save(output_path) | |
| return output_path | |
| def process_text_input(self, text_input): | |
| """Process text input and return results""" | |
| mood, mood_score = self.analyze_mood(text_input) | |
| response = self.generate_response(text_input, mood, mood_score) | |
| audio_file = self.text_to_speech(response) | |
| return text_input, mood, mood_score, response, audio_file | |
| def process_audio_input(self, audio_file): | |
| """Process audio input and return results""" | |
| text = self.transcribe_audio(audio_file) | |
| mood, mood_score = self.analyze_mood(text) | |
| response = self.generate_response(text, mood, mood_score) | |
| audio_response = self.text_to_speech(response) | |
| return text, mood, mood_score, response, audio_response | |
| # Initialize the model | |
| model = MoodEnhancerModel() | |
| # Create a Gradio interface for text input | |
| def text_interface(text): | |
| input_text, mood, mood_score, response, audio_file = model.process_text_input(text) | |
| return mood, f"Mood score: {mood_score}/5", response, audio_file | |
| # Create a Gradio interface for audio input | |
| def audio_interface(audio): | |
| input_text, mood, mood_score, response, audio_file = model.process_audio_input(audio) | |
| return input_text, mood, f"Mood score: {mood_score}/5", response, audio_file | |
| # Create Gradio tabs for different input types | |
| with gr.Blocks(title="Mood Enhancer") as demo: | |
| gr.Markdown("# Mood Enhancer") | |
| gr.Markdown("Upload an audio file or enter text to analyze your mood and receive an uplifting response.") | |
| with gr.Tabs(): | |
| with gr.TabItem("Text Input"): | |
| with gr.Row(): | |
| text_input = gr.Textbox(label="Enter your text", placeholder="How are you feeling today?", lines=3) | |
| text_button = gr.Button("Analyze Mood") | |
| with gr.Row(): | |
| text_mood = gr.Textbox(label="Detected Mood") | |
| text_score = gr.Textbox(label="Mood Score") | |
| text_response = gr.Textbox(label="Response", lines=3) | |
| text_audio = gr.Audio(label="Audio Response") | |
| text_button.click( | |
| fn=text_interface, | |
| inputs=text_input, | |
| outputs=[text_mood, text_score, text_response, text_audio] | |
| ) | |
| with gr.TabItem("Audio Input"): | |
| audio_input = gr.Audio(label="Upload or Record Audio", type="filepath") | |
| audio_button = gr.Button("Analyze Audio") | |
| with gr.Row(): | |
| transcribed_text = gr.Textbox(label="Transcribed Text") | |
| with gr.Row(): | |
| audio_mood = gr.Textbox(label="Detected Mood") | |
| audio_score = gr.Textbox(label="Mood Score") | |
| audio_response = gr.Textbox(label="Response", lines=3) | |
| response_audio = gr.Audio(label="Audio Response") | |
| audio_button.click( | |
| fn=audio_interface, | |
| inputs=audio_input, | |
| outputs=[transcribed_text, audio_mood, audio_score, audio_response, response_audio] | |
| ) | |
| # Launch the Gradio interface | |
| demo.launch(share=True) |