示例#1
0
def extractor_audio(buffer, fs):
    '''
    :param buffer: string list del audio a vectorizar
    :return: una fila del vector
    '''

    s = AudioFile.open_frombuffer(buffer)
    sf = s.frames(fs)
    num_ventanas = len(sf)
    lenv = np.round(s.sampleRate * VENTANA)
    vector = np.zeros([num_ventanas, NUM_PARAMETROS], dtype=np.float32)

    for indf, frame in enumerate(sf):
        Espectro = frame.spectrum()
        acumulado = 0
        for param in zip(PARAMETROS, TIPO_PARAMETROS):
            if not param[1]:
                vector[indf, acumulado] = getattr(Energy,
                                                  param[0])(frame,
                                                            windowSize=lenv,
                                                            solape=SOLAPE)
            else:
                vector[indf, acumulado] = Espectro.mean(
                )  # getattr(Espectro, param[0])()
            acumulado = acumulado + 1

        if MFCC > 0:
            mfcc_features = mfcc(s,
                                 samplerate=s.sampleRate,
                                 winlen=VENTANA,
                                 numcep=MFCC)
            mfcc_means = np.mean(mfcc_features, 0)
            for i in range(0, MFCC):
                vector[indf, acumulado] = mfcc_means[i]
                acumulado = acumulado + 1

            if DELTAS:
                delta = np.zeros(MFCC)
                dobledelta = np.zeros(MFCC)

                for i in range(0, MFCC):
                    diferencias = np.diff(mfcc_features[:, i])
                    delta[i] = np.sum(diferencias)
                    dobledelta[i] = np.sum(np.diff(diferencias))

                for i in range(0, MFCC):
                    vector[indf, acumulado] = delta[i]
                    acumulado = acumulado + 1

                for i in range(0, MFCC):
                    vector[indf, acumulado] = dobledelta[i]
                    acumulado = acumulado + 1

        if CHROMA > 0:
            array_chroma = Espectro.chroma()

            for i in range(0, CHROMA):
                vector[indf, acumulado] = array_chroma[i]
                acumulado = acumulado + 1

        if FLUX > 0:
            spectral_frames = s.frames(lenv)
            spectra = [f.spectrum_dct() for f in spectral_frames]
            flujo = SpectralFlux.spectralFlux(spectra, rectify=True)

            for i in range(0, FLUX):
                vector[indf, acumulado] = flujo[i]
                acumulado = acumulado + 1

    return vector
示例#2
0
def extractor_audio(buffer, fs):

    '''
    :param buffer: string list del audio a vectorizar
    :return: una fila del vector
    '''

    s = AudioFile.open_frombuffer(buffer)
    sf = s.frames(fs)


    num_ventanas = len(sf)

    lenv = np.round(s.sampleRate*VENTANA)

    vector = np.zeros([num_ventanas, NUM_PARAMETROS], dtype=np.float32)

    for indf, frame in enumerate(sf):


        Espectro = frame.spectrum()

        acumulado=0

        for param in zip(PARAMETROS, TIPO_PARAMETROS):

            if not param[1]:
                vector[indf,acumulado] = getattr(Energy, param[0])(frame, windowSize= lenv, solape=SOLAPE)

            else:
                vector[indf,acumulado] = Espectro.mean()# getattr(Espectro, param[0])()
            acumulado = acumulado + 1

        if MFCC > 0:
            mfcc_features = mfcc(s, samplerate=s.sampleRate,winlen=VENTANA, numcep=MFCC)

            mfcc_means = np.mean(mfcc_features, 0)
            for i in range(0, MFCC):
                vector[indf, acumulado] = mfcc_means[i]
                acumulado = acumulado + 1

            if DELTAS:
                delta=np.zeros(MFCC)
                dobledelta=np.zeros(MFCC)

                for i in range(0, MFCC):
                    diferencias=np.diff(mfcc_features[:, i])
                    delta[i] = np.sum(diferencias)
                    dobledelta[i] = np.sum(np.diff(diferencias))

                for i in range(0, MFCC):
                    vector[indf,acumulado] = delta[i]
                    acumulado = acumulado + 1

                for i in range(0, MFCC):
                    vector[indf,acumulado] = dobledelta[i]
                    acumulado = acumulado + 1

        if CHROMA > 0:
            array_chroma=Espectro.chroma()

            for i in range(0,CHROMA):
                vector[indf,acumulado]=array_chroma[i]
                acumulado = acumulado + 1


        if FLUX > 0:
            spectral_frames=s.frames(lenv)
            spectra = [f.spectrum_dct() for f in spectral_frames]
            flujo=SpectralFlux.spectralFlux(spectra, rectify=True)

            for i in range(0,FLUX):
                vector[indf, acumulado]=flujo[i]
                acumulado = acumulado + 1

    return vector
