Spaces:
Runtime error
Runtime error
import gradio as gr | |
import matplotlib.pyplot as plt | |
import subprocess | |
import re | |
import logging | |
import os | |
import numpy as np | |
import matplotlib | |
import scipy.io | |
import scipy.io.wavfile | |
from pathlib import Path | |
matplotlib.use('Agg') | |
logging.basicConfig(level=logging.INFO) | |
logging.getLogger() | |
def convert_to_wav(filename): | |
os.rename(filename, filename.replace(" ", "_")) | |
filename = filename.replace(" ", "_") | |
new_name = f"{os.path.splitext(filename)[0]}_converted.wav".replace(" ", "_") | |
command = f"ffmpeg -i {filename} -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 {new_name} -y" | |
subprocess.run(command.split()) | |
return new_name | |
def get_chunk_times(in_filename, silence_threshold, silence_duration=1): | |
silence_duration_re = re.compile('silence_duration: (\d+.\d+)') | |
silence_end_re = re.compile('silence_end: (\d+.\d+)\s') | |
command = f"ffmpeg -i {in_filename} -af silencedetect=n=-{silence_threshold}dB:d={silence_duration} -f null - " | |
out = subprocess.run(command.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) | |
stdout = out.stdout | |
lines = stdout.splitlines() | |
ts = 0 | |
chunks = [] | |
for line in lines: | |
match = silence_duration_re.search(str(line)) | |
if(match): | |
chunk_time = float(match.group(1)) | |
ts = ts + chunk_time | |
end = silence_end_re.search(str(line)) | |
if(end): | |
t_end = float(end.group(1)) | |
t_start = t_end - chunk_time | |
chunks.append([t_start, t_end, chunks]) | |
logging.info(f"TS audio {os.path.basename(in_filename)} = {ts}") | |
return ts, chunks | |
def get_audio_plot(filename, chunks): | |
fig, ax = plt.subplots() | |
fig.set_size_inches(18.5, 10.5) | |
sampleRate, audioBuffer = scipy.io.wavfile.read(filename) | |
duration = len(audioBuffer)/sampleRate | |
time = np.arange(0,duration,1/sampleRate) | |
ax.plot(time,audioBuffer) | |
y1 = min(audioBuffer) | |
y2 = max(audioBuffer) | |
for c in chunks: | |
ax.fill_between(c[0:2], y1, y2, | |
color='gray', alpha=0.5) | |
plt.xlabel('Time [s]') | |
plt.ylabel('Amplitude') | |
plt.title("Audio with silence marks") | |
return plt.gcf() | |
def get_audio_info(audio, treshold): | |
new_audio = convert_to_wav(audio) | |
ts, chunks = get_chunk_times(new_audio, treshold, 1) | |
p = get_audio_plot(new_audio, chunks) | |
return str(ts), p | |
otext = gr.outputs.Textbox(type="auto", label="Silence time:") | |
oplot = gr.outputs.Image(type="plot", label="Audio with silence in gray areas") | |
iaudio = gr.inputs.Audio(source="upload", type="filepath", label=None) | |
isensitivity = gr.inputs.Slider(minimum=0, maximum=50, step=1, default=25, label="Silence sensitivity") | |
iface = gr.Interface( | |
get_audio_info, | |
[iaudio, isensitivity], | |
[otext, oplot], | |
description="Enter audio to view silence areas", | |
) | |
iface.launch() |