Я извлек две серии коэффициентов MFCC из двух примерно 30-секундных аудиофайлов, состоящих из одного и того же речевого контента. Аудиофайлы записаны в одном месте из разных источников. Следует оценить, содержит ли звук тот же разговор или другой разговор. В настоящее время я тестировал вычисление корреляции двух серий Mfcc, но результат не очень разумный. Есть ли лучшие практики для этого сценария?
Сопоставление двух серий коэффициентов Mfcc
Ответы (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');
У меня была та же проблема, и решение для нее заключалось в сопоставлении двух массивов 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 также может помочь.
Недавно я столкнулся с той же проблемой. Лучший способ, который я нашел, - использовать аудиотеку MIRtoolbox, который очень эффективен с точки зрения обработки звука.
После добавления этой библиотеки расстояние между двумя MFCC можно легко вычислить, вызвав (меньшее расстояние ‹=> аналогичные совпадения):
dist = mirgetdata(mirdist(mfcc1, mfcc2));
Я знаю, что вопрос существует уже почти 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