repstosw 18 25 сентября Опубликовано 25 сентября (изменено) · Жалоба Есть спектрограмма аудио-записи, на которой произнесено одно и то же слово несколько раз с некоторыми интервалами. В качестве опорного изображения (с чем надо будет сравнивать) выделен фрагмент слога - переход с согласной на гласную: слог "ли". Требуется пройтись по всей аудио-записи и найти ещё этот слог (опорный: "ли"). Акустическая система(микрофон, усилитель, голос диктора, ОСШ) - фиксированы. В качестве исходных данных - используются 13 коэффициентов MFCC (самый первый - энергия фрейма). Коэффициенты получены с окна 25 мс, перекрыш 10 мс, окно Хемминга. Был применён стандартный MEL-банк фильтров. Спектрограмма в WAV-редакторе - два раза сказано одно и то же слово (опорный фрагмент - слог "ли" выделен - интервал4 окна по 25 мс ) : Цветовая интерпретация через коэффициенты MFCC (только для визуализации, сами коэффициенты доступны в формате double/float): ЧБ: Цветное: Собственно, главный вопрос: как оценить степень схожести с опорным фрагментом? Рассматривал данные как линейный массив, и делал вычисления через Евклидово расстояние, повышал степень выше квадрата - результаты сходства/различия были, но они провлялись не так сильно. Читал про DTW - Dynamic Time Warping, нашёл и отладил алгоритм. Понял , что вещь полезная, но пока не могу её применить к этой задаче, так как непонятно - как сегментировать аудио-поток ? Изменено 25 сентября пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 10 25 сентября Опубликовано 25 сентября · Жалоба 3 hours ago, repstosw said: Собственно, главный вопрос: как оценить степень схожести с опорным фрагментом? Рассматривал данные как линейный массив, и делал вычисления через Евклидово расстояние, повышал степень выше квадрата - результаты сходства/различия были, но они провлялись не так сильно. Использовал взвешенное на первый mfcc коэфф (у меня он тоже- энергия) евклидово расстояние примерно так %вычисление расстояний между выборками %mfсс-коэффициентов.Используем взвешенное расстояние в пространстве %размерности N*M (N - количество кадров в словарном слове M - количество %использованных mfcc коэффицентов) function d = compute_distance(sig, voc) len = size(voc,2); d = 0; scale = 0; for ii = 1:len %расстояние как взвешенная сумма расстояний во всех кадрах d_i = voc(1,ii) * dot(sig(2:end,ii) - voc(2:end,ii),... sig(2:end,ii) - voc(2:end,ii)); d = d + d_i; %накапливаем общую энергию слова с словаре scale = scale + voc(1,ii); end d = sqrt(d /scale); end sig - то, что принято voc - словарь Это дает а) Независимость от уровня входного сигнала ь) Кадры (окна), где энергия тестового слова маленькая, учитываются с меньшим весом. DTW вроде не особо нужно в описанном случае - тестовый фрагмент у вас короткий по времени. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 25 сентября Опубликовано 25 сентября (изменено) · Жалоба 1 hour ago, andyp said: Это дает а) Независимость от уровня входного сигнала ь) Кадры (окна), где энергия тестового слова маленькая, учитываются с меньшим весом. DTW вроде не особо нужно в описанном случае - тестовый фрагмент у вас короткий по времени. Спасибо! Переписал функцию на C (пишу на нём): #define NCEP 13 //число кепстральных коэффициентов (первый - энергия) #define SAMPLE 16 //число фреймов в образце #define TOTAL 999 //число фреймов в дорожке double Ref[NCEP][SAMPLE]; //образец double Test[NCEP][TOTAL]; //дорожка double Distance(double Ref[NCEP][SAMPLE],double Test[NCEP][SAMPLE]) { double d=0; double scale=0; for(int i=0;i<SAMPLE;i++) { double di=0; for(int j=1;j<NCEP;j++)di+=pow(Test[j][i]-Ref[j][i],2.0); //расстояние как взвешенная сумма расстояний во всех кадрах di*=Ref[0][i]; d+=di; scale+=Ref[0][i]; //накапливаем общую энергию слова в словаре } d=pow(d/scale,0.5); return d; } Работает. Движение по массиву данных делаю на +1 фрейм: for(int d=0;d<TOTAL-SAMPLES;d+=1) { double dist=Distance(Ref,Test[d]); printf("%13.13lf\n",10.0*log(dist)); } Взял логарифм с дальности и помножил на 10 (имитация в децибеллах). Получилось вот так (график в Excel построил). В записи одинаковое слово произнесено 10 раз. Первый минимум-совпадение - дистанция резко в ноль (так как образец взят из части тестовой дорожки - идеальное совпадение): Какие будут замечания, дополнения? 1). Какой должен быть шаг движения по массиву MFCC ? Сейчас сдвиг на +1 фрейм - на 1 сравнение. 2). Какие требования к числу фреймов образца? Сейчас взято 16 фреймов, что соответствует длительности 0,16 секунд. 3). Для распознавания лучше использовать дифоны вместо фонем? КМК применять дифоны разумнее: переход одной фонемы в другую - минимум времени и максимум признаков для различия. Изменено 25 сентября пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 10 25 сентября Опубликовано 25 сентября · Жалоба 8 hours ago, repstosw said: 1). Какой должен быть шаг движения по массиву MFCC ? Сейчас сдвиг на +1 фрейм - на 1 сравнение. 2). Какие требования к числу фреймов образца? Сейчас взято 16 фреймов, что соответствует длительности 0,16 секунд. 3). Для распознавания лучше использовать дифоны вместо фонем? КМК применять дифоны разумнее: переход одной фонемы в другую - минимум времени и максимум признаков для различия. 1. Я тоже анализировал для каждого окна. Т.е. для Вашего случая полз по выходным данным с шагом 10 мс. Этот параметр можно подбирать - метрика увеличится для большего шага (перекрытия), но если удастся выставить порог, то ОК - меньше считать придется. 2. Завист от цели всего этого. Если цель - распознавать фикс. набор слов, то длина образца подбирается так, чтобы метрики наиболее сильно отличались для отдельных слов набора. У меня длина слов в словаре была примерно 500 мс. Если у вас живой диктор, а не повторы записи, то тут уже DTW может потребоваться. 3. Не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 25 сентября Опубликовано 25 сентября (изменено) · Жалоба 5 hours ago, andyp said: 2. Завист от цели всего этого. Если цель - распознавать фикс. набор слов, то длина образца подбирается так, чтобы метрики наиболее сильно отличались для отдельных слов набора. У меня длина слов в словаре была примерно 500 мс. Если у вас живой диктор, а не повторы записи, то тут уже DTW может потребоваться. Цель: разметка звуковой записи на фонемы или дифоны. При этом, как было указано в нуль-посте: акустический тракт, диктор, скорость и интонация одинаковы. Однако, пока не получил сильного контраста между похожими слогами: сделал новую запись - "лифт, лев, лифт, лев, лифт, лев, лев, лифт, лифт, лев" и сделал сравнениее с опорным слогом "ли" и "ле". (по 20 фреймов 10 мс) Дистанции по опорному "ли": Дистанции по опорному "ле": Ну тоесть выходит, что когда находятся дистанции по опорному слогу "ли", то различия с похожим "ле" - не сильно велики. При этом, алгоритм учитывает только вес (энергию) по опоре. А энергия в самом треке - не учитывается. А надо бы учесть... Ну и чисто визуально слоги ЛИ и ЛЕ на спектрограмме глазом более различимы, чем высчитанные выше дистанции: ЛИ ЛЕ Должен быть алгоритм, который даёт большую степень различия между этими слогами. А если вместо MFCC перейти к LPC коэффициентам или линейным спектральным парам LSF/LSP? По ним различия будут более эффективны, чем MFCC? Или вместе с MFCC использовать. Пишут ещё про дерривативы - скорость и ускорение MFCC: dMFCC, ddMFCC. Пробовал по ним строить различия - отношение "сигнал/шум" не изменилось. Дерривативы считал как разность между соседними фреймами: dMFCC[j][i] = MFCC[j][i-1] - MFCC[j][i+1] Изменено 25 сентября пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 8 26 сентября Опубликовано 26 сентября · Жалоба repstosw Должен быть алгоритм, который даёт большую степень различия между этими слогами. Считайте расстояния, где ЛИ и ЛЕ различаются между собой, с большим весом, где не отличаются с нулевым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 10 26 сентября Опубликовано 26 сентября (изменено) · Жалоба Quote При этом, алгоритм учитывает только вес (энергию) по опоре. А энергия в самом треке - не учитывается. А надо бы учесть... Quote Ну и чисто визуально слоги ЛИ и ЛЕ на спектрограмме глазом более различимы, чем высчитанные выше дистанции: В самом треке плохо энергию учитывать имхо. Тогда расстояния от тихих и громких слов будут отличаться. Может статься, И и Е в один фильтр банка бумкают. Попробуйте больше коэффициентов, ограничьте полосу 3-4 кГц. Ещё, метрика увеличивается, когда принятое слово и словарное сдвинуты по времени, но тут все ОК должно быть - 10 мс ничем Изменено 26 сентября пользователем andyp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 27 сентября Опубликовано 27 сентября · Жалоба Пришёл к выводу, что пока рано распознавать фонемы, для начала нужно сделать сегментацию - выделить межфонемные переходы. КМК это сделать будет эффективно с помощью вейвлет-разложений, в них искать резкие изменения производных. http://msm.omsu.ru/jrns/jrn23/VishnyakovaLavrov.pdf Сегментация нужна хотя бы для того, чтобы знать в каких границах искать фонему. Оно всё в теории смотрится красиво, а на практике как всегда придёстя подбирать пороги срабатывания и экпериментировать с коэффициентами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться