File size: 2,501 Bytes
85d3b29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import matplotlib.pyplot as plt
import soundfile as sf
import numpy as np
import os

from assets.i18n.i18n import I18nAuto

i18n = I18nAuto()


def generate_spectrogram(audio_data, sample_rate, file_name):
    plt.clf()

    plt.specgram(
        audio_data,
        Fs=sample_rate / 1,
        NFFT=4096,
        sides="onesided",
        cmap="Reds_r",
        scale_by_freq=True,
        scale="dB",
        mode="magnitude",
        window=np.hanning(4096),
    )

    plt.title(file_name)
    plt.savefig("spectrogram.png")


def get_audio_info(audio_file):
    audio_data, sample_rate = sf.read(audio_file)

    if len(audio_data.shape) > 1:
        audio_data = np.mean(audio_data, axis=1)

    generate_spectrogram(audio_data, sample_rate, os.path.basename(audio_file))

    audio_info = sf.info(audio_file)
    bit_depth = {"PCM_16": 16, "FLOAT": 32}.get(audio_info.subtype, 0)

    minutes, seconds = divmod(audio_info.duration, 60)
    seconds, milliseconds = divmod(seconds, 1)
    milliseconds *= 1000

    speed_in_kbps = audio_info.samplerate * bit_depth / 1000

    info_table = f"""
    - **File Name:** {os.path.basename(audio_file)}
    - **Duration:** {int(minutes)} minutes, {int(seconds)} seconds, {int(milliseconds)} milliseconds
    - **Bitrate:** {speed_in_kbps} kbp/s
    - **Audio Channels:** {audio_info.channels}
    - **Sampling rate:** {audio_info.samplerate} Hz
    - **Bit per second:** {audio_info.samplerate * audio_info.channels * bit_depth} bit/s
    """

    return info_table, "spectrogram.png"


def analyzer():
    with gr.Column():
        gr.Markdown(
            "Tool inspired in the original [Ilaria-Audio-Analyzer](https://github.com/TheStingerX/Ilaria-Audio-Analyzer) code."
        )
        audio_input = gr.Audio(type="filepath")
        get_info_button = gr.Button(
            value=i18n("Get information about the audio"), variant="primary"
        )
    with gr.Column():
        with gr.Row():
            with gr.Column():
                gr.Markdown(
                    value=i18n("Information about the audio file"),
                    visible=True,
                )
                output_markdown = gr.Markdown(
                    value=i18n("Waiting for information..."), visible=True
                )
            image_output = gr.Image(type="filepath", interactive=False)

    get_info_button.click(
        fn=get_audio_info,
        inputs=[audio_input],
        outputs=[output_markdown, image_output],
    )