import gradio as gr import joblib import numpy as np import spotipy from spotipy.oauth2 import SpotifyClientCredentials import random # Load the saved models and pipelines anxiety_model = joblib.load('Anxiety_best_model.pkl') anxiety_pipeline = joblib.load('Anxiety_best_pipeline.pkl') depression_model = joblib.load('Depression_best_model.pkl') depression_pipeline = joblib.load('Depression_best_pipeline.pkl') insomnia_model = joblib.load('Insomnia_best_model.pkl') insomnia_pipeline = joblib.load('Insomnia_best_pipeline.pkl') ocd_model = joblib.load('OCD_best_model.pkl') ocd_pipeline = joblib.load('OCD_best_pipeline.pkl') # Spotify API credentials SPOTIPY_CLIENT_ID = '79d5de7b9bec45c4bc2ae857e29d89e4' SPOTIPY_CLIENT_SECRET = '410907e455a24118810bd89ee99d6f68' # Initialize Spotify client sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials(client_id=SPOTIPY_CLIENT_ID, client_secret=SPOTIPY_CLIENT_SECRET)) # Define the prediction functions def predict(model, pipeline, inputs): inputs_array = np.array(inputs).reshape(1, -1) inputs_scaled = pipeline.transform(inputs_array) prediction = model.predict(inputs_scaled) return prediction[0] # Function to recommend songs based on the condition and prediction def recommend_songs(condition, prediction): mood_keywords = { "Anxiety": ["relaxing", "calming", "soothing"], "Depression": ["uplifting", "motivational", "cheerful"], "Insomnia": ["sleep", "ambient", "white noise"], "OCD": ["focus", "mindfulness", "meditation"] } # Select a random keyword based on the condition keyword = random.choice(mood_keywords[condition]) # Adjust the search query based on the prediction value if prediction < 3: query = f"mild {keyword} music" elif prediction < 6: query = f"moderate {keyword} music" else: query = f"intense {keyword} music" results = sp.search(q=query, type='track', limit=5) songs = [] for item in results['tracks']['items']: song = { 'name': item['name'], 'artist': item['artists'][0]['name'], 'album': item['album']['name'], 'image_url': item['album']['images'][0]['url'] if item['album']['images'] else None, 'preview_url': item['preview_url'] } songs.append(song) return songs # Define the main prediction and recommendation function def predict_and_recommend(condition, *inputs): if condition == "Anxiety": prediction = predict(anxiety_model, anxiety_pipeline, inputs) elif condition == "Depression": prediction = predict(depression_model, depression_pipeline, inputs) elif condition == "Insomnia": prediction = predict(insomnia_model, insomnia_pipeline, inputs) else: # OCD prediction = predict(ocd_model, ocd_pipeline, inputs) songs = recommend_songs(condition, prediction) return prediction, f"The predicted {condition} level is {prediction:.2f}", songs # Function to create HTML for song recommendations def create_song_html(songs): if not songs or not isinstance(songs, list): return "No songs to display" html = "
" for song in songs: html += f"""

{song.get('name', 'Unknown')}

{song.get('artist', 'Unknown Artist')}

{song.get('album', 'Unknown Album')}

{f'' if song.get('preview_url') else 'No preview available'}
""" html += "
" return html # Define the main prediction and recommendation function def predict_and_recommend(condition, *inputs): if condition == "Anxiety": prediction = predict(anxiety_model, anxiety_pipeline, inputs) elif condition == "Depression": prediction = predict(depression_model, depression_pipeline, inputs) elif condition == "Insomnia": prediction = predict(insomnia_model, insomnia_pipeline, inputs) else: # OCD prediction = predict(ocd_model, ocd_pipeline, inputs) songs = recommend_songs(condition, prediction) song_html = create_song_html(songs) return prediction, f"The predicted {condition} level is {prediction:.2f}", song_html # Define the Gradio interface with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# Music & Mental Health Predictor") gr.Markdown("### This innovative application predicts levels of anxiety, depression, insomnia, and OCD on a scale of 0 to 10, providing users with personalized insights into their mental health. Based on these predicted values, the app also recommends tailored music tracks designed to help manage and alleviate specific symptoms. By combining mental health assessment with mood-enhancing music recommendations, this tool offers a unique, holistic approach to supporting emotional well-being and self-care.") with gr.Row(): condition = gr.Radio(["Anxiety", "Depression", "Insomnia", "OCD"], label="Select Condition") with gr.Row(): with gr.Column(): age = gr.Number(label="Age") hours_per_day = gr.Number(label="Hours per day listening to music") depression = gr.Number(label="Depression level (0-10)") insomnia = gr.Number(label="Insomnia level (0-10)") ocd = gr.Number(label="OCD level (0-10)") bpm = gr.Number(label="Preferred BPM") with gr.Column(): prediction_value = gr.Number(label="Predicted Value") prediction_text = gr.Textbox(label="Prediction Description") song_recommendations = gr.HTML(label="Recommended Songs") predict_btn = gr.Button("Predict and Recommend Songs") predict_btn.click( fn=predict_and_recommend, inputs=[condition, age, hours_per_day, depression, insomnia, ocd, bpm], outputs=[prediction_value, prediction_text, song_recommendations], ) # Launch the interface demo.launch(debug=True)