Как обработать разницу в функции MFCC для аудио файла разницы - PullRequest
0 голосов
/ 16 января 2019

librosa.feature.mfcc возвращает разностные размеры для другого аудиофайла. так как справиться с этим делом для обучения или тестирования модели

#test.py
import os
import pickle
import numpy as np 
from scipy.io.wavfile import read
import librosa as mfcc
from sklearn import preprocessing
import warnings
warnings.filterwarnings("ignore")
def get_MFCC(sr,audio):
    features = mfcc.feature.mfcc(audio,sr,n_mfcc=20, dct_type=2)
    feat     = np.asarray(())
    for i in range(features.shape[0]):
        temp = features[i,:]
        if np.isnan(np.min(temp)):
            continue
        else:
            if feat.size == 0:
                feat = temp
            else:
                feat = np.vstack((feat, temp))
    features = feat;
    features = preprocessing.scale(features)
    return features
#path to test data
source   = "C:\\Users\\PrashuGupta\\Downloads\\datasets\\pygender\\test_data\\AudioSet\\female_clips\\"
#path to save trained model
modelpath     = "C:\\Users\\Prashu Gupta\\Downloads\\datasets\\pygender\\"


gmm_files = [os.path.join(modelpath,fname) for fname in
              os.listdir(modelpath) if fname.endswith('.gmm')]
models    = [pickle.load(open(fname,'rb')) for fname in gmm_files]
genders   = [fname.split("\\")[-1].split(".gmm")[0] for fname
              in gmm_files]
files     = [os.path.join(source,f) for f in os.listdir(source)
              if f.endswith(".wav")] 
for f in files:
    print (f.split("\\")[-1])
    audio,sr  = mfcc.load(f, sr = 16000,mono = True)     
    features   = get_MFCC(sr,audio)
    scores     = None
    log_likelihood = np.zeros(len(models))
    for i in range(len(models)):
        gmm    = models[i]         #checking with each model one by one
        scores = np.array(gmm.score(features))
        log_likelihood[i] = scores.sum()
    winner = np.argmax(log_likelihood)
    print ("\tdetected as - ", genders[winner],"\n\tscores:female",log_likelihood[0],",male ", log_likelihood[1],"\n")

Ошибка

Ожидаемые входные данные X имеют 1800 функций, но получили 313 функций в очки = np.array (gmm.score (функции))

1 Ответ

0 голосов
/ 19 января 2019

Либо вы должны усечь / заполнить файлы так, чтобы все они были одинакового размера (скажем, 5 секунд), либо объединить функции для файла в вектор фиксированной длины, который не зависит от длины клипа (средняя / мин / макс) или вы заставляете классификатор работать с потоком окон объектов фиксированной длины (скажем, 1 секунда).

...