File size: 1,531 Bytes
4cc54d7
 
 
 
 
 
2f40a85
4cc54d7
1dc0f0f
4cc54d7
 
1dc0f0f
4cc54d7
 
 
 
 
 
 
 
 
 
 
 
 
 
1dc0f0f
 
 
4cc54d7
 
 
1dc0f0f
4cc54d7
2f40a85
 
1dc0f0f
2f40a85
4cc54d7
2f40a85
4cc54d7
 
 
 
b3e87b5
 
1dc0f0f
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
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):
    # Load audio file
    y, sr = librosa.load(audio_file, sr=None)
    duration = librosa.get_duration(y=y, sr=sr)
    
    # Create a figure and axis for the animation
    fig, ax = plt.subplots()
    line, = ax.plot([], [], lw=2)
    ax.set_xlim(0, duration)
    ax.set_ylim(np.min(y), np.max(y))
    
    # Function to initialize the animation
    def init():
        line.set_data([], [])
        return line,
    
    # Function to update the animation frame
    def update(frame):
        start = frame * sr
        end = min(start + sr, len(y))
        line.set_data(np.linspace(0, duration, num=len(y[:end])), y[:end])
        return line,
    
    # Create the animation
    ani = FuncAnimation(fig, update, frames=np.arange(0, int(duration)), init_func=init, blit=True)
    
    # Save the animation to a temporary file
    with tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') as tmpfile:
        ani.save(tmpfile.name, writer='ffmpeg', fps=1)
        video_path = tmpfile.name
    
    return video_path

# Define the Gradio interface
iface = gr.Interface(
    fn=extract_waveform_animation,
    inputs=gr.Audio(type="filepath"),
    outputs=gr.Video(),
    description="Upload an audio file to extract a video animation from its waveform."
)

# Launch the app
if __name__ == "__main__":
    iface.launch()