File size: 5,528 Bytes
f7c8a78
 
 
 
b322b24
 
 
 
f7c8a78
0f1be6d
b322b24
f7c8a78
 
 
 
 
 
 
 
 
 
 
b322b24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7c8a78
 
 
 
d1eb12b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7c8a78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b322b24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7c8a78
 
 
 
 
 
b322b24
 
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import streamlit as st
from transformers import pipeline
import google.generativeai as genai
from pytube import Search
import speech_recognition as sr
import tempfile
from pydub import AudioSegment
import numpy as np

# Load sentiment analysis model using PyTorch backend
mood_classifier = pipeline("sentiment-analysis", framework="pt")

# 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 speech_to_text():
    # Initialize recognizer
    r = sr.Recognizer()
    
    # Create a temporary file to store the recorded audio
    with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as fp:
        # Add audio recording widget
        audio_bytes = st.audio_recorder(
            text="Click to record your mood",
            recording_color="#e8b62c",
            neutral_color="#6aa36f"
        )
        
        if audio_bytes:
            # Save audio bytes to temporary file
            fp.write(audio_bytes)
            temp_filename = fp.name
            
            # Read the audio file
            with sr.AudioFile(temp_filename) as source:
                # Adjust for ambient noise and record
                r.adjust_for_ambient_noise(source)
                audio = r.record(source)
                
                try:
                    # Use Google Speech Recognition
                    text = r.recognize_google(audio)
                    return text
                except sr.UnknownValueError:
                    st.error("Could not understand the audio")
                    return None
                except sr.RequestError:
                    st.error("Could not request results from speech recognition service")
                    return None
    return None

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 option to choose between text and speech input
input_method = st.sidebar.radio("Choose input method:", ["Text", "Speech"])

if input_method == "Text":
    # Text input
    user_mood = st.sidebar.selectbox("Select your mood:", mood_options)
else:
    # Speech input
    st.write("๐Ÿ“ข Tell me about your day...")
    spoken_text = speech_to_text()
    
    if spoken_text:
        st.write(f"You said: {spoken_text}")
        user_mood = detect_mood(spoken_text)
    else:
        user_mood = None

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

# Main content
if (user_mood or spoken_text) and gemini_api_key:
    mood = detect_mood(user_mood if user_mood else spoken_text)
    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)