Spaces:
Running
Running
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() |