File size: 4,030 Bytes
c476c73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77c988d
c476c73
 
 
 
507f557
c476c73
 
 
 
507f557
 
 
 
 
 
 
c476c73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507f557
c476c73
3cf4a2b
 
 
 
c476c73
3cf4a2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c476c73
 
 
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import gradio as gr
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

audios = [
    ["Book Example", "speaker"],
    ["Swoosh", "swoosh"],
    ["Knocking", "knocking"],
    ["Forest", "forest"],
    ["Evil Laugh", "evil-laugh"],
    ["Morning", "morning"],
    ["Cinematic", "cinematic"],
]



with gr.Blocks() as demo:
    with gr.Tab("Waveforms"):
        gr.Markdown("""## Waveforms
                    
In this section, we'll look into the waveforms of multiple audios.

""")
        for title, path in audios:
            with gr.Row():
                with gr.Column(scale=1):
                    gr.Markdown(f"### {title}")
                with gr.Column(scale=5):
                    waveform = gr.Image(value=f"{path}/waveform.png")
                with gr.Column(scale=5):
                    video = gr.Video(value=f"{path}/waveform_video.mp4")

    with gr.Tab("Understanding Frequencies"):
        gr.Markdown("""## Understanding Frequencies
                    """)
        freq = gr.Slider(0, 300, step=20, value=40, label="Frequency")
        freq2 = gr.Slider(0, 30, step=5, value=0, label="Second Frequency")
        amplitude = gr.Slider(0.05, 1, step=0.05, value=1, label="Amplitude")

        audio = gr.Audio()
        with gr.Row():
            plots = gr.Plot(label="Results")
        with gr.Row():
            button = gr.Button(value="Create")
        
        # https://github.com/gradio-app/gradio/issues/5469
        @gr.on(inputs=[freq, freq2, amplitude], outputs=[audio, plots])
        def plot_sine(freq, freq2, a):
            sr = 44100   # samples per second
            ts = 1.0/sr # sampling interval
            t = np.arange(0, 1, ts) # time vector
            data = a * np.sin(2 * np.pi * freq * t) + a * np.sin(2 * np.pi * freq2 * t)

            # Normalize to [-1, 1]
            data = data / np.max(np.abs(data))

            # Convert to 16-bit integer PCM
            data = (data * 32767).astype(np.int16)
            audio_data = (sr, data)
    
            fig, axes = plt.subplots(nrows=2, ncols=1, sharex=False)
            ax_waveform = axes[0]
            ax_spectrum = axes[1]

            ax_waveform.plot(t, data)
            ax_waveform.set_title(f'Sine wave with frequency {freq} and amplitude {a}')
            ax_waveform.set_xlabel('Time )s)')
            ax_waveform.set_ylabel('Amplitude')
            ax_waveform.set_title("Time domain of the signal")

            X = np.fft.fft(data)
            N = len(X)
            n = np.arange(N)
            T = N/sr
            freq = n/T
            ax_spectrum.set_xlim((0,300))
            ax_spectrum.stem(freq, np.abs(X), 'r', \
                markerfmt=" ", basefmt="-b")
            ax_spectrum.set_xlabel("Frequency (Hz)")
            ax_spectrum.set_title("Frequency domain of the signal")

            fig.tight_layout()
            fig.savefig('foo.png')
            return audio_data, fig
        button.click(plot_sine, inputs=[freq, freq2, amplitude], outputs=[audio, plots])
    with gr.Tab("Spectrograms and Mel Spectrograms"):
        gr.Markdown("""## Waveforms
                    
In this section, we'll look into the waveforms of multiple audios.

""")
        for title, path in audios:
            with gr.Row():
                with gr.Column(scale=1):
                    gr.Markdown(f"### {title}")
                with gr.Column(scale=10):
                    gr.Image(value=f"{path}/waveform.png")
                with gr.Column(scale=10):
                    gr.Image(value=f"{path}/fft.png")
                with gr.Column(scale=10):
                    video = gr.Video(value=f"{path}/waveform_video.mp4")
            with gr.Row():
                with gr.Column(scale=5):
                    gr.Image(value=f"{path}/spectrogram.png")
                with gr.Column(scale=5):
                    gr.Image(value=f"{path}/mel_spectrogram.png")
                
  
if __name__ == '__main__':
    demo.launch(debug=True)