import gradio as gr import librosa import librosa.display import numpy as np import matplotlib.pyplot as plt def visualize_audio(file): # Charger l'audio y, sr = librosa.load(file, sr=None) # Détecter les segments actifs (éviter les silences) intervals = librosa.effects.split(y, top_db=20) # Seuil de silence (en dB) if len(intervals) == 0: # Si pas de segment actif, on garde tout y_active = y else: start, end = intervals[0][0], intervals[-1][1] # Début et fin du segment actif y_active = y[start:end] # Transformer le signal en spectre de fréquences D = librosa.stft(y_active) # Transformée de Fourier magnitude, phase = np.abs(D), np.angle(D) # Créer les figures pour affichage fig, ax = plt.subplots(3, 1, figsize=(10, 12)) # 1. Affichage de la forme d'onde ax[0].plot(y_active, color="blue") ax[0].set_title("Forme d'onde (intervalle actif)") ax[0].set_xlabel("Temps (échantillons)") ax[0].set_ylabel("Amplitude") # 2. Affichage du spectrogramme librosa.display.specshow(librosa.amplitude_to_db(magnitude, ref=np.max), sr=sr, y_axis='log', x_axis='time', ax=ax[1]) ax[1].set_title("Spectrogramme (log-magnitude)") ax[1].set_xlabel("Temps (s)") ax[1].set_ylabel("Fréquence (Hz)") # 3. Affichage de la phase librosa.display.specshow(phase, sr=sr, y_axis='log', x_axis='time', ax=ax[2], cmap='twilight') ax[2].set_title("Phase (FFT)") ax[2].set_xlabel("Temps (s)") ax[2].set_ylabel("Fréquence (Hz)") # Sauvegarde de l'image plt.tight_layout() image_path = "audio_visualization.png" plt.savefig(image_path) plt.close() return image_path # Interface Gradio pour tester iface = gr.Interface( fn=visualize_audio, inputs=gr.Audio(type="filepath"), outputs="image", title="Visualisation Audio (Waveform, Spectrogramme, Phase)" ) iface.launch()