Ejemplo n.º 1
0
def remove_silence(audio_path, out_directory):
    """
    Segments audio removing all segments of silence

    :return: A list of lists of times in seconds. Each pair of times indicate start and end time of segments with
    noise
    """
    [fs, x] = aIO.readAudioFile(audio_path)

    segments = aS.silenceRemoval(x,
                                 fs,
                                 0.05,
                                 0.02,
                                 smoothWindow=1.0,
                                 weight=0.3,
                                 plot=False)

    dub_audio = AudioSegment.from_wav(audio_path)

    counter = 1
    for segment in segments:
        t1 = segment[0] * 1000
        t2 = segment[1] * 1000
        audio_segment = dub_audio[t1:t2]
        format_name = "{}/{}audio_segment.wav".format(out_directory, counter)
        audio_segment.export(format_name, format="wav")
        counter += 1
    return segments
Ejemplo n.º 2
0
def silenceRemovalWrapper(inputFile, smoothingWindow, weight):
    if not os.path.isfile(inputFile):
        raise Exception("Input audio file not found!")

    [fs, x] = audioBasicIO.readAudioFile(inputFile)
    segmentLimits = aS.silenceRemoval(x, fs, 0.05, 0.05,
                                      smoothingWindow, weight, True)
    for i, s in enumerate(segmentLimits):
        strOut = "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0], s[1])
        wavfile.write(strOut, fs, x[int(fs * s[0]):int(fs * s[1])])
Ejemplo n.º 3
0
def silenceRemovalWrapper(inputFile, smoothingWindow, weight):
    if not os.path.isfile(inputFile):
        raise Exception("Input audio file not found!")

    [fs, x] = audioBasicIO.readAudioFile(inputFile)
    segmentLimits = aS.silenceRemoval(x, fs, 0.05, 0.05,
                                      smoothingWindow, weight, True)
    for i, s in enumerate(segmentLimits):
        strOut = "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0], s[1])
        wavfile.write(strOut, fs, x[int(fs * s[0]):int(fs * s[1])])
Ejemplo n.º 4
0
def remove_silence(filename, out_dir, smoothing=1.0, weight=0.3, plot=False):
    """
    A function that implements pyAudioAnalysis' silence extraction module
    and creates wav files of the participant specific portions of audio. The
    smoothing and weight parameters were tuned for the AVEC 2016 dataset.

    Parameters
    ----------
    filename : filepath
        path to the input wav file
    out_dir : filepath
        path to the desired directory (where a participant folder will
        be created containing a 'PXXX_no_silence.wav' file)
    smoothing : float
        tunable parameter to compensate for sparseness of recordings
    weight : float
        probability threshold for silence removal used in SVM
    plot : bool
        plots SVM probabilities of silence (used in tuning)

    Returns
    -------
    A folder for each participant containing a single wav file
    (named 'PXXX_no_silence.wav') with the vast majority of silence
    and virtual interviewer speech removed. Feature extraction is
    performed on these segmented wav files.
    """
    partic_id = 'P' + filename.split('/')[-1].split('_')[0]  # PXXX
    if is_segmentable(partic_id):
        # create participant directory for segmented wav files
        participant_dir = os.path.join(out_dir, partic_id)
        if not os.path.exists(participant_dir):
            os.makedirs(participant_dir)

        os.chdir(participant_dir)

        [Fs, x] = aIO.readAudioFile(filename)
        segments = aS.silenceRemoval(x,
                                     Fs,
                                     0.020,
                                     0.020,
                                     smoothWindow=smoothing,
                                     Weight=weight,
                                     plot=plot)

        for s in segments:
            seg_name = "{:s}_{:.2f}-{:.2f}.wav".format(partic_id, s[0], s[1])
            wavfile.write(seg_name, Fs, x[int(Fs * s[0]):int(Fs * s[1])])

        # concatenate segmented wave files within participant directory
        concatenate_segments(participant_dir, partic_id)
Ejemplo n.º 5
0
def event_extraction(classname, path=os.getcwd()):
    os.chdir(path)
    for inputFile in glob.glob("*.wav"):
        if not os.path.isfile(inputFile):
            raise Exception("Input audio file not found!")

        [Fs, x] = audioBasicIO.readAudioFile(inputFile)
        segmentLimits = aS.silenceRemoval(x, Fs, 0.05, 0.05, 1.0, 0.3, False)
        for i, s in enumerate(segmentLimits):
            if not os.path.exists(classname):
                os.makedirs(classname)
            strOut = os.path.join(
                path, classname,
                "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0],
                                                   s[1]))
            wavfile.write(strOut, Fs, x[int(Fs * s[0]):int(Fs * s[1])])
    output_path = path + classname
    return output_path
Ejemplo n.º 6
0
def clean_response_from_user(filename):
    #This method takes in the original question and answer recording and saves just the response
    from pyAudioAnalysis import audioBasicIO as aIO
    from pyAudioAnalysis import audioSegmentation as aS
    import scipy.io.wavfile as wavfile

    #filename="data/practice_run1.wav"
    [Fs, x] = aIO.readAudioFile(filename)
    segments = aS.silenceRemoval(x,
                                 Fs,
                                 0.020,
                                 0.020,
                                 smoothWindow=0.2,
                                 Weight=0.65,
                                 plot=False)
    segments = segments[0]
    strOut = "user_response.wav"
    #("{0:s}_" + str(i) + ".wav").format(filename[0:-4], s[0], s[1])
    wavfile.write(strOut, Fs, x[int(Fs * segments[0]):int(Fs * segments[1])])
Ejemplo n.º 7
0
def segment_audio(inputFile, smoothingWindow, weight):
    print 'entered segment_audio function'
    [Fs, x] = audioBasicIO.readAudioFile(inputFile)
    dir, inputFile = os.path.split(inputFile)

    create_subdirectory(dir, 'noise')
    create_subdirectory(dir, 'activity')

    create_subdirectory(dir, 'clean')

    segmentLimits = aS.silenceRemoval(x, Fs, smoothingWindow / 10.0,
                                      smoothingWindow / 10.0, smoothingWindow,
                                      weight, False)  # get onsets
    prev_end = 0
    activity_files = []
    noise_files = []
    for i, s in enumerate(segmentLimits):
        strOut = os.path.join(
            dir, "noise",
            "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end,
                                               s[0]))
        wavfile.write(strOut, Fs, x[int(Fs * prev_end):int(Fs * s[0])])
        noise_files.append(strOut)

        strOut = os.path.join(
            dir, "activity",
            "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0], s[1]))
        wavfile.write(strOut, Fs, x[int(Fs * s[0]):int(Fs * s[1])])
        activity_files.append(strOut)
        prev_end = s[1]

    strOut = os.path.join(
        dir, "noise",
        "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end,
                                           len(x) / Fs))
    wavfile.write(strOut, Fs, x[int(Fs * prev_end):len(x) / Fs])
    noise_files.append(strOut)

    activity_out = os.path.join(dir, "activity", inputFile)
    noise_out = os.path.join(dir, "noise", inputFile)

    recombine_wavfiles(noise_files, noise_out)
    recombine_wavfiles(activity_files, activity_out)
