File size: 4,177 Bytes
de60a6a
458da1c
a0110cc
 
 
bdcf458
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb0bc41
0e08ca7
 
 
 
 
b1faa28
06544d3
bdcf458
0e08ca7
06544d3
0e08ca7
 
 
 
 
 
 
bdcf458
0e08ca7
 
 
bdcf458
 
 
 
 
 
 
 
 
0e08ca7
 
 
d3097eb
bd89bd4
a0110cc
 
 
 
 
77121d6
0e08ca7
 
 
77121d6
a0110cc
 
1027755
6af81aa
77121d6
458da1c
6af81aa
77121d6
d0b2fc8
0e08ca7
d0b2fc8
5a86410
0e08ca7
 
 
 
 
 
 
 
 
 
 
77121d6
bdcf458
5a86410
0e08ca7
 
 
bdcf458
0e08ca7
 
 
 
 
 
5a86410
0e08ca7
ed72842
cb85b93
 
a0110cc
cb85b93
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
import gradio as gr
import matplotlib.pyplot as plt
import numpy as np
import os
import soundfile as sf
import requests

def download_file(url):
    # Estrai l'ID del file dal link di Google Drive
    file_id = url.split('/')[-2]

    # Crea il link di download diretto
    download_url = f'https://docs.google.com/uc?export=download&id={file_id}'

    # Scarica il file
    response = requests.get(download_url, allow_redirects=True)
    local_filename = url.split('/')[-1] + '.wav'
    open(local_filename, 'wb').write(response.content)

    return local_filename

def main():
    # Gradio Interface
    with gr.Blocks() as app:
        gr.Markdown(
            """
            # <div align="center"> Ilaria Audio Analyzer 💖 </div>
            Audio Analyzer Software by Ilaria, Help me on [Ko-Fi!](https://ko-fi.com/ilariaowo)\n
            Special thanks to Alex Murkoff for helping me coding it!
    
            Need help with AI? Join [Join AI Hub!](https://discord.gg/aihub)
            """
        )
    
        with gr.Row():
            with gr.Column():
                audio_input = gr.Audio(type='filepath')
                create_spec_butt = gr.Button(value='Create Spectrogram And Get Info', variant='primary')

            with gr.Column():
                output_markdown = gr.Markdown(value="", visible=True)
                image_output = gr.Image(type='filepath', interactive=False)
            
                with gr.Accordion('Audio Downloader', open=False):
                    url_input = gr.Textbox(value='', label='Google Drive Audio URL')
                    download_butt = gr.Button(value='Download audio', variant='primary')
                
                download_butt.click(fn=download_file, inputs=[url_input], outputs=[audio_input])
                create_spec_butt.click(fn=create_spectrogram_and_get_info, inputs=[audio_input], outputs=[output_markdown, image_output])
            
        download_butt.click(fn=download_file, inputs=[url_input], outputs=[audio_input])
        create_spec_butt.click(fn=create_spectrogram_and_get_info, inputs=[audio_input], outputs=[output_markdown, image_output])
        
        app.queue(max_size=1022).launch(share=True)

def create_spectrogram_and_get_info(audio_file):
    # Clear figure in case it has data in it
    plt.clf()
    
    # Read the audio data from the file
    audio_data, sample_rate = sf.read(audio_file)

    # Convert to mono if it's not mono
    if len(audio_data.shape) > 1:
        audio_data = np.mean(audio_data, axis=1)

    # Create the spectrogram
    plt.specgram(audio_data, Fs=sample_rate / 1, NFFT=4096, sides='onesided',
                 cmap="inferno", scale_by_freq=True, scale='dB', mode='magnitude', window=np.hanning(4096))

    # Save the spectrogram to a PNG file
    plt.savefig('spectrogram.png')

    # Get the audio file info
    audio_info = sf.info(audio_file)
    
    bit_depth = {'PCM_16': 16, 'FLOAT': 32}.get(audio_info.subtype, 0)
    
    # Convert duration to minutes, seconds, and milliseconds
    minutes, seconds = divmod(audio_info.duration, 60)
    seconds, milliseconds = divmod(seconds, 1)
    milliseconds *= 1000  # convert from seconds to milliseconds
    
    # Convert bitrate to mb/s
    bitrate = audio_info.samplerate * audio_info.channels * bit_depth / 8 / 1024 / 1024
    
    # Calculate speed in kbps
    speed_in_kbps = audio_info.samplerate * bit_depth / 1000
    
    # Create a table with the audio file info
    filename_without_extension, _ = os.path.splitext(os.path.basename(audio_file))
    info_table = f"""
    
    | Information | Value |
    | :---: | :---: |
    | File Name | {filename_without_extension} |
    | Duration | {int(minutes)} minutes - {int(seconds)} seconds - {int(milliseconds)} milliseconds |
    | Bitrate | {speed_in_kbps} kbp/s |
    | Audio Channels | {audio_info.channels} |
    | Samples per second | {audio_info.samplerate} Hz |
    | Bit per second | {audio_info.samplerate * audio_info.channels * bit_depth} bit/s |
    
    """
    
    # Return the PNG file of the spectrogram and the info table
    return info_table, 'spectrogram.png'

# Create the Gradio interface
main()