File size: 2,080 Bytes
de60a6a
458da1c
a0110cc
 
 
eb0bc41
77121d6
a0110cc
 
 
 
 
77121d6
a0110cc
 
77121d6
a0110cc
 
 
6af81aa
77121d6
458da1c
6af81aa
77121d6
d0b2fc8
 
 
5a86410
0166575
 
 
 
 
 
 
 
77121d6
5a86410
0166575
 
 
 
 
 
 
 
 
5a86410
0166575
 
 
 
 
5a86410
41bada8
77121d6
41bada8
a0110cc
 
 
 
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 matplotlib.pyplot as plt
import numpy as np
import os
import soundfile as sf

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)

    # Flatten the audio data if it's not mono
    audio_data = audio_data.flatten() if len(audio_data.shape) > 1 else audio_data

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

    # 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

    # Create a table with the audio file info
    info_table = f"""
    # Ilaria Audio Analyzer 💖

    Audio Analyzer Software by Ilaria, Help me on Ko-Fi

    Special thanks to Alex Murkoff for helping me coding it!

    Need help with AI? Join AI Hub!

    | Information | Value |
    | --- | --- |
    | Duration | {int(minutes)} minutes - {int(seconds)} seconds - {int(milliseconds)} milliseconds |
    | Samples per second | {audio_info.samplerate} Hz |
    | Audio Channels | {audio_info.channels} |
    | Bitrate | {bitrate:.2f} Mb/s |
    | Extension | {os.path.splitext(audio_file)[1]} |
    """

    # Return the PNG file of the spectrogram and the info table
    return info_table, 'spectrogram.png'

# Create the Gradio interface
iface = gr.Interface(fn=create_spectrogram_and_get_info, inputs=gr.Audio(type="filepath"), outputs=["markdown", "image"])
iface.launch()