get-chords / app.py
RayPac006's picture
Update app.py
26c7cfe verified
import gradio as gr
from chord_extractor.extractors import Chordino
import pandas as pd
# Initialize the extractor once
chordino = Chordino()
# Minimum duration to consider a chord "real"
MIN_DURATION = 0.5 # seconds
def format_timestamp(ts):
"""Convert seconds to mm:ss format"""
minutes = int(ts // 60)
seconds = int(ts % 60)
return f"{minutes}:{seconds:02}"
def process_audio(audio_path):
if audio_path is None:
return None, "Please upload an audio file."
try:
# Extract chords
extracted_chords = chordino.extract(audio_path)
# Filter out very short chords and format timestamps
filtered_data = []
prev_timestamp = None
prev_chord = None
for c in extracted_chords:
# Always include the first chord
if prev_timestamp is None:
filtered_data.append([format_timestamp(c.timestamp), c.chord])
prev_timestamp = c.timestamp
prev_chord = c.chord
continue
# Calculate duration since last chord
duration = c.timestamp - prev_timestamp
# Only include if chord lasted at least MIN_DURATION or chord changed
if duration >= MIN_DURATION or c.chord != prev_chord:
filtered_data.append([format_timestamp(c.timestamp), c.chord])
prev_timestamp = c.timestamp
prev_chord = c.chord
return filtered_data, f"Successfully extracted {len(filtered_data)} chord changes."
except Exception as e:
return None, f"Error: {str(e)}"
# Define Gradio interface
with gr.Blocks(title="Guitar Chord Extractor") as demo:
gr.Markdown("# 🎸 Guitar Chord Extractor")
gr.Markdown("Upload an audio file (mp3, wav, flac) to extract the chord progression using Chordino.")
with gr.Row():
with gr.Column():
audio_input = gr.Audio(label="Upload Audio", type="filepath")
submit_btn = gr.Button("Extract Chords", variant="primary")
with gr.Column():
status_output = gr.Textbox(label="Status")
chord_output = gr.Dataframe(
headers=["Timestamp", "Chord"],
datatype=["string", "string"],
label="Extracted Progression"
)
submit_btn.click(
fn=process_audio,
inputs=[audio_input],
outputs=[chord_output, status_output]
)
# Launch the app
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)