示例#3
0
def extractor_var(origen, framelen=0.25, destino=''):
    """
    Metodo extractor de features (caracteristicas o descriptores) de un array de tipo PCM
    Se realizara mediante segmentacion por segundos del array de muestras de audio.
    Por cada segundo tendremos una fila de un vector 1D de longitud el numero de parametros que extraigamos
    Al final se almacena esta matriz de dimensiones NumSegundosxNumParametros en formato npy en una ruta designada
    Un archivo por cada audio
    O tambien,si no le damos un destino, genera un vector uniendo todos los audios y lo devuelve

    :param s: ruta de los arrays originales para parametrizar
    :type s: string
    :param p: ruta donde se almacenaran los vectores parametrizados
    :type p: string

    Actualmente en config tenemos establecido este set de features:
    Vector de 20 parametros:
    lst_energy - hzcrr - centroid - spread - variance - rolloff - mean - crest - mfcc (8)
    """

    if not os.path.isdir(origen):
        if not os.path.isfile(origen):
            print 'Directorio o nombre de archivos de origen no valido o sin extension (wav/mp3)'
            sys.exit()
        else:
            origen = origen
    else:
        origen = os.path.join(origen, '*.wav')

    if not glob.glob(origen):
        print 'no hay archivos de formato wav en el directorio'
        sys.exit()

    vectortotal = []
    primero = True

    print 'Inicio del parametrizador. Extraccion segundo a segundo y con %i parametros' % NUM_PARAMETROS

    for filename in (glob.glob(origen)):
        print '\nVectorizando archivo: ', filename
        t1 = time.time()
        s = AudioFile.open(filename)
        sf = s.frames(s.sampleRate * framelen)
        num_ventanas = len(sf)
        lenv = np.round(s.sampleRate * VENTANA)
        vector = np.zeros([num_ventanas, NUM_PARAMETROS], dtype=np.float32)
        for indf, frame in enumerate(sf):
            print len(frame)
            if len(frame) < s.sampleRate:
                break
            Espectro = frame.spectrum()
            acumulado = 0

            for param in zip(PARAMETROS, TIPO_PARAMETROS):
                if not param[1]:
                    vector[indf,
                           acumulado] = getattr(Energy,
                                                param[0])(frame,
                                                          windowSize=lenv,
                                                          solape=SOLAPE)
                else:
                    vector[indf, acumulado] = Espectro.mean(
                    )  # getattr(Espectro, param[0])()
                acumulado = acumulado + 1

            if MFCC > 0:
                mfcc_features = mfcc(frame,
                                     samplerate=s.sampleRate,
                                     winlen=VENTANA,
                                     numcep=MFCC)
                mfcc_means = np.mean(mfcc_features, 0)
                for i in range(0, MFCC):
                    vector[indf, acumulado] = mfcc_means[i]
                    acumulado = acumulado + 1
                if DELTAS:
                    delta = np.zeros(MFCC)
                    dobledelta = np.zeros(MFCC)
                    for i in range(0, MFCC):
                        diferencias = np.diff(mfcc_features[:, i])
                        delta[i] = np.sum(diferencias)
                        dobledelta[i] = np.sum(np.diff(diferencias))
                    for i in range(0, MFCC):
                        vector[indf, acumulado] = delta[i]
                        acumulado = acumulado + 1
                    for i in range(0, MFCC):
                        vector[indf, acumulado] = dobledelta[i]
                        acumulado = acumulado + 1
            if CHROMA > 0:
                array_chroma = Espectro.chroma()
                for i in range(0, CHROMA):
                    vector[indf, acumulado] = array_chroma[i]
                    acumulado = acumulado + 1
            if FLUX > 0:
                spectral_frames = frame.frames(lenv)
                spectra = [f.spectrum_dct() for f in spectral_frames]
                flujo = SpectralFlux.spectralFlux(spectra, rectify=True)
                for i in range(0, FLUX):
                    vector[indf, acumulado] = flujo[i]
                    acumulado = acumulado + 1

        print 'Tiempo de parametrizacion (minutos): '
        print(time.time() - t1) / 60

        archivo = os.path.split(filename)[1].split('.')[0]
        ruta = os.path.join(destino, archivo)

        if destino:
            np.save(ruta, vector)
        if primero:
            vectortotal = np.array(vector)
        else:
            vectortotal = np.append(vectortotal, np.array(vector), axis=0)
        primero = False

    return vectortotal
