Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнить два звука ?

3.2K
03 марта 2008 года
rihkov
42 / / 30.10.2005
Здравствуйте! Подскажите пожалуйста как сравнить два звука, допустим есть два коротких звуковых файла, и мне их нужно сравнить одинаковые они или нет ? Теоретически, как мне кажется их можно сравнить если провести амплитудно-частотный анализ, но как это зделать программно ?
1.9K
04 марта 2008 года
andriano
474 / / 10.01.2008
Звуки должен слышать человек. Следовательно, сравнивать можно одним из двух способов:
1. Сравнение на побайтную идентичность.
2. Сравнение на похожесть с точки зрения человеческого слуха.
Первое, думаю, в комментариях не нуждается.
Второе:
Амплитуда: Разделить файлы каждый на участки по несколько десятков мс, замерить в каждом среднюю громкость, построить профили, вычслить коэффициент корреляции.
Частота: срезать фильтром верхиние частоты (примерно выше 3-5 кгц), передискретизировать файлы на одинаковую более низкую частоту, разбить файл на участки и для каждого построить спектр (БПФ), после чего, опять же, вычислить коэффициент корреляции.
239
04 марта 2008 года
Dolonet
1.7K / / 20.05.2000
Очень сложную задачу Вы ставите. Нужно соответствие человеческого голоса ранее записанному семплу? Это вообще AI свой писать надо, и писан он уже не раз, кстати. Если надо сравнивать два музыкальных файла на одинаковость, но они могут быть с переменным битрейтом, в разном качестве и разной длины (где-то кто-то обрезан с одного конца), то это тоже нетривиальная задача. Тут надо подключать кодеки, сжимать файлы до низкого качества и сравнивать, учитывая погрешность, поэтапно, пробуя разные смещения.
3.2K
04 марта 2008 года
rihkov
42 / / 30.10.2005
Цитата:
Очень сложную задачу Вы ставите. Нужно соответствие человеческого голоса ранее записанному семплу? Это вообще AI свой писать надо, и писан он уже не раз, кстати.



Да именно это мне и нужно, можно поконкретнее что за AI писать нужно ?

239
04 марта 2008 года
Dolonet
1.7K / / 20.05.2000
AI - это искусственный интеллект по-русски.
Вам прямо алгоритм рассказать? Его надо сначала откуда-нибудь скоммуниздить :)
1.9K
05 марта 2008 года
andriano
474 / / 10.01.2008
Цитата: rihkov
Да именно это мне и нужно, можно поконкретнее что за AI писать нужно ?


Докторскую писать собрался?

239
05 марта 2008 года
Dolonet
1.7K / / 20.05.2000
andriano, не подначивайте, пожалуйста. Эта задача имеет своё решение, и не нам судить, в силах rihkov это или нет.
16K
05 марта 2008 года
OlbanyRok
75 / / 14.07.2007
Если это музыка, то можно просто гармоники посчитать для разных участков, по преобразованию Фурье. В принципе, и для голоса пойдет. Чем больше считаете - тем точнее определение.
1.9K
05 марта 2008 года
andriano
474 / / 10.01.2008
Цитата: Dolonet
andriano, не подначивайте, пожалуйста. Эта задача имеет своё решение, и не нам судить, в силах rihkov это или нет.


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

239
05 марта 2008 года
Dolonet
1.7K / / 20.05.2000
andriano, в том виде, как она тут была сформулирована, она имеет решение. Надо сравнить на соответствие голос и записанный семпл.
3.2K
07 марта 2008 года
rihkov
42 / / 30.10.2005
Хочу попробовать сравнить по преобразованию Фурье, с начала построить диограмму одного звука, а потом другого, потом их сравнить с допустимыми расхождениями. Сейчас читаю книгу по преобразованию Фурье.
239
07 марта 2008 года
Dolonet
1.7K / / 20.05.2000
Чем мы можем сейчас помочь?
37K
24 марта 2008 года
ATAVUS
1 / / 15.03.2008
Есть что-то похожее на мобильниках. Голосовой набор. Пробовал при наборе кривляться, не понимает, нужен только нормальный голос. Мне кажется Фурье ничего не даст. Это всего-лишь диаграмма (синусоида) и малейшая вибрация в голосе или посторонний шум приведут к отрицательному результату. Нужно искать другой вариант.
Или строить дополнительно библиотеку искажений (что-то вроде этого).
350
22 апреля 2008 года
cheburator
589 / / 01.06.2006
Очевидно, нужно проводить спектральный анализ и выявлять амплитудный спектр с некоторой периодичностью.
Как и писал andriano, нужно ввести некоторую метрику в пространстве спектров, или, проще говоря, ввести некий оператор сравнения, который будет определять, если спектр отличается "несильно", звуки в данный момент одинаковы, иначе - различны.
Можно сравнивать просто момент-в-момент, но, возможно, в анализируемом звуке возможен небольшой временной сдвиг (человек произнес контрольную фразу чуть медленнее или чуть быстрее, чем в образце), тут задача усложняется - если спектры неодинаковы, нужно пробовать сравнивать анализируемый звук с предыдущим отсчетом в образце и со следующим. При этом "счетчик отсчетов времени" соответствующим образом сдвигать.
Код:
// Имеется, условно говоря, массив, содержащий спектры образца в каждый момент времени
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;
      }
};

В данной ситуации оператор == сравнивает спектры не обязательно точно, а с допустимым приближением, которое должен задать программист.
Можно развить идею дальше и не сравнивать с предыдущим образцом (или последующим) бесконечно, т. к. в таком случае человек просто произнесет первый звук из "контрольной фразы" и программа сработает.
Хм... хорошая идея, надо самому попробовать :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог