Почему библиотеки извлечения MFCC возвращают разные значения? - PullRequest
0 голосов
/ 31 августа 2018

Я извлекаю функции MFCC, используя две разные библиотеки:

  • Библиотека python_speech_features
  • The BOB lib

Однако выходные данные отличаются, и даже формы не одинаковы. Это нормально? или есть параметр, который мне не хватает?

Соответствующий раздел моего кода следующий:

import bob.ap
import numpy as np
from scipy.io.wavfile import read
from sklearn import preprocessing
from python_speech_features import mfcc, delta, logfbank

def bob_extract_features(audio, rate):
    #get MFCC
    rate              = 8000  # rate
    win_length_ms     = 30    # The window length of the cepstral analysis in milliseconds
    win_shift_ms      = 10    # The window shift of the cepstral analysis in milliseconds
    n_filters         = 26    # The number of filter bands
    n_ceps            = 13    # The number of cepstral coefficients
    f_min             = 0.    # The minimal frequency of the filter bank
    f_max             = 4000. # The maximal frequency of the filter bank
    delta_win         = 2     # The integer delta value used for computing the first and second order derivatives
    pre_emphasis_coef = 0.97  # The coefficient used for the pre-emphasis
    dct_norm          = True  # A factor by which the cepstral coefficients are multiplied
    mel_scale         = True  # Tell whether cepstral features are extracted on a linear (LFCC) or Mel (MFCC) scale

    c = bob.ap.Ceps(rate, win_length_ms, win_shift_ms, n_filters, n_ceps, f_min,
                    f_max, delta_win, pre_emphasis_coef, mel_scale, dct_norm)
    c.with_delta       = False
    c.with_delta_delta = False
    c.with_energy      = False

    signal = np.cast['float'](audio)           # vector should be in **float**
    example_mfcc = c(signal)                   # mfcc + mfcc' + mfcc''
    return  example_mfcc


def psf_extract_features(audio, rate):
    signal = np.cast['float'](audio) #vector should be in **float**
    mfcc_feature = mfcc(signal, rate, winlen = 0.03, winstep = 0.01, numcep = 13,
                        nfilt = 26, nfft = 512,appendEnergy = False)

    #mfcc_feature = preprocessing.scale(mfcc_feature)
    deltas       = delta(mfcc_feature, 2)
    fbank_feat   = logfbank(audio, rate)
    combined     = np.hstack((mfcc_feature, deltas))
    return mfcc_feature



track = 'test-sample.wav'
rate, audio = read(track)

features1 = psf_extract_features(audio, rate)
features2 = bob_extract_features(audio, rate)

print("--------------------------------------------")
t = (features1 == features2)
print(t)

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Тем не менее, выходные данные отличаются, и даже формы не одинаковы. Это нормально?

Да, есть разные варианты алгоритма, и каждая реализация выбирает свой собственный вариант

или есть параметр, который мне не хватает?

Речь идет не только о параметрах, но и об алгоритмических различиях, таких как форма окна (Хэмминга и Хеннинга), форма фильтров расплава, запуски фильтров расплава, нормализация фильтров расплава, лифтинг, ароматизатор и т. Д. И т. Д. И т. Д.

Если вы хотите получить одинаковые результаты, просто используйте для извлечения одну библиотеку, синхронизировать их практически безнадежно.

0 голосов
/ 03 октября 2018

Вы пытались сравнить два с некоторой терпимостью? Я полагаю, что две MFCC являются массивами чисел с плавающей запятой, и проверка на точное равенство может быть нецелесообразной. Попробуйте использовать numpy.testing.assert_allclose с некоторым допуском и решите, достаточно ли допустим допуск.

Тем не менее, я скучал по вам, говоря, что даже формы не соответствуют друг другу, и у меня нет опыта в bob.ap, чтобы уверенно комментировать это. Однако часто бывает так, что некоторые библиотеки дополняют ввод нулями либо в начале, либо в конце массива ввода по соображениям управления окнами, и это может быть причиной, если одна из них делает это по-другому.

...