示例#4
0
def extractor_var(origen, framelen = 0.25, destino=''):

    """
    Metodo extractor de features (caracteristicas o descriptores) de un array de tipo PCM
    Se realizara mediante segmentacion por segundos del array de muestras de audio.
    Por cada segundo tendremos una fila de un vector 1D de longitud el numero de parametros que extraigamos
    Al final se almacena esta matriz de dimensiones NumSegundosxNumParametros en formato npy en una ruta designada
    Un archivo por cada audio
    O tambien,si no le damos un destino, genera un vector uniendo todos los audios y lo devuelve

    :param s: ruta de los arrays originales para parametrizar
    :type s: string
    :param p: ruta donde se almacenaran los vectores parametrizados
    :type p: string

    Actualmente en config tenemos establecido este set de features:
    Vector de 20 parametros:
    lst_energy - hzcrr - centroid - spread - variance - rolloff - mean - crest - mfcc (8)
    """


    if not os.path.isdir(origen):
        if not os.path.isfile(origen):
            print 'Directorio o nombre de archivos de origen no valido o sin extension (wav/mp3)'
            sys.exit()
        else:
            origen = origen

    else:
        origen = os.path.join(origen, '*.wav')



    if not glob.glob(origen):
        print 'no hay archivos de formato wav en el directorio'
        sys.exit()

    vectortotal = []
    primero = True

    print 'Inicio del parametrizador. Extraccion segundo a segundo y con %i parametros' % NUM_PARAMETROS

    for filename in (glob.glob(origen)):

        print '\nVectorizando archivo: ', filename

        t1 = time.time()

        s = AudioFile.open(filename)

        sf = s.frames(s.sampleRate*framelen)

        num_ventanas = len(sf)

        lenv = np.round(s.sampleRate*VENTANA)

        vector = np.zeros([num_ventanas, NUM_PARAMETROS], dtype=np.float32)

        for indf, frame in enumerate(sf):
            print len(frame)
            if len(frame)<s.sampleRate:
                break
            Espectro = frame.spectrum()

            acumulado=0

            for param in zip(PARAMETROS, TIPO_PARAMETROS):

                if not param[1]:
                    vector[indf, acumulado] = getattr(Energy, param[0])(frame, windowSize= lenv, solape=SOLAPE)

                else:
                    vector[indf, acumulado] = Espectro.mean()# getattr(Espectro, param[0])()
                acumulado = acumulado + 1

            if MFCC > 0:
                mfcc_features = mfcc(frame, samplerate=s.sampleRate,winlen=VENTANA, numcep=MFCC)

                mfcc_means = np.mean(mfcc_features, 0)
                for i in range(0, MFCC):
                    vector[indf, acumulado] = mfcc_means[i]
                    acumulado = acumulado + 1

                if DELTAS:
                    delta=np.zeros(MFCC)
                    dobledelta=np.zeros(MFCC)

                    for i in range(0, MFCC):
                        diferencias=np.diff(mfcc_features[:, i])
                        delta[i] = np.sum(diferencias)
                        dobledelta[i] = np.sum(np.diff(diferencias))

                    for i in range(0, MFCC):
                        vector[indf, acumulado] = delta[i]
                        acumulado = acumulado + 1

                    for i in range(0, MFCC):
                        vector[indf, acumulado] = dobledelta[i]
                        acumulado = acumulado + 1

            if CHROMA > 0:
                array_chroma=Espectro.chroma()

                for i in range(0,CHROMA):
                    vector[indf, acumulado]=array_chroma[i]
                    acumulado = acumulado + 1


            if FLUX > 0:
                spectral_frames=frame.frames(lenv)
                spectra = [f.spectrum_dct() for f in spectral_frames]
                flujo=SpectralFlux.spectralFlux(spectra, rectify=True)

                for i in range(0,FLUX):
                    vector[indf, acumulado]=flujo[i]
                    acumulado = acumulado + 1


        print 'Tiempo de parametrizacion (minutos): '
        print (time.time()-t1)/60

        archivo = os.path.split(filename)[1].split('.')[0]
        ruta = os.path.join(destino,archivo)

        if destino:

            np.save(ruta, vector)

        if primero:
            vectortotal = np.array(vector)
        else:
            vectortotal = np.append(vectortotal,np.array(vector), axis=0)

        primero = False


    return vectortotal