File size: 1,807 Bytes
4cc54d7
 
 
 
7ccd379
4cc54d7
2f40a85
4cc54d7
7ccd379
4cc54d7
1dc0f0f
4cc54d7
 
7ccd379
 
05629f7
7ccd379
 
 
6c001bc
4cc54d7
 
05629f7
7ccd379
4cc54d7
05629f7
4cc54d7
7ccd379
1dc0f0f
05629f7
 
 
7ccd379
 
 
 
 
4cc54d7
05629f7
7ccd379
 
 
4cc54d7
2f40a85
7ccd379
2f40a85
4cc54d7
2f40a85
4cc54d7
7ccd379
4cc54d7
 
05629f7
 
7ccd379
05629f7
b3e87b5
05629f7
4cc54d7
 
 
 
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 numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import io
import librosa
import tempfile

def extract_waveform_animation(audio_file, window_seconds=5):
    y, sr = librosa.load(audio_file, sr=None)
    duration = librosa.get_duration(y=y, sr=sr)
    
    fig, ax = plt.subplots()
    line, = ax.plot([], [], lw=2)
    window_length = int(window_seconds * sr)
    
    # Initialize with first window
    first_window = y[:window_length]
    x_vals = np.linspace(0, duration, num=len(y))
    ax.set_axis_off()
    
    def init():
        ax.set_xlim(0, window_seconds)
        ax.set_ylim(np.min(y), np.max(y))  # Reduced max for visibility
        return line,

    def update(frame):
        # Get current window
        start = frame * sr
        end = start + window_length
        window = y[start:end]
        
        # Update x and y limits
        ax.set_xlim(frame, frame + window_seconds)
        
        # Update line data
        line.set_data(x_vals[start:end], window)
        return line,

    total_frames = int(duration)
    ani = FuncAnimation(fig, update, frames=range(total_frames), 
                       init_func=init, interval=7, blit=False)
    
    with tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') as tmpfile:
        ani.save(tmpfile.name, writer='ffmpeg', fps=1)
        video_path = tmpfile.name
    
    return video_path

# Modified interface with window controls
iface = gr.Interface(
    fn=extract_waveform_animation,
    inputs=[
        gr.Audio(type="filepath"),
        gr.Slider(1, 10, value=5, step=1, label="Window Size (seconds)")
    ],
    outputs=gr.Video(),
    description="Scroll through audio waveform with a moving window."
)

if __name__ == "__main__":
    iface.launch()