Ejemplo n.º 8
0
def infer_file(model, fname):
    tone = find_peak(fname)
    [Fs, x] = wavfile.read(fname)
    segments = silenceRemoval(x, Fs, 0.25, 0.05, 0.2, 0.2, True)
    for start, stop in segments:
        print("*" * 80, f"start:{start}, stop:{stop} dur:{stop-start}")
        o, dur = process_audio_file2(fname, start, stop, tone)
        start_time = datetime.datetime.now()
        iname, recognized, probability = infer_image(model, o[0:256])
        stop_time = datetime.datetime.now()
        if True:  #probability[0] > 0.00005:
            print(f'File:{iname}')
            print('Recognized:', '"' + recognized[0] + '"')
            print('Probability:', probability[0])
            print('Duration:{}'.format(stop_time - start_time))
    return
    sample = 4.0
    start = 0.
    tone = find_peak(fname)
    o, dur = process_audio_file(fname, start, sample, tone)
    while start < (dur - sample):
        print(start, dur)
        im = o[0::1].reshape(1, 256)
        im = im * 256.
        img = cv2.resize(im, model.imgSize, interpolation=cv2.INTER_AREA)
        cv2.imwrite(f'dummy{start}.png', img)

        img = cv2.transpose(img)

        batch = Batch(None, [img])
        start_time = datetime.datetime.now()
        (recognized, probability) = model.inferBatch(batch, True)
        stop_time = datetime.datetime.now()
        if probability[0] > 0.00005:
            print('Recognized:', '"' + recognized[0] + '"')
            print('Probability:', probability[0])
            print('Duration:{}'.format(stop_time - start_time))
        start += 1. / 1
        o, dur = process_audio_file(fname, start, sample, tone)
