Spaces:
Running
Running
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], | |
) | |