File size: 4,363 Bytes
f7c8a78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d1eb12b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7c8a78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
116
117
118
119
120
121
import streamlit as st
from transformers import pipeline
import google.generativeai as genai
from pytube import Search
import speech_recognition as sr

# Load sentiment analysis model
mood_classifier = pipeline("sentiment-analysis")

# Speech-to-text function
def speech_to_text():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        st.write("🎀 Speak now...")
        audio = recognizer.listen(source)
        try:
            text = recognizer.recognize_google(audio)
            st.write(f"🎀 You said: **{text}**")
            return text
        except sr.UnknownValueError:
            st.error("Sorry, I could not understand your audio.")
            return None
        except sr.RequestError:
            st.error("Sorry, there was an issue with the speech recognition service.")
            return None

# Functions
def detect_mood(text):
    result = mood_classifier(text)[0]
    if result['label'] == 'POSITIVE':
        return "joyful"
    elif result['label'] == 'NEGATIVE':
        return "sad"
    else:
        return "neutral"

def get_song_recommendations(mood, api_key):
    try:
        genai.configure(api_key=api_key)
        model = genai.GenerativeModel('gemini-pro')

        # System prompt to guide the AI
        system_prompt = """
        You are a music recommendation assistant specialized in Indian songs. Your task is to suggest popular Indian songs based on the user's mood.
        - If the mood is "happy," suggest upbeat and joyful Bollywood or Indian pop songs.
        - If the mood is "sad," suggest emotional and soulful Indian songs.
        - If the mood is "energetic," suggest high-energy dance or workout songs.
        - If the mood is "romantic," suggest romantic Bollywood or Indian love songs.
        - If the mood is "calm," suggest soothing Indian classical or instrumental music.
        Always suggest 3 songs and provide the song title and artist name in the format:
        1. Song Title - Artist Name
        2. Song Title - Artist Name
        3. Song Title - Artist Name
        """
        
        # User prompt
        user_prompt = f"Suggest 3 popular Indian {mood} songs."
        
        # Combine system and user prompts
        response = model.generate_content([system_prompt, user_prompt])
        return response.text
    except Exception as e:
        st.error(f"Error using Gemini API: {e}")
        return None

def search_youtube(query):
    search = Search(query)
    return search.results[0].watch_url

# Streamlit App
st.title("🎡 Mood-Based Indian Song Player")

# Sidebar for user input
st.sidebar.header("How are you feeling today?")
mood_options = ["happy", "sad", "energetic", "romantic", "calm"]

# Input for Gemini API key
gemini_api_key = st.sidebar.text_input("Enter your Gemini API Key:", type="password")

# Add a button for speech input
if st.sidebar.button("🎀 Speak your mood"):
    user_mood = speech_to_text()
else:
    user_mood = st.sidebar.selectbox("Or select your mood:", mood_options)

# Playlist
if 'playlist' not in st.session_state:
    st.session_state.playlist = []

# Main content
if user_mood and gemini_api_key:
    mood = detect_mood(user_mood)
    st.write(f"🎭 Detected Mood: **{mood}**")
    
    st.write("🎡 Recommended Songs:")
    recommendations = get_song_recommendations(mood, gemini_api_key)
    if recommendations:
        st.write(recommendations)
        
        song_names = recommendations.split("\n")
        for song in song_names:
            if song.strip():
                st.write(f"πŸ” Searching for: **{song}**")
                video_url = search_youtube(song)
                st.video(video_url)
                
                # Add to playlist button
                if st.button(f"Add '{song}' to Playlist"):
                    st.session_state.playlist.append((song, video_url))
                    st.success(f"Added '{song}' to your playlist!")
    else:
        st.error("Failed to get song recommendations. Please check your API key.")
elif not gemini_api_key:
    st.warning("Please enter your Gemini API key to get started.")

# Display the playlist
st.sidebar.header("Your Playlist")
for idx, (song, url) in enumerate(st.session_state.playlist):
    st.sidebar.write(f"{idx + 1}. {song}")
    if st.sidebar.button(f"Play {song}", key=f"play_{idx}"):
        st.video(url)