Ejemplo n.º 9
0
class noiseCleaner:
    def __init__(self, smoothingWindow=0.4, weight=0.4, sensitivity=0.4, debug=True,
                 verbose=False, num_threads=mp.cpu_count()):
        self.smoothingWindow = smoothingWindow
        self.weight = weight
        self.sensitivity = sensitivity
        self.debug = debug
        self.verbose = verbose
        self.num_threads = num_threads

    def noise_removal(self, inputFile):
        smoothingWindow = self.smoothingWindow
        weight = self.weight
        sensitivity = self.sensitivity
        debug = self.debug
        verbose = self.verbose

        if verbose:
            print inputFile

        if not os.path.isfile(inputFile):
            raise Exception(inputFile + " not found!")

        [Fs, x] = audioBasicIO.readAudioFile(inputFile)  # read audio signal

        dir, inputFile = os.path.split(inputFile)

        try:
            create_subdirectory(dir, 'noise')
            create_subdirectory(dir, 'activity')

            root, current_sub_dir = os.path.split(dir)
            clean_dir = '_'.join([current_sub_dir, 'clean'])
            create_subdirectory(dir, clean_dir)
        except OSError, e:
            if e.errno != 17:
                raise
                # time.sleep might help here
            pass

        segmentLimits = aS.silenceRemoval(x, Fs, 0.05, 0.05, smoothingWindow, weight, False)  # get onsets
        prev_end = 0
        activity_files = []
        noise_files = []
        for i, s in enumerate(segmentLimits):
            strOut = os.path.join(dir, "noise", "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end, s[0]))
            wavfile.write(strOut, Fs, x[int(Fs * prev_end):int(Fs * s[0])])
            noise_files.append(strOut)

            strOut = os.path.join(dir, "activity", "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0], s[1]))
            wavfile.write(strOut, Fs, x[int(Fs * s[0]):int(Fs * s[1])])
            activity_files.append(strOut)

            prev_end = s[1]

        strOut = os.path.join(dir, "noise", "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end, len(x) / Fs))
        wavfile.write(strOut, Fs, x[int(Fs * prev_end):len(x) / Fs])
        noise_files.append(strOut)

        activity_out = os.path.join(dir, "activity", inputFile)
        noise_out = os.path.join(dir, "noise", inputFile)

        recombine_wavfiles(noise_files, noise_out)
        recombine_wavfiles(activity_files, activity_out)

        # try:
        tfs = sox.Transformer()
        noise_profile_path = '.'.join([noise_out, 'prof'])
        tfs.noiseprof(noise_out, noise_profile_path)
        tfs.build(noise_out, '-n')
        tfs.clear_effects()
        tfs.noisered(noise_profile_path, amount=sensitivity)
        clean_out = os.path.join(dir, clean_dir, inputFile)
        tfs.build(activity_out, clean_out)

        # except:
        #     original_file = os.path.join(dir, inputFile)
        #     sys.stderr.write("Sox error in noise reduction of file: %s.\n" % original_file)
        #     clean_out = os.path.join(dir, clean_dir, inputFile)
        #     shutil.copyfile(original_file, clean_out)

        if not debug:
            shutil.rmtree(os.path.join(dir, "noise"))
            shutil.rmtree(os.path.join(dir, "activity"))

        return clean_out
Ejemplo n.º 10
0
def main(argv):
    if argv[1] == "-shortTerm":
        for i in range(nExp):
            [Fs, x] = audioBasicIO.readAudioFile("snakehit.wav")
            duration = x.shape[0] / float(Fs)
            t1 = time.clock()
            F = audioFeatureExtraction.stFeatureExtraction(
                x, Fs, 0.050 * Fs, 0.050 * Fs)
            t2 = time.clock()
            perTime1 = duration / (t2 - t1)
            print "short-term feature extraction: {0:.1f} x realtime".format(
                perTime1)
    elif argv[1] == "-classifyFile":
        for i in range(nExp):
            [Fs, x] = audioBasicIO.readAudioFile("snakehit.wav")
            duration = x.shape[0] / float(Fs)
            t1 = time.clock()
            aT.fileClassification("snakehit.wav", "svmSM", "svm")
            t2 = time.clock()
            perTime1 = duration / (t2 - t1)
            print "Mid-term feature extraction + classification \t {0:.1f} x realtime".format(
                perTime1)
    elif argv[1] == "-mtClassify":
        for i in range(nExp):
            [Fs, x] = audioBasicIO.readAudioFile("snakehit.wav")
            duration = x.shape[0] / float(Fs)
            t1 = time.clock()
            [flagsInd, classesAll,
             acc] = aS.mtFileClassification("snakehit.wav", "svmSM", "svm",
                                            False, '')
            t2 = time.clock()
            perTime1 = duration / (t2 - t1)
            print "Fix-sized classification - segmentation \t {0:.1f} x realtime".format(
                perTime1)
    elif argv[1] == "-hmmSegmentation":
        for i in range(nExp):
            [Fs, x] = audioBasicIO.readAudioFile("snakehit.wav")
            duration = x.shape[0] / float(Fs)
            t1 = time.clock()
            aS.hmmSegmentation('snakehit.wav', 'hmmRadioSM', False, '')
            t2 = time.clock()
            perTime1 = duration / (t2 - t1)
            print "HMM-based classification - segmentation \t {0:.1f} x realtime".format(
                perTime1)
    elif argv[1] == "-silenceRemoval":
        for i in range(nExp):
            [Fs, x] = audioBasicIO.readAudioFile("snakehit.wav")
            duration = x.shape[0] / float(Fs)
            t1 = time.clock()
            [Fs, x] = audioBasicIO.readAudioFile("snakehit.wav")
            segments = aS.silenceRemoval(x,
                                         Fs,
                                         0.050,
                                         0.050,
                                         smoothWindow=1.0,
                                         Weight=0.3,
                                         plot=False)
            t2 = time.clock()
            perTime1 = duration / (t2 - t1)
            print "Silence removal \t {0:.1f} x realtime".format(perTime1)
    elif argv[1] == "-thumbnailing":
        for i in range(nExp):
            [Fs1, x1] = audioBasicIO.readAudioFile("scottish.wav")
            duration1 = x1.shape[0] / float(Fs1)
            t1 = time.clock()
            [A1, A2, B1, B2,
             Smatrix] = aS.musicThumbnailing(x1, Fs1, 1.0, 1.0,
                                             15.0)  # find thumbnail endpoints
            t2 = time.clock()
            perTime1 = duration1 / (t2 - t1)
            print "Thumbnail \t {0:.1f} x realtime".format(perTime1)
    elif argv[1] == "-diarization-noLDA":
        for i in range(nExp):
            [Fs1, x1] = audioBasicIO.readAudioFile("snakehit.wav")
            duration1 = x1.shape[0] / float(Fs1)
            t1 = time.clock()
            aS.speakerDiarization("snakehit.wav", 4, LDAdim=0, PLOT=False)
            t2 = time.clock()
            perTime1 = duration1 / (t2 - t1)
            print "Diarization \t {0:.1f} x realtime".format(perTime1)
    elif argv[1] == "-diarization-LDA":
        for i in range(nExp):
            [Fs1, x1] = audioBasicIO.readAudioFile("snakehit.wav")
            duration1 = x1.shape[0] / float(Fs1)
            t1 = time.clock()
            aS.speakerDiarization("snakehit.wav", 4, PLOT=False)
            t2 = time.clock()
            perTime1 = duration1 / (t2 - t1)
            print "Diarization \t {0:.1f} x realtime".format(perTime1)
Ejemplo n.º 11
0
from pyAudioAnalysis import audioSegmentation as aS
import re
import soundfile as sf

import subprocess
import os
##python audioAnalysis.py silenceRemoval -i test/amlo_mix.wav --smoothing 0.7 --weight 0.9
# #
direc = "test/"
wav_file = "amlo_mix4.wav"

[Fs, x] = aIO.readAudioFile(direc + wav_file)
segments = aS.silenceRemoval(x,
                             Fs,
                             0.020,
                             0.020,
                             smoothWindow=.7,
                             Weight=.9,
                             plot=True)
newpath = direc + wav_file + "segs"
original = direc + wav_file
f = sf.SoundFile(direc + wav_file)
frames = len(f)
sample_rate = float(f.samplerate)
print(sample_rate)

time = frames / float(sample_rate)
print time

#
#
def main(argv):
	if argv[1] == "-shortTerm":
		for i in range(nExp):
			[Fs, x] = audioBasicIO.readAudioFile("diarizationExample.wav");
			duration = x.shape[0] / float(Fs)
			t1 = time.clock()
			F = audioFeatureExtraction.stFeatureExtraction(x, Fs, 0.050*Fs, 0.050*Fs);
			t2 = time.clock()
			perTime1 =  duration / (t2-t1); print "short-term feature extraction: {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-classifyFile":
		for i in range(nExp):
			[Fs, x] = audioBasicIO.readAudioFile("diarizationExample.wav");
			duration = x.shape[0] / float(Fs)		
			t1 = time.clock()
			aT.fileClassification("diarizationExample.wav", "svmSM","svm")
			t2 = time.clock()
			perTime1 =  duration / (t2-t1); print "Mid-term feature extraction + classification \t {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-mtClassify":
		for i in range(nExp):
			[Fs, x] = audioBasicIO.readAudioFile("diarizationExample.wav");
			duration = x.shape[0] / float(Fs)		
			t1 = time.clock()
			[flagsInd, classesAll, acc] = aS.mtFileClassification("diarizationExample.wav", "svmSM", "svm", False, '')
			t2 = time.clock()
			perTime1 =  duration / (t2-t1); print "Fix-sized classification - segmentation \t {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-hmmSegmentation":
		for i in range(nExp):
			[Fs, x] = audioBasicIO.readAudioFile("diarizationExample.wav");
			duration = x.shape[0] / float(Fs)		
			t1 = time.clock()
			aS.hmmSegmentation('diarizationExample.wav', 'hmmRadioSM', False, '')             
			t2 = time.clock()
			perTime1 =  duration / (t2-t1); print "HMM-based classification - segmentation \t {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-silenceRemoval":
		for i in range(nExp):
			[Fs, x] = audioBasicIO.readAudioFile("diarizationExample.wav");
			duration = x.shape[0] / float(Fs)				
			t1 = time.clock()
			[Fs, x] = audioBasicIO.readAudioFile("diarizationExample.wav");
			segments = aS.silenceRemoval(x, Fs, 0.050, 0.050, smoothWindow = 1.0, Weight = 0.3, plot = False)
			t2 = time.clock()
			perTime1 =  duration / (t2-t1); print "Silence removal \t {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-thumbnailing":
		for i in range(nExp):
			[Fs1, x1] = audioBasicIO.readAudioFile("scottish.wav")
			duration1 = x1.shape[0] / float(Fs1)		
			t1 = time.clock()
			[A1, A2, B1, B2, Smatrix] = aS.musicThumbnailing(x1, Fs1, 1.0, 1.0, 15.0)	# find thumbnail endpoints			
			t2 = time.clock()
			perTime1 =  duration1 / (t2-t1); print "Thumbnail \t {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-diarization-noLDA":
		for i in range(nExp):
			[Fs1, x1] = audioBasicIO.readAudioFile("diarizationExample.wav")
			duration1 = x1.shape[0] / float(Fs1)		
			t1 = time.clock()		
			aS.speakerDiarization("diarizationExample.wav", 4, LDAdim = 0, PLOT = False)
			t2 = time.clock()
			perTime1 =  duration1 / (t2-t1); print "Diarization \t {0:.1f} x realtime".format(perTime1)
	elif argv[1] == "-diarization-LDA":
		for i in range(nExp):
			[Fs1, x1] = audioBasicIO.readAudioFile("diarizationExample.wav")
			duration1 = x1.shape[0] / float(Fs1)		
			t1 = time.clock()		
			aS.speakerDiarization("diarizationExample.wav", 4, PLOT = False)
			t2 = time.clock()
			perTime1 =  duration1 / (t2-t1); print "Diarization \t {0:.1f} x realtime".format(perTime1)
Ejemplo n.º 13
0
from pyAudioAnalysis import audioSilencePeriods as aSP
from pyAudioAnalysis import audioBasicIO as aIO
from pyAudioAnalysis import audioSegmentation as aS

[Fs, x] = aIO.readAudioFile("custom/audio/output.wav")

segments = aSP.silenceCounter(x, Fs, 0.020, 0.020,
	smoothWindow=1.0, weight=0.3, plot=True)

silences = aS.silenceRemoval(x, Fs, 0.020, 0.020,
	smoothWindow=1.0, weight=0.3, plot=True)

print(silences)
Ejemplo n.º 14
0
def extractAudio():

    # Declarations
    global userid, starttime, endtime, myPath, numbPauses, loudness, dur, madmax, maxDBFS, MPA, numOfFtrs, phoneCallFtrFinal, wavo, jsonFeatures, nf
    userid = ""
    starttime = ""
    endtime = ""
    myPath = ""
    numbPauses = 0
    loudness = 0
    nf = 0
    dur = 0
    madmax = 0
    maxDBFS = 0
    MPA = 0
    numOfFtrs = 0
    wavo = ""
    jsonFeatures = {}
    phoneCallFtrFinal = pd.DataFrame()

    # getting the parameters
    if request.method == 'POST':
        userid = request.args.get('userid')
        #userid = request.form['userid']
        print " Android must Have invoked this"

        # Ftp connection
        FtpHostName = "****************"
        FtpUser = "******"
        FtpPassword = "******"
        ftp = FTP(FtpHostName)
        ftp.login(FtpUser, FtpPassword)
        path = "************************"

        ########################################
        ########################################

        # Phone calls processing and features extraction

        #########################################
        #########################################
        #########################################

        # SQL queries
        curWAV, conn = connection()
        reqWAV = "SELECT * FROM files AS f WHERE f.uid = %s and f.type = 'WAV' "
        curWAV.execute(reqWAV, userid)
        WAVfiles = curWAV.fetchall()

        wavs_dict = []
        for wavf in WAVfiles:
            wavf_dict = {
                'Id': wavf[0],
                'filepath': wavf[1],
                'type': wavf[2],
                'createdat': wavf[3],
                'uid': wavf[4]
            }
            wavs_dict.append(wavf_dict)

        #print wavs_dict.__len__()
        print len(WAVfiles)
        ind = 0
        patho = "/home/ahmed/Desktop/flaskTherapio/"
        for wavfile in WAVfiles:
            ind += 1
            print "checking database for the " + str(ind) + " time"
            dirPath = wavfile[1][1:17]
            wavName = wavfile[1][17:]
            wavdate = wavfile[3][1:10]
            #print dirPath
            print wavName
            print wavdate
            ftp.cwd("/" + dirPath)
            print "done changing directory"
            audiofilematch = '*.wav'
            cc = 0
            for filename in ftp.nlst(
                    audiofilematch):  # Loop - looking for WAV files
                cc += 1
                print "checking FTP for the " + str(cc) + " time"
                print "comparing " + wavName + " and     " + filename
                print wavName == filename
                fhandle = open(filename, 'wb')
                print 'Getting ' + filename
                os.chdir("/home/ahmed/Desktop/flaskTherapio/")
                ftp.retrbinary('RETR ' + filename, fhandle.write)
                print "stored"
                fhandle.close()
                if filename == wavName:
                    print " just do this shit here"
                    sound = AudioSegment.from_file(patho + filename)
                    sound.export(patho + "PhoneCallsFtr/" + filename + ".wav",
                                 format="wav")
                    loudness = sound.rms
                    #number of Frames
                    nf = sound.frame_count()
                    # Value of loudness
                    loudness = sound.rms
                    #duration
                    dur = sound.duration_seconds
                    #max
                    madmax = sound.max
                    #max possible amplitude
                    MPA = sound.max_possible_amplitude
                    #max dbfs
                    maxDBFS = sound.max_dBFS
                    samplewidth = sound.sample_width

                    today = datetime.datetime.today().strftime("%m/%d/%Y")
                    blahblah = patho + "PhoneCallsFtr/" + filename + ".wav"
                    print "Blah blah path :   ======>  " + blahblah

                    [Fs, x] = audioBasicIO.readAudioFile(blahblah)
                    #silence removal ---- into segments

                    segments = aS.silenceRemoval(x,
                                                 Fs,
                                                 0.030,
                                                 0.030,
                                                 smoothWindow=0.3,
                                                 Weight=0.6,
                                                 plot=True)
                    numbPauses = len(segments) - 1
                    if numbPauses:
                        error = False
                    else:
                        error = True
                    print "num pauses : " + str(numbPauses)
                    # SELECT * FROM `phoneCallFeatures` WHERE (`created_at` BETWEEN 60 AND 1500) AND (uid = '5795028d168257.04609170')
                    # SQL query to insert phone call features to DB
                    insertFtrReq = """INSERT INTO phoneCallFeatures
                                              (uid,
                                              npause,
                                              loudness,
                                              maxA,
                                              created_at)
                                              VALUES (%s,
                                                      %s,
                                                      %s,
                                                      %s,
                                                      %s)""", (userid,
                                                               numbPauses,
                                                               loudness,
                                                               madmax, wavdate)
                    curInsertFtr, conn = connection()
                    curInsertFtr.execute(*insertFtrReq)
                    conn.commit()

                    # short term features extraction
                    fw = audioFeatureExtraction.stFeatureExtraction(
                        x, Fs, 0.1 * Fs, 0.1 * Fs)
                    print fw
                    # Mid term feature extraction
                    #F1 = audioFeatureExtraction.mtFeatureExtraction(x, Fs, 0.050*Fs, 0.050*Fs,0.050*Fs, 0.050*Fs)
                    mypath = "/home/ahmed/Desktop/flaskTherapio/PhoneCallsFtr/"
                    if not os.path.isdir(mypath):
                        os.makedirs(mypath)
                    numpy.savetxt(mypath + wavName + "_AllStFtrs.csv",
                                  fw,
                                  delimiter=",")
                    #numpy.savetxt("00_AllMidFtrs.csv", F1, delimiter=",")
                    # read features in a data frame
                    phoneCallFtrPrime = pd.read_csv(mypath + wavName +
                                                    "_AllStFtrs.csv")
                    COLUMNS = []
                    for i in range(0, len(phoneCallFtrPrime.columns)):
                        COLUMNS.append('Frame' + str(i + 1))
                        COLUMNS.append('label')
                    phoneCallFtrFinal = pd.read_csv(mypath + wavName +
                                                    "_AllStFtrs.csv",
                                                    header=None,
                                                    names=COLUMNS)

                    numOfFtrs = len(phoneCallFtrFinal["label"])
                    phoneCallFtrFinal.label = phoneCallFtrFinal.label.astype(
                        float).fillna(0)
                    # phoneCallFtrFinal.label = phoneCallFtrFinal.label.astype(int).fillna(0)
                    for j in range(0, numOfFtrs):
                        phoneCallFtrFinal.iloc[j]['label'] = 0

                    #jsonFeatures = phoneCallFtrFinal.reset_index().to_json(orient='index')
                    #jsonFeatures = phoneCallFtrFinal.to_json(orient=None)
                    display(phoneCallFtrFinal.head())
                    #print "JSON Features of every audio ----------------------------------------------"
                    #print jsonFeatures

    print "this script has been called and data has been handled"
    return jsonify({'USER ID': userid}), 201
class noiseCleaner:
    def __init__(self,
                 smoothingWindow=0.4,
                 weight=0.4,
                 sensitivity=0.4,
                 debug=True,
                 verbose=False,
                 num_threads=mp.cpu_count()):
        self.smoothingWindow = smoothingWindow
        self.weight = weight
        self.sensitivity = sensitivity
        self.debug = debug
        self.verbose = verbose
        self.num_threads = num_threads

    #This function performs noise removal for a single file
    #in some cases the process will fail, either because the file is too short or because activity is constant and therfore a noise profile cannot be generated
    #in this case the function will simply make a copy of the original file into the "clean" folder to feed to the classifier
    def noise_removal(self, inputFile):
        smoothingWindow = self.smoothingWindow
        weight = self.weight
        sensitivity = self.sensitivity
        debug = self.debug
        verbose = self.verbose

        if verbose:
            print inputFile

        if not os.path.isfile(inputFile):
            raise Exception(inputFile + " not found!")

        [Fs, x] = audioBasicIO.readAudioFile(inputFile)  # read audio signal

        dir, inputFile = os.path.split(inputFile)

        try:
            create_subdirectory(dir, 'noise')
            create_subdirectory(dir, 'activity')

            root, current_sub_dir = os.path.split(dir)
            clean_dir = '_'.join([current_sub_dir, 'clean'])
            create_subdirectory(dir, clean_dir)
        except OSError, e:
            if e.errno != 17:
                raise
                # time.sleep might help here
            pass

        try:

            segmentLimits = aS.silenceRemoval(x, Fs, smoothingWindow / 10.0,
                                              smoothingWindow / 10.0,
                                              smoothingWindow, weight,
                                              False)  # get onsets
            prev_end = 0
            activity_files = []
            noise_files = []
            for i, s in enumerate(segmentLimits):
                strOut = os.path.join(
                    dir, "noise",
                    "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4],
                                                       prev_end, s[0]))
                wavfile.write(strOut, Fs, x[int(Fs * prev_end):int(Fs * s[0])])
                noise_files.append(strOut)

                strOut = os.path.join(
                    dir, "activity",
                    "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0],
                                                       s[1]))
                wavfile.write(strOut, Fs, x[int(Fs * s[0]):int(Fs * s[1])])
                activity_files.append(strOut)

                prev_end = s[1]

            strOut = os.path.join(
                dir, "noise",
                "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end,
                                                   len(x) / Fs))
            wavfile.write(strOut, Fs, x[int(Fs * prev_end):len(x) / Fs])
            noise_files.append(strOut)

            activity_out = os.path.join(dir, "activity", inputFile)
            noise_out = os.path.join(dir, "noise", inputFile)

            recombine_wavfiles(noise_files, noise_out)
            recombine_wavfiles(activity_files, activity_out)

            tfs = sox.Transformer()
            noise_profile_path = '.'.join([noise_out, 'prof'])
            tfs.noiseprof(noise_out, noise_profile_path)
            tfs.build(noise_out, '-n')
            tfs.clear_effects()
            tfs.noisered(noise_profile_path, amount=sensitivity)
            clean_out = os.path.join(dir, clean_dir, inputFile)
            tfs.build(activity_out, clean_out)

        except:
            original_file = os.path.join(dir, inputFile)
            sys.stderr.write("Sox error in noise reduction of file: %s.\n" %
                             original_file)
            clean_out = os.path.join(dir, clean_dir, inputFile)
            shutil.copyfile(original_file, clean_out)
            with open(os.path.join(dir, clean_dir, 'NR_fail_record.log'),
                      'a') as fail_record:
                fail_record.write('%s\n' % original_file)

        if not debug:
            shutil.rmtree(os.path.join(dir, "noise"))
            shutil.rmtree(os.path.join(dir, "activity"))

        return clean_out

    #Performs noise_removal for an entire directory recursively, meaning that all wav files in all subdirectories will be processed


