Сопоставление двух серий коэффициентов Mfcc

Я извлек две серии коэффициентов MFCC из двух примерно 30-секундных аудиофайлов, состоящих из одного и того же речевого контента. Аудиофайлы записаны в одном месте из разных источников. Следует оценить, содержит ли звук тот же разговор или другой разговор. В настоящее время я тестировал вычисление корреляции двух серий Mfcc, но результат не очень разумный. Есть ли лучшие практики для этого сценария?


person Sney    schedule 03.08.2011    source источник
comment
Зачем вам для этого нужны MFCC? Я бы попытался скоррелировать пару низких частот ДПФ с течением времени.   -  person Efrain    schedule 12.08.2011
comment
Что вы имеете в виду под разными источниками? Означает ли одно и то же речевое содержание одного и того же говорящего и одни и те же слова в записанных сеансах? Какую проблему ты пытаешься решить? В целом я бы хотел сказать, что MFCC хорошо подходят для этой задачи, но мне нужно, чтобы вы прояснили мои вопросы, чтобы помочь вам. С Уважением   -  person KlausCPH    schedule 26.08.2011
comment
Под разными источниками я подразумеваю разные микрофоны в разных местах (то есть в разных частях одной комнаты), записывающие одного и того же говорящего и одни и те же слова в записанных сеансах.   -  person Sney    schedule 12.04.2013
comment
Согласованность - это один из критериев сравнения двух сигналов. Думаю, результат в частотной области. Идеальная линия соответствует абсолютно одинаковым сигналам.   -  person Celdor    schedule 25.09.2015


Ответы (4)


Поскольку два вектора фактически являются гистограммами, вы можете попробовать вычислить расстояние по хи-квадрат между векторами (обычная мера расстояния для гистограмм).

d(i) = sum (x(i) - y(i))^2/(2 * (x(i)+y(i)));

Хорошую (mex) реализацию можно найти в этом наборе инструментов:

http://www.mathworks.com/matlabcentral/fileexchange/15935-computing-pairwise-distances-and-metrics

Звоните следующим образом:

d = slmetric_pw(X, Y, 'chisq');
person tdc    schedule 16.11.2011

У меня была та же проблема, и решение для нее заключалось в сопоставлении двух массивов MFCC с помощью Dynamic Time Warping алгоритм.

После вычисления MFCC у вас теперь должен быть для каждого из ваших двух сигналов массив, в котором каждый элемент содержит MFCC для кадра (массив массивов). Первым шагом будет вычисление «расстояний» между каждым элементом одного массива и каждым элементом другого, то есть расстояния между каждыми двумя наборами MFCC (вы можете попробовать использовать Евклидово расстояние для этого).

Это должно оставить вас с 2-мерным массивом (назовем его "dist"), где элемент (i, j) представляет собой расстояние между MFCC i-го кадра в первом сигнале и MFCC j-го кадра. вашего второго сигнала.

К этому массиву теперь можно применить алгоритм DTW:

  • dtw (1,1) = dist (1,1)
  • dtw (i, j) = min (dtw (i-1, j-1), dtw (i-1, j), dtw (i, j-1)) + dist (i, j).

Значение, представляющее «разницу» между вашими двумя файлами, - dtw (n, m), где n = nr. кадров в первом сигнале, m = nr. кадров второго.

Для дальнейшего чтения этот документ может дать вам общее представление о применении DTW. в MFCC и эта презентация алгоритма DTW также может помочь.

person Ioanna    schedule 25.03.2013

Недавно я столкнулся с той же проблемой. Лучший способ, который я нашел, - использовать аудиотеку MIRtoolbox, который очень эффективен с точки зрения обработки звука.

После добавления этой библиотеки расстояние между двумя MFCC можно легко вычислить, вызвав (меньшее расстояние ‹=> аналогичные совпадения):

dist = mirgetdata(mirdist(mfcc1, mfcc2));
person herohuyongtao    schedule 30.12.2013

Я знаю, что вопрос существует уже почти 10 лет, но сейчас я искал то же самое, и лично я нашел приведенные выше предложения слишком сложными. Для тех, кто все еще ищет, вы можете начать с простого использования scipy, чтобы получить расстояние между двумя матрицами с вашими данными mfcc:

>>> from scipy.spatial import minkowski_distance
>>> a = [[-2.231413e+01,-5.495589e+01,-2.177988e+01,-1.719458e+01,-1.513321e+01,1.324277e+01,-9.265136e-01,1.542478e+01,1.007597e+01,7.356851e-01,1.106412e+01,-9.447377e+00,-1.325694e+00 ],[-2.294377e+01,-5.487790e+01,-2.152807e+01,-1.725173e+01,-1.500316e+01,1.287956e+01,-7.995839e-01,1.540848e+01,1.040512e+01,3.215451e-01,1.113061e+01,-9.390820e+00,-1.065433e+00 ], [-2.251059e+01,-5.475804e+01,-2.188462e+01,-1.709198e+01,-1.516142e+01,1.278525e+01,-7.952995e-01,1.602424e+01,9.981795e+00,4.940354e-01,1.081703e+01,-9.485857e+00,-7.487018e-01 ]]
>>> b = [[-2.231413e+01,-5.495589e+01,-2.177988e+01,-1.719458e+01,-1.513321e+01,1.324277e+01,-9.265136e-01,1.542478e+01,1.007597e+01,7.356851e-01,1.106412e+01,-9.447377e+00,-1.325694e+00 ], [-2.294327e+01,-5.488413e+01,-2.152952e+01,-1.724601e+01,-1.500094e+01,1.287461e+01,-8.023301e-01,1.541246e+01,1.040808e+01,3.185866e-01,1.112774e+01,-9.388848e+00,-1.062943e+00], [-2.250507e+01,-5.481581e+01,-2.189883e+01,-1.704281e+01,-1.514221e+01,1.274256e+01,-8.183736e-01,1.606115e+01,1.000806e+01,4.662135e-01,1.079070e+01,-9.468561e+00,-7.260294e-01 ]]
>>> minkowski_distance(a, b)
array([0.        , 0.01274899, 0.11421053])

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.minkowski_distance.html

Чтобы получить подробные данные MFCC, я использовал yaafe (упакованный в контейнер Docker): http://yaafe.github.io/Yaafe/manual/install.html

Вот как обойти проблему с установкой: https://github.com/Yaafe/Yaafe/issues/52

person Vladimir T    schedule 30.04.2020
comment
Приведенные выше ответы предполагают использование хи-квадрат, а не минковского. Почему вы предлагаете, чтобы это работало? - person user3668129; 03.07.2021
comment
Это сработало в моем случае, когда я сопоставил небольшие сэмплы звука для соответствия - это очень помогло ускорить процесс. Я думаю, что это может привести к некоторым проблемам, если образцы звука будут сильно искажены, но для меня было нормально, если в таких случаях результат не совпадал. - person Vladimir T; 03.07.2021