import gradio as gr import os from acrcloud.recognizer import ACRCloudRecognizer import tempfile import shutil # Retrieve ACRCloud credentials from environment variables acr_access_key = os.environ.get('ACR_ACCESS_KEY') acr_access_secret = os.environ.get('ACR_ACCESS_SECRET') acr_host = 'identify-ap-southeast-1.acrcloud.com' # os.environ.get('ACR_HOST', 'eu-west-1.api.acrcloud.com') # ACRCloud recognizer configuration config = { 'host': acr_host, 'access_key': acr_access_key, 'access_secret': acr_access_secret, 'timeout': 10 # seconds } # Initialize ACRCloud recognizer acr = ACRCloudRecognizer(config) def identify_audio(file): # Gradio provides a file object, and file.name contains the path file_path = file.name # Gradio file object already provides a file path # Get the duration of the audio file in milliseconds duration_ms = int(acr.get_duration_ms_by_file(file_path)) results = [] # Process audio in 10-second chunks for i in range(0, duration_ms // 1000, 10): res = acr.recognize_by_file(file_path, i, 10) results.append(f"Time {i}s: {res.strip()}") # Full recognition result full_result = acr.recognize_by_file(file_path, 0) # Recognize using file buffer with open(file_path, 'rb') as f: buf = f.read() buffer_result = acr.recognize_by_filebuffer(buf, 0) # Parse and structure the results in a more readable format partial_results = "\n".join(results) full_result_parsed = f"Title: {full_result['metadata']['music'][0]['title']}\n" \ f"Artist: {full_result['metadata']['music'][0]['artists'][0]['name']}\n" \ f"Album: {full_result['metadata']['music'][0]['album']['name']}\n" \ f"Release Date: {full_result['metadata']['music'][0]['release_date']}\n" \ f"Duration: {full_result['metadata']['music'][0]['duration_ms'] // 1000}s" buffer_result_parsed = f"Track ID: {buffer_result['metadata']['music'][0]['external_metadata']['spotify']['track']['id']}\n" \ f"Track Name: {buffer_result['metadata']['music'][0]['external_metadata']['spotify']['track']['name']}\n" \ f"Artist: {buffer_result['metadata']['music'][0]['external_metadata']['spotify']['track']['artists'][0]['name']}\n" return { "Partial Results": partial_results, "Full Result": full_result_parsed, "Buffer Result": buffer_result_parsed } # Create Gradio interface iface = gr.Interface( fn=identify_audio, inputs=gr.File(label="Upload Audio File"), outputs=[gr.Textbox(label="Partial Results"), gr.Textbox(label="Full Result"), gr.Textbox(label="Buffer Result")], title="Audio Search by File", description="Upload an audio file to identify it using ACRCloud." ) # Launch the Gradio interface iface.launch()