#    def noise_removal_dir(self, rootdir):
#
#        num_threads = self.num_threads
#
#        if not os.path.exists(rootdir):
#            raise Exception(rootdir + " not found!")
#
#        for root, dirs, files in os.walk(rootdir):
#            parent, folder_name = os.path.split(root)
#            if folder_name == 'activity' or folder_name == 'noise' or '_clean' in folder_name:
#                shutil.rmtree(root)
#        num_samples_processed = 0
#        wav_files = []
#        for root, dirs, files in os.walk(rootdir):
#            for file in files:
#                if file.endswith('.wav') or file.endswith('.WAV'):
#                    wav_files.append(os.path.join(root, file))
#                    num_samples_processed += 1
#                    if not num_threads:
#                        self.noise_removal(os.path.join(root,file))
#
#        print "Now beginning preprocessing for: ", num_samples_processed, " samples."
#
#        try:
#            if num_threads:
#                pros = Pool(num_threads)
#                pros.map(self.noise_removal, wav_files)
#        except cPickle.PicklingError:
#            for wfile in wav_files:
#                self.noise_removal(wfile)
#
#        print "Preprocessing complete!\n"
Ejemplo n.º 16
0
from pyAudioAnalysis import audioBasicIO as aIO
from pyAudioAnalysis import audioSegmentation as aS
[Fs, x] = aIO.readAudioFile("keys.wav")
segments = aS.silenceRemoval(x,
                             Fs,
                             0.010,
                             0.020,
                             smoothWindow=0.02,
                             Weight=0.3,
                             plot=True)
