ConcertBuddy / app.py
keivalya's picture
Update app.py
24bc888 verified
import gradio as gr
from gradio.themes import Soft
import os
from dotenv import load_dotenv
from transcript import transcribe_audio # Import the transcription function
from metadata import info
import numpy as np
import requests
from scipy.io.wavfile import write
from groq import Groq
import json
from genius import get_song_info_from_lyrics
# Load environment variables from .env file
load_dotenv()
client = Groq(
api_key=os.environ["GROQ_API_KEY"],
)
def song_history(message):
# question = "Tell me the history or a fun fact of the song (in a single line!): " + message
completion = client.chat.completions.create(
model="llama3-8b-8192",
messages=[
{
"role": "system",
"content": "You are a professor of music at Berklee College of Music."
},
# Set a user message for the assistant to respond to.
{
"role": "user",
"content": "Please explain the historical and musical significance of " + message + ". Please also break down the instruments used in the song. Keep it just one line!",
}
],
temperature=1,
max_completion_tokens=1024,
top_p=1,
stream=True,
stop=None,
)
return completion.choices[0].message.content
def analyze_song(mp3_file):
# Call the transcription function and get the transcription
# Pass the mp3 filename to transcript.py
os.makedirs("out", exist_ok=True)
write('test.wav', mp3_file[0], mp3_file[1])
data = {
'api_token': os.environ["AUDD_API"],
'return': 'apple_music,spotify',
}
files = {
'file': open('test.wav', 'rb'),
}
result = requests.post('https://api.audd.io/', data=data, files=files)
transcription = transcribe_audio('test.wav')
if result.json()['result']['artist'] is not None:
artist = result.json()['result']['artist']
title = result.json()['result']['title']
# genre = result.json()['result']['apple_music']['genreNames']
try:
genre_list = result.json()['result']['apple_music']['genreNames']
except:
genre_list = ['']
genre = ", ".join(genre_list)
try:
image_url = result.json()['result']['spotify']['album']['images'][0]['url']
except:
image_url = ""
else:
image_url = ""
genre = ""
genius_response = get_song_info_from_lyrics(transcription)
title = genius_response["title"]
artist = genius_response["artist"]
# else:
song_data = json.loads(info(title, artist))
if (genre == None):
genre = song_data["genre"]
# print(song_data)
# Placeholder for song analysis logic
instrumentation = str(song_data["instrumentation"])[1:-2].replace('\'', '')
lyrics = transcription # Use the transcription as lyrics
tempo_key = song_data["tempo"] + ", " + song_data["key"]
history = song_data["historical"]
# instrumentation = "Sample Instrumentation"
# lyrics = transcription # Use the transcription as lyrics
# tempo_key = "Sample Tempo/Key"
# history = "History"
# history = song_history(title)
return title, artist, genre, instrumentation, lyrics, tempo_key, history, image_url # Return the mp3 file for replay
# Custom CSS to set a fun musical theme image as background
css = """
body {
background-image: url('https://example.com/path/to/your/musical-theme-image.jpg'); /* Replace with your image URL */
background-size: cover; /* Cover the entire background */
background-repeat: no-repeat; /* Prevent repeating the image */
background-position: center; /* Center the image */
}
"""
demo = gr.Interface(
fn=analyze_song,
inputs=gr.Audio(label="Record Audio", sources=["upload", "microphone"],
waveform_options=gr.WaveformOptions(
waveform_color="#01C6FF",
waveform_progress_color="#0066B4",
skip_length=2,
show_controls=False,
),
), # Record audio in MP3 format
outputs=[
gr.Textbox(label="Title"),
gr.Textbox(label="Artist"),
gr.Textbox(label="Genre"),
gr.Textbox(label="Instrumentation"),
gr.Textbox(label="Lyrics"),
gr.Textbox(label="Tempo/Key"),
gr.Textbox(label="History"),
# gr.Audio(label="Replay Recorded Audio"), # Add an output for replaying the recorded audio
gr.Image(label="Cover") # Gives the Cover image
],
theme=Soft(), # Apply the Soft theme
title="Concert Buddy πŸ˜„πŸŽ΅πŸͺ©" # Apply custom CSS for background image
)
demo.launch()