|
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], |
|
) |
|
|