Ejemplo n.º 17
0
import os

from pyAudioAnalysis import audioBasicIO as aIO
from pyAudioAnalysis import audioSegmentation as aS

dir_path = os.path.dirname(os.path.realpath(__file__))

file_path = os.path.join(dir_path, "doremi.wav")
print "Test silence removal on %s..." % file_path
[Fs, x] = aIO.readAudioFile(file_path)
segments = aS.silenceRemoval(x,
                             Fs,
                             0.020,
                             0.020,
                             smoothWindow=1.0,
                             Weight=0.3,
                             plot=False)

print "Successfully ran silence removal!"
print segments
Ejemplo n.º 18
0
def dashboard(userid):

    # Declarations
    global starttime, endtime, myPath, numbPauses, loudness, dur, madmax, maxDBFS, MPA, numOfFtrs, phoneCallFtrFinal, wavo, jsonFeatures, nf
    starttime = ""
    endtime = ""
    myPath = ""
    numbPauses = 0
    loudness = 0
    nf = 0
    dur = 0
    madmax = 0
    maxDBFS = 0
    MPA = 0
    numOfFtrs = 0
    wavo = ""
    jsonFeatures = {}
    phoneCallFtrFinal = pd.DataFrame()

    # Ftp connection
    FtpHostName = "**********************"
    FtpUser = "******"
    FtpPassword = "******"
    ftp = FTP(FtpHostName)
    ftp.login(FtpUser, FtpPassword)
    path = "****************************"

    # forms
    form = DateForm()
    if form.validate_on_submit():
        starttime = form.dt.data.strftime('%x')
        #endtime = form.dt.data.strftime('%x')

        ########################################
        ########################################

        # Accelerometer CSV data manipulation and features extraction

        #########################################
        #########################################
        #########################################

    # SQL queries
    curCSV, conn = connection()
    reqCSV = "SELECT * FROM files AS f WHERE f.uid = %s and f.type = 'CSV' "
    curCSV.execute(reqCSV, userid)
    CSVfiles = curCSV.fetchall()

    def magnitude(activity):
        x2 = activity['xAxis'] * activity['xAxis']
        y2 = activity['yAxis'] * activity['yAxis']
        z2 = activity['zAxis'] * activity['zAxis']
        m2 = x2 + y2 + z2
        m = m2.apply(lambda x: math.sqrt(x))
        return m

    def windows(df, size=100):
        start = 0
        while start < df.count():
            yield start, start + size
            start += (size / 2)

    def jitter(axis, start, end):
        j = float(0)
        for i in xrange(start, min(end, axis.count())):
            if start != 0:
                j += abs(axis[i] - axis[i - 1])
        return j / (end - start)

    def mean_crossing_rate(axis, start, end):
        cr = 0
        m = axis.mean()
        for i in xrange(start, min(end, axis.count())):
            if start != 0:
                p = axis[i - 1] > m
                c = axis[i] > m
                if p != c:
                    cr += 1
        return float(cr) / (end - start - 1)

    def window_summary(axis, start, end):
        acf = stattools.acf(axis[start:end])
        acv = stattools.acovf(axis[start:end])
        sqd_error = (axis[start:end] - axis[start:end].mean())**2
        return [
            jitter(axis, start, end),
            mean_crossing_rate(axis, start, end),
            axis[start:end].mean(),
            axis[start:end].std(),
            axis[start:end].var(),
            axis[start:end].min(),
            axis[start:end].max(),
            acf.mean(),  # mean auto correlation
            acf.std(),  # standard deviation auto correlation
            acv.mean(),  # mean auto covariance
            acv.std(),  # standard deviation auto covariance
            skew(axis[start:end]),
            kurtosis(axis[start:end]),
            math.sqrt(sqd_error.mean())
        ]

    def features(activity):
        for (start, end) in windows(activity['timestamp']):
            features = []
            for axis in ['xAxis', 'yAxis', 'zAxis', 'magnitude']:
                features += window_summary(activity[axis], start, end)
            yield features

    COLUMNS = ['timestamp', 'xAxis', 'yAxis', 'zAxis']
    features_dict = []
    for csvfile in CSVfiles:
        Activity = pd.read_csv(path + csvfile[1], header=None,
                               names=COLUMNS)[:3000]
        Activity['magnitude'] = magnitude(Activity)

        with open(
                '/home/ahmed/Desktop/flaskTherapio/AccFtr/' + csvfile[1][17:] +
                '_Features.csv', 'w') as out:
            rows = csv.writer(out)
            for f in features(Activity):
                rows.writerow(f)

        ActivityDataFeature = pd.read_csv(
            '/home/ahmed/Desktop/flaskTherapio/AccFtr/' + csvfile[1][17:] +
            '_Features.csv',
            header=None)

    # return ActivityDataFeature.reset_index().to_json(orient='index')
    # CSVDATA = json.dumps(csv_files_dict)

    ########################################
    ########################################

    # Phone calls processing and features extraction

    #########################################
    #########################################
    #########################################

    curWAV, conn = connection()
    reqWAV = "SELECT * FROM files AS f WHERE f.uid = %s and f.type = 'WAV' "
    curWAV.execute(reqWAV, userid)
    WAVfiles = curWAV.fetchall()

    wavs_dict = []
    for wavf in WAVfiles:
        wavf_dict = {
            'Id': wavf[0],
            'filepath': wavf[1],
            'type': wavf[2],
            'createdat': wavf[3],
            'uid': wavf[4]
        }
        wavs_dict.append(wavf_dict)

    #print wavs_dict.__len__()
    print len(WAVfiles)
    ind = 0
    patho = "/home/ahmed/Desktop/flaskTherapio/"
    for wavfile in WAVfiles:
        ind += 1
        print "checking database for the " + str(ind) + " time"
        dirPath = wavfile[1][1:17]
        wavName = wavfile[1][17:]
        wavdate = wavfile[3][1:10]
        #print dirPath
        print wavName
        print wavdate
        ftp.cwd("/" + dirPath)
        print "done changing directory"
        audiofilematch = '*.wav'
        cc = 0
        error = False
        for filename in ftp.nlst(
                audiofilematch):  # Loop - looking for WAV files
            if error == False:

                cc += 1
                print "checking FTP for the " + str(cc) + " time"
                print "comparing " + wavName + " and     " + filename
                print wavName == filename
                fhandle = open(filename, 'wb')
                print 'Getting ' + filename
                os.chdir("/home/ahmed/Desktop/flaskTherapio/")
                ftp.retrbinary('RETR ' + filename, fhandle.write)
                print "stored"
                fhandle.close()
                if filename == wavName:
                    print " just do this shit here"
                    sound = AudioSegment.from_file(patho + filename)
                    sound.export(patho + "PhoneCallsFtr/" + filename + ".wav",
                                 format="wav")
                    loudness = sound.rms
                    #number of Frames
                    nf = sound.frame_count()
                    # Value of loudness
                    loudness = sound.rms
                    #duration
                    dur = sound.duration_seconds
                    #max
                    madmax = sound.max
                    #max possible amplitude
                    MPA = sound.max_possible_amplitude
                    #max dbfs
                    maxDBFS = sound.max_dBFS
                    samplewidth = sound.sample_width

                    today = datetime.datetime.today().strftime("%m/%d/%Y")
                    blahblah = patho + "PhoneCallsFtr/" + filename + ".wav"
                    print "Blah blah path :   ======>  " + blahblah

                    [Fs, x] = audioBasicIO.readAudioFile(blahblah)
                    #silence removal ---- into segments

                    segments = aS.silenceRemoval(x,
                                                 Fs,
                                                 0.030,
                                                 0.030,
                                                 smoothWindow=0.3,
                                                 Weight=0.6,
                                                 plot=True)
                    numbPauses = len(segments) - 1
                    if numbPauses:
                        error = False
                    else:
                        error = True
                    print "num pauses : " + str(numbPauses)
                    # SELECT * FROM `phoneCallFeatures` WHERE (`created_at` BETWEEN 60 AND 1500) AND (uid = '5795028d168257.04609170')
                    # SQL query to insert phone call features to DB
                    insertFtrReq = """INSERT INTO phoneCallFeatures
                                              (uid,
                                              npause,
                                              loudness,
                                              maxA,
                                              created_at)
                                              VALUES (%s,
                                                      %s,
                                                      %s,
                                                      %s,
                                                      %s)""", (userid,
                                                               numbPauses,
                                                               loudness,
                                                               madmax, wavdate)
                    curInsertFtr, conn = connection()
                    curInsertFtr.execute(*insertFtrReq)
                    conn.commit()

                    # short term features extraction
                    fw = audioFeatureExtraction.stFeatureExtraction(
                        x, Fs, 0.1 * Fs, 0.1 * Fs)
                    print fw
                    # Mid term feature extraction
                    #F1 = audioFeatureExtraction.mtFeatureExtraction(x, Fs, 0.050*Fs, 0.050*Fs,0.050*Fs, 0.050*Fs)
                    mypath = "/home/ahmed/Desktop/flaskTherapio/PhoneCallsFtr/"
                    if not os.path.isdir(mypath):
                        os.makedirs(mypath)
                    numpy.savetxt(mypath + wavName + "_AllStFtrs.csv",
                                  fw,
                                  delimiter=",")
                    #numpy.savetxt("00_AllMidFtrs.csv", F1, delimiter=",")
                    # read features in a data frame
                    phoneCallFtrPrime = pd.read_csv(mypath + wavName +
                                                    "_AllStFtrs.csv")
                    COLUMNS = []
                    for i in range(0, len(phoneCallFtrPrime.columns)):
                        COLUMNS.append('Frame' + str(i + 1))
                        COLUMNS.append('label')
                    phoneCallFtrFinal = pd.read_csv(mypath + wavName +
                                                    "_AllStFtrs.csv",
                                                    header=None,
                                                    names=COLUMNS)

                    numOfFtrs = len(phoneCallFtrFinal["label"])
                    phoneCallFtrFinal.label = phoneCallFtrFinal.label.astype(
                        float).fillna(0)
                    # phoneCallFtrFinal.label = phoneCallFtrFinal.label.astype(int).fillna(0)
                    for j in range(0, numOfFtrs):
                        phoneCallFtrFinal.iloc[j]['label'] = 0

                #jsonFeatures = phoneCallFtrFinal.reset_index().to_json(orient='index')
                #jsonFeatures = phoneCallFtrFinal.to_json(orient=None)
                    display(phoneCallFtrFinal.head())
                #print "JSON Features of every audio ----------------------------------------------"
                #print jsonFeatures
            else:
                print " Moving to the next file"

    curPhone, conn = connection()
    reqPhoneCallFtr = """SELECT * FROM phoneCallFeatures WHERE
                          created_at BETWEEN  %s AND %s
                          AND uid = %s""", (starttime, today, userid)

    curPhone.execute(*reqPhoneCallFtr)
    calls = curPhone.fetchall()

    calls_dict = []
    for call in calls:
        call_dict = {
            'Id': call[0],
            'IdUniq': call[1],
            'npause': call[2],
            'loudness': call[3],
            'maxA': call[4],
            'createdat': call[5],
        }
        calls_dict.append(call_dict)
    #callJsonData = json.dumps(calls_dict)
    #LoadJsonData = json.loads(callJsonData)
    #print "JSON calls data ----------------------------------------------"
    #print LoadJsonData
    #print LoadJsonData['loudness']

    return render_template('dashboard.html',
                           userid=userid,
                           loudness=loudness,
                           nf=nf,
                           dur=dur,
                           maxDBFS=maxDBFS,
                           madmax=madmax,
                           MPA=MPA,
                           jsonFeatures=jsonFeatures,
                           starttime=starttime,
                           form=form)
