from pyAudioAnalysis import (audioBasicIO as aIO, audioSegmentation as aS) from pydub import AudioSegment, silence, effects from pydub.silence import split_on_silence from scipy.io import wavfile from pesq import pesq from os import listdir from tqdm import tqdm from scipy.io.wavfile import read, write from IPython.display import Audio import os, random, time, subprocess, pickle, wave, librosa import matplotlib.pyplot as plt import numpy as np import pandas as pd def detect_silence(file_path, time=0.09): command = ['ffmpeg', '-i', file_path, '-af', f'silencedetect=n=-30dB:d={time}', '-f', 'null', '-'] out = subprocess.run(command, capture_output=True, text=True) s = out.stderr if out.stderr else out.stdout k = s.split('[silencedetect @') if len(k)==1: return None start,end=[],[] for i in range(1,len(k)): x=k[i].split(']')[1] if i%2==0: x=x.split('|')[0] x=x.split(':')[1].strip() end.append(float(x)) else: x=x.split(':')[1] x=x.split('size')[0] x=x.replace('\r','') x=x.replace('\n','').strip() start.append(float(x)) return list(zip(start,end)) def remove_silence(file_path, sil, out_path, keep_sil=0.09): ''' This function removes silence from the audio. Input: file_path = Input audio file path sil = List of silence time slots that needs to be removed keep_sil = Time to keep as allowed silence after removing silence out_path = Output path of audio file returns: Non - silent patches and save the new audio in out path ''' rate,aud = read(file_path) a = float(keep_sil)/2 sil_updated = [(i[0]+a,i[1]-a) for i in sil] # convert the silence patch to non-sil patches non_sil = [] tmp = 0 ed = len(aud)/rate for i in range(len(sil_updated)): non_sil.append((tmp,sil_updated[i][0])) tmp=sil_updated[i][1] if sil_updated[-1][1]+a/2