File size: 1,939 Bytes
e235376
 
 
 
 
 
 
 
 
 
ace35b6
 
 
 
 
 
 
 
 
e235376
ace35b6
e235376
 
 
 
 
 
ace35b6
 
e235376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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()