Ejemplo n.º 19
0
def silence_remove(x, option, pic, limit, **params):
    '''
    :param x: 输入信号
    :param limit: 门限
    :param option: 选择使用希尔伯特方法还是低通滤波方法
    :param pic: bool选择是否画图并保存
    :param params: 用于低通滤波器的参数
    :return:
    '''
    if option is 'hilbert':
        analytic_signal = signal.hilbert(x)
        z = np.abs(analytic_signal)
        if pic:
            plt.figure()
            ax1 = plt.subplot(311)
            ax1.plot(x, 'r')
            ax1.set_title('original signal')
            ax1.set_xlabel('Time')
            ax1.set_ylabel('value')
            ax2 = plt.subplot(312)
            ax2.plot(z, 'b')
            ax2.set_title('envelope')
            ax2.set_xlabel('Time')
            ax2.set_ylabel('value')
            ax3 = plt.subplot(313)
            ax3.plot(x[z > limit], 'g')
            ax3.set_title('silence_remove_hilbert')
            ax3.set_xlabel('Time')
            ax3.set_ylabel('value')
            plt.tight_layout()
            plt.savefig(str(pic) + '.jpg')
            plt.clf()
            plt.close()
        return x[z > limit]
    elif option is 'HF':
        z = hilbert_filter(x=x, **params)
        if pic:
            plt.figure()
            ax1 = plt.subplot(311)
            ax1.plot(x, 'r')
            ax1.set_title('original signal')
            ax1.set_xlabel('Time')
            ax1.set_ylabel('value')
            ax2 = plt.subplot(312)
            ax2.plot(z, 'b')
            ax2.set_title('envelope')
            ax2.set_xlabel('Time')
            ax2.set_ylabel('value')
            ax3 = plt.subplot(313)
            ax3.plot(x[z > limit], 'g')
            ax3.set_title('silence_remove_hilbert_filter')
            ax3.set_xlabel('Time')
            ax3.set_ylabel('value')
            plt.tight_layout()
            plt.savefig(str(pic) + '.jpg')
            plt.clf()
            plt.close()
        return x[z > limit]
    elif option is 'SVM':
        domain = seg.silenceRemoval(x, **params)
        y = x[::]
        a = 0
        c = len(x)
        for i in domain[::-1]:
            a = i[0] * params['fs']
            b = i[1] * params['fs']
            y = np.delete(y, np.arange(b, c, 1))
            c = a
        y = np.delete(y, np.arange(0, a, 1))
        if pic:
            plt.figure()
            ax1 = plt.subplot(211)
            ax1.plot(x, 'r')
            ax1.set_title('original signal')
            ax1.set_xlabel('Time')
            ax1.set_ylabel('value')
            ax2 = plt.subplot(212)
            ax2.plot(y, 'b')
            ax2.set_title('silence_remove_SVM')
            ax2.set_xlabel('Time')
            ax2.set_ylabel('value')
            plt.tight_layout()
            plt.savefig(str(pic) + '.jpg')
            # plt.show()
            plt.clf()
            plt.close()
        return y
    else:
        z = lp_filter(x, **params)
        if pic:
            plt.figure()
            ax1 = plt.subplot(311)
            ax1.plot(x, 'r')
            ax1.set_title('original signal')
            ax1.set_xlabel('Time')
            ax1.set_ylabel('value')
            ax2 = plt.subplot(312)
            ax2.plot(z, 'b')
            ax2.set_title('output of filter')
            ax2.set_xlabel('Time')
            ax2.set_ylabel('value')
            ax3 = plt.subplot(313)
            ax3.plot(x[z > limit], 'g')
            ax3.set_title('silence_remove_filter')
            ax3.set_xlabel('Time')
            ax3.set_ylabel('value')
            plt.tight_layout()
            # plt.savefig(str(pic) + '.jpg')
            plt.show()
            # plt.clf()
            # plt.close()
        return x[np.abs(z) > limit]
