Сравните звук между источником и микрофоном в JavaScript

Я работаю над звуком, но я новичок в этой области. Я хотел бы сопоставить звук с микрофона с моим исходным звуком (только 1 звук), например рекламу кока-колы из Shazam. Пример видео (0,45 минуты) Однако я хочу сделать это на веб-сайте с помощью JavaScript. Спасибо.


person Kanisorn Thongprapaisaeng    schedule 20.08.2017    source источник


Ответы (1)


Создание чего-то похожего на бэкэнд Shazam — непростая задача. Нам надо:

  1. Получить звук с микрофона пользователя (просто)
  2. Сравните его с источником и определите совпадение (хм... как...)

Как мы можем выполнить каждый шаг?

Получить аудио

Этот определенно не большой. Мы можем использовать Web Audio API для этого. Вы можете найти в Google хорошие учебники о том, как его использовать. Эта ссылка содержит некоторые полезные сведения об основах металла, которые могут вам понадобиться понять при использовании.

Сравните образцы с исходным аудиофайлом

Ясно, что эта часть будет алгоритмической задачей в подобном проекте. Вероятно, есть разные способы подойти к этой части, и не хватит времени, чтобы описать их все здесь, но есть один возможный метод (который на самом деле использует Shazam), который также описан более подробно здесь — это создание и сравнение своего рода отпечатков пальцев для небольших фрагментов ваш исходный материал, который вы можете создать с помощью анализа БПФ.

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

  1. Просматривайте небольшие фрагменты выборки продолжительностью не более нескольких секунд (обратите внимание, что это делается с помощью скользящего окна, а не дискретного разбиения) за раз.
  2. Вычислите преобразование Фурье аудиовыделения. Это разбивает наш выбор на множество сигналов разных частот. Мы можем проанализировать частотную область нашего образца, чтобы сделать полезные выводы о том, что мы слышим.
  3. Создайте отпечаток для выбора, определив критические значения в БПФ, такие как пиковые частоты или амплитуды.
  4. Если вы хотите иметь возможность сопоставлять несколько образцов, как это делает Shazam, вам следует вести словарь отпечатков пальцев, но, поскольку вам нужно сопоставить только один исходный материал, вы можете просто сохранить их в списке. Поскольку ваши ключи будут массивом числовых значений, я предлагаю другой возможной структурой данных для быстрого запроса вашего набора данных быть дерево kd. Я не думаю, что Shazam использует его, но чем больше я думаю об этом, тем ближе их система кажется к n-мерному поиску ближайшего соседа, если вы можете поддерживать постоянное количество критических точек. А пока, просто будь проще, используй список.

Теперь у нас есть база данных отпечатков пальцев, готовая к использованию. Теперь нам нужно сравнить их с нашим микрофонным входом.

  1. Сэмплируйте наш вход с микрофона небольшими сегментами со скользящим окном, так же, как мы делали это с источниками.
  2. Для каждого сегмента рассчитайте отпечаток и посмотрите, совпадает ли он с каким-либо из хранилища. Вы можете найти частичное совпадение здесь, и вы можете попробовать множество настроек и оптимизаций.
  3. Это будет зашумленный и неточный сигнал, поэтому не ожидайте, что каждый сегмент получит совпадение. Если многие из них получают совпадение (вам придется экспериментально выяснить, что означает множество), то предположим, что оно у вас есть. Если совпадений относительно мало, значит, нет.

Выводы

Это не будет супер-легким проектом, чтобы преуспеть. Требуемый объем настройки и оптимизации окажется проблемой. Некоторые микрофоны неточны, и в большинстве сред есть другие звуки, и все это испортит ваши результаты, но, вероятно, это не так плохо, как кажется. Я имею в виду, что это система, которая со стороны кажется неприступно сложной, и мы просто разбили ее на несколько относительно простых шагов.

Кроме того, в качестве последнего примечания, вы несколько раз упоминаете Javascript в своем посте, и вы можете заметить, что я упомянул его ноль раз до сих пор в своем ответе, и это потому, что язык реализации не является важным фактором. Эта система достаточно сложна, поэтому самыми сложными частями головоломки будут те, которые вы решите на бумаге, поэтому вам не нужно думать в терминах «как я могу сделать X в Y», просто придумайте алгоритм для X и Y должны быть естественными.

person rp.beltran    schedule 20.08.2017