// Имеется, условно говоря, массив, содержащий спектры образца в каждый момент времени
Specter sample_specter[N];
// Имеется массив спектров анализируемого звука в каждый момент времени
Specter sound_specter[M];
int sample_specter_count = 0;
bool equal = true;
for (int i=0; i<M; ++i)
{
if (sound_specter == sample_specter[sample_specter_count]) // Сравнили с текущим участком образца
// ОК, участки совпадают
++sample_specter_count;
else
if (sound_specter == sample_specter[sample_specter_count-1]) // Сравнили с предыдущим участком образца
// ОК, участки совпадают, но счетчик не увеличиваем
;
else
if (sound_specter == sample_specter[sample_specter_count+1]) // Сравнили со следующим участком образца
// ОК, участки совпадают, но счетчик увеличиваем на 2
sample_specter_count+=2;
else
{
equal = false;
break;
}
};
Сравнить два звука ?
Здравствуйте! Подскажите пожалуйста как сравнить два звука, допустим есть два коротких звуковых файла, и мне их нужно сравнить одинаковые они или нет ? Теоретически, как мне кажется их можно сравнить если провести амплитудно-частотный анализ, но как это зделать программно ?
1. Сравнение на побайтную идентичность.
2. Сравнение на похожесть с точки зрения человеческого слуха.
Первое, думаю, в комментариях не нуждается.
Второе:
Амплитуда: Разделить файлы каждый на участки по несколько десятков мс, замерить в каждом среднюю громкость, построить профили, вычслить коэффициент корреляции.
Частота: срезать фильтром верхиние частоты (примерно выше 3-5 кгц), передискретизировать файлы на одинаковую более низкую частоту, разбить файл на участки и для каждого построить спектр (БПФ), после чего, опять же, вычислить коэффициент корреляции.
Очень сложную задачу Вы ставите. Нужно соответствие человеческого голоса ранее записанному семплу? Это вообще AI свой писать надо, и писан он уже не раз, кстати. Если надо сравнивать два музыкальных файла на одинаковость, но они могут быть с переменным битрейтом, в разном качестве и разной длины (где-то кто-то обрезан с одного конца), то это тоже нетривиальная задача. Тут надо подключать кодеки, сжимать файлы до низкого качества и сравнивать, учитывая погрешность, поэтапно, пробуя разные смещения.
Цитата:
Очень сложную задачу Вы ставите. Нужно соответствие человеческого голоса ранее записанному семплу? Это вообще AI свой писать надо, и писан он уже не раз, кстати.
Да именно это мне и нужно, можно поконкретнее что за AI писать нужно ?
Вам прямо алгоритм рассказать? Его надо сначала откуда-нибудь скоммуниздить :)
Цитата: rihkov
Да именно это мне и нужно, можно поконкретнее что за AI писать нужно ?
Докторскую писать собрался?
andriano, не подначивайте, пожалуйста. Эта задача имеет своё решение, и не нам судить, в силах rihkov это или нет.
Если это музыка, то можно просто гармоники посчитать для разных участков, по преобразованию Фурье. В принципе, и для голоса пойдет. Чем больше считаете - тем точнее определение.
Цитата: Dolonet
andriano, не подначивайте, пожалуйста. Эта задача имеет своё решение, и не нам судить, в силах rihkov это или нет.
В том виде, как она сформулирована, она решения не имеет.
Если уточнить формулировку, существенно сузив область поиска, то, возможно, удастся найти варианты, для которых данная задача будет иметь решение. Или, возможно, подобрать полуэмпирическое решение. (т.е. ввести метрику, по которой расстояние менее наперед заданного порога означает, что файлы идентичны.)
andriano, в том виде, как она тут была сформулирована, она имеет решение. Надо сравнить на соответствие голос и записанный семпл.
Хочу попробовать сравнить по преобразованию Фурье, с начала построить диограмму одного звука, а потом другого, потом их сравнить с допустимыми расхождениями. Сейчас читаю книгу по преобразованию Фурье.
Чем мы можем сейчас помочь?
Или строить дополнительно библиотеку искажений (что-то вроде этого).
Как и писал andriano, нужно ввести некоторую метрику в пространстве спектров, или, проще говоря, ввести некий оператор сравнения, который будет определять, если спектр отличается "несильно", звуки в данный момент одинаковы, иначе - различны.
Можно сравнивать просто момент-в-момент, но, возможно, в анализируемом звуке возможен небольшой временной сдвиг (человек произнес контрольную фразу чуть медленнее или чуть быстрее, чем в образце), тут задача усложняется - если спектры неодинаковы, нужно пробовать сравнивать анализируемый звук с предыдущим отсчетом в образце и со следующим. При этом "счетчик отсчетов времени" соответствующим образом сдвигать.
Код:
В данной ситуации оператор == сравнивает спектры не обязательно точно, а с допустимым приближением, которое должен задать программист.
Можно развить идею дальше и не сравнивать с предыдущим образцом (или последующим) бесконечно, т. к. в таком случае человек просто произнесет первый звук из "контрольной фразы" и программа сработает.
Хм... хорошая идея, надо самому попробовать :)