Ejemplo n.º 20
0
class noiseCleaner:
    def __init__(self, smoothingWindow=0.4, weight=0.4, sensitivity=0.4, debug=False,
                 verbose=False, num_threads=0):
        self.smoothingWindow = smoothingWindow
        self.weight = weight
        self.sensitivity = sensitivity
        self.debug = debug
        self.verbose = verbose
        self.num_threads = num_threads
    #This function performs noise removal for a single file
    #in some cases the process will fail, either because the file is too short or because activity is constant and therfore a noise profile cannot be generated
    #in this case the function will simply make a copy of the original file into the "clean" folder to feed to the classifier
    def noise_removal(self, inputFile):
        smoothingWindow = self.smoothingWindow
        weight = self.weight
        sensitivity = self.sensitivity
        debug = self.debug
        verbose = self.verbose
          
       
        if verbose:
            print inputFile

        if not os.path.isfile(inputFile):
            raise Exception(inputFile + " not found!")

        [Fs, x] = audioBasicIO.readAudioFile(inputFile)  # read audio signal

        dir, inputFile = os.path.split(inputFile)

        try:
            create_subdirectory(dir, 'noise')
            create_subdirectory(dir, 'activity')

            root, current_sub_dir = os.path.split(dir)
            clean_dir = '_'.join([current_sub_dir, 'clean'])
            create_subdirectory(dir, clean_dir)
        except OSError, e:
            if e.errno != 17:
                raise
                # time.sleep might help here
            pass

        try:
            segmentLimits = aS.silenceRemoval(x, Fs, smoothingWindow / 10.0, smoothingWindow / 10.0, smoothingWindow,
                                              weight, False)  # get onsets
            prev_end = 0
            activity_files = []
            noise_files = []
            for i, s in enumerate(segmentLimits):
                strOut = os.path.join(dir, "noise", "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end, s[0]))
                wavfile.write(strOut, Fs, x[int(Fs * prev_end):int(Fs * s[0])])
                noise_files.append(strOut)

                strOut = os.path.join(dir, "activity", "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], s[0], s[1]))
                wavfile.write(strOut, Fs, x[int(Fs * s[0]):int(Fs * s[1])])
                activity_files.append(strOut)

                prev_end = s[1]

            strOut = os.path.join(dir, "noise",
                                  "{0:s}_{1:.3f}-{2:.3f}.wav".format(inputFile[0:-4], prev_end, len(x) / Fs))
            wavfile.write(strOut, Fs, x[int(Fs * prev_end):len(x) / Fs])
            noise_files.append(strOut)

            activity_out = os.path.join(dir, "activity", inputFile)
            noise_out = os.path.join(dir, "noise", inputFile)

            recombine_wavfiles(noise_files, noise_out)
            recombine_wavfiles(activity_files, activity_out)

	   
            tfs = sox.Transformer()
            noise_profile_path = '.'.join([noise_out, 'prof'])
            tfs.noiseprof(noise_out, noise_profile_path)
            tfs.build(noise_out, '-n')
            tfs.clear_effects()
            tfs.noisered(noise_profile_path, amount=sensitivity)
            clean_out = os.path.join(dir, clean_dir, inputFile)
            tfs.build(activity_out, clean_out)
	   	    


        except:
            original_file = os.path.join(dir, inputFile)
            sys.stderr.write("Sox error in noise reduction of file: %s.\n" % original_file)
            clean_out = os.path.join(dir, clean_dir, inputFile)
            shutil.copyfile(original_file, clean_out)
            with open(os.path.join(dir, clean_dir, 'NR_fail_record.log'), 'a') as fail_record:
                fail_record.write('%s\n' % original_file)

        if not debug:
            shutil.rmtree(os.path.join(dir, "noise"))
            shutil.rmtree(os.path.join(dir, "activity"))

        return clean_out