import pesq import numpy as np import soundfile as sf import gradio as gr def calculate_pesq(reference_audio, degraded_audio): # Extract audio data and sample rates from Gradio's Audio widget output ref_signal, ref_sample_rate = reference_audio[0], reference_audio[1] deg_signal, deg_sample_rate = degraded_audio[0], degraded_audio[1] # Convert audio data to the same sample rate if needed if ref_sample_rate != deg_sample_rate: from scipy.signal import resample min_length = min(len(ref_signal), len(deg_signal)) ref_signal = resample(ref_signal[:min_length], len(ref_signal)) deg_signal = resample(deg_signal[:min_length], len(deg_signal)) pesq_score = pesq.pesq(ref_signal, deg_signal, ref_sample_rate) return pesq_score def calculate_snr(reference_audio, degraded_audio): ref_signal, _ = reference_audio deg_signal, _ = degraded_audio noise = ref_signal - deg_signal snr = 10 * np.log10(np.sum(ref_signal**2) / np.sum(noise**2)) return snr def calculate_audio_difference(reference_audio, degraded_audio): ref_signal, ref_sample_rate = reference_audio[0], reference_audio[1] deg_signal, deg_sample_rate = degraded_audio[0], degraded_audio[1] if ref_sample_rate != deg_sample_rate: from scipy.signal import resample min_length = min(len(ref_signal), len(deg_signal)) ref_signal = resample(ref_signal[:min_length], len(ref_signal)) deg_signal = resample(deg_signal[:min_length], len(deg_signal)) diff_count = np.count_nonzero(ref_signal != deg_signal) total_samples = len(ref_signal) difference_percentage = (diff_count / total_samples) * 100 return difference_percentage def audio_quality_interface(reference_audio, degraded_audio): pesq_score = calculate_pesq(reference_audio, degraded_audio) snr = calculate_snr(reference_audio, degraded_audio) difference_percentage = calculate_audio_difference(reference_audio, degraded_audio) result = f"Risultati:\n\nPunteggio PESQ: {pesq_score:.2f}\nSNR: {snr:.2f}\nPercentuale di differenza: {difference_percentage:.2f}%" return result iface = gr.Interface(fn=audio_quality_interface, inputs=[gr.Audio(label="Audio di riferimento"), gr.Audio(label="Audio degradato")], outputs=gr.Textbox(), layout="vertical", live=True) iface.launch()