Как я могу обнаружить свистки, треск и другие звуки на входе живого аудио?

9

Я прочитал много вопросов по SO, и, честно говоря, каждый из них не описывает какой-либо конкретный способ сделать это. Некоторые говорят «делать БПФ», а некоторые - «пересечение нуля» и т. Д. Но я дошел до того, что понял, что цифровой аудиовход состоит из массива амплитуд для определенной частоты и хорошо. Не очень много знаю за ней.

Теперь я знаю теорему Найквиста, частоту, амплитуду, ряды Фурье и т. Д., И это было 2-3 года назад, когда я делал это в своей университетской программе в каком-то семестре. Но в то время нас действительно мало учили практиковать использование Фурье в мире, и я даже не удосужился покопаться на предмете, помимо изучения, достаточно, чтобы пройти предмет. Но теперь мне придется использовать все эти вещи.

Вот снимок звуков, которые я пытаюсь обнаружить:

уникальный график щелчков пальцев и включения / выключения света

Очевидно, что звуки имеют уникальные графики. Я просто хочу понять, как извлечь их конкретные уникальные характеристики для их уникальных колючих линий на графике. Например, какая амплитуда, частота и т. Д. И на сколько времени - хотя это тривиально, я думаю.

Я хочу простой пошаговый, расплывчатый список инструкций - я могу использовать терминологию, которую я не пойму.

Как, может быть, это? -

  1. Получить входные аудиоданные

  2. Спектрограмма участка

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

  4. Изучите этот график - нарисуйте уникальные характеристики этого звука

  5. Сделайте какую-то функцию, которая может обнаруживать эти конкретные характеристики в прямом эфире аудио, используя характеристики звука, найденные в (4)

  6. Если совпадение найдено, хорошо - работа выполнена.

  7. Отработайте алгоритм, чтобы отсеять ложные негативы.

Где я в замешательстве - как мне пройти около 3,4,5. В частности, 3 и 4. Поскольку я создаю программное обеспечение, в котором пользователь сможет записывать любой звук в качестве жестового ввода для последующего использования, я бы хотел, чтобы моя система могла записывать любой звук и сопоставлять его с живым звуком. кормить, чтобы обнаружить этот звуковой жест. Как, скажем, кашлять, или щелкать пальцами, или свистеть, или хлопать. Или говоря согласные - или или или . Просто о любом звуке.ABXZ

Я думал о том, чтобы заставить пользователя записать звук, который он хочет сохранить как жест в тихой обстановке. И пользователь будет издавать звук только между тихим временным отступом ; 3 секунды в начале и в конце записи.

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

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

Проблема в том, что я все это думаю на простом английском языке. Мне нужно думать по математике и физике, чтобы иметь возможность эффективно реализовывать это в своем коде. Я просто чертовски не понимаю, что писать и где писать в моем коде - даже с таким большим количеством библиотек и вопросов по SO в моем распоряжении.

И извините, если это было долго.

bad_keypoints
источник
1
Из любопытства, эта спектрограмма сделана на телефоне или планшете? если да, можете ли вы назвать название приложения. Это выглядит действительно круто. Что касается вашего вопроса, то я думаю, что ваше приложение похоже на тему / задачу по распознаванию отдельных слов. Вы, вероятно, можете получить много идей и вдохновения от поиска в Google. Сложная часть заключается в том, чтобы не распознавать жесты в ограниченном относительно небольшом наборе жестов, а сложная часть состоит в том, чтобы отфильтровывать то, что не является жестами.
Ниарен
Это приложение: play.google.com/store/apps/… И спасибо за ваши точки зрения. Но я хочу, чтобы вы рассказали мне, как определять не слова, а звуки (по крайней мере, на данный момент), такие как свист, поп, хлопки и т. Д. Я работаю в Python.
bad_keypoints
1
К сожалению, такие вещи все еще остаются областью исследований. Я не знаю никого, кто бы решал эту конкретную проблему.
Бьорн Рош

Ответы:

2

Хотя я согласен с одним из комментариев о том, что использование методов распознавания речи может быть хорошим началом, эти звуки отличаются, и я не знаю никого, кто проводил какие-либо исследования по их классификации (статья, на которую ссылается Натан, по-видимому, различает только речь и шум), поэтому, если кто-то не представит что-то противоречащее этому, вам придется изобретать свою собственную технику, а для этого потребуется много обучения и много работы. Лучшее, что я могу сделать, - это начать.

Во-первых, не ожидайте, что кто-нибудь сможет создать магическую формулу. Нет никакого уравнения, чтобы добраться от звука к тому, что звук. Люди и компьютеры должны учиться, используя данные, чтобы сделать обоснованные предположения о том, что это за звуки. Причина, по которой люди говорят в своих ответах «использовать FFT» или «использовать пересечение нуля», заключается в том, что они являются одними из основных строительных блоков DSP, используемых в распознавании речи и связанных алгоритмах. Но БПФ и скорость пересечения нуля обычно являются только первыми шагами в создании набора параметров, описывающих звук. Эти параметры затем анализируются статистически (не через какую-то магическую функцию), чтобы определить, к какой категории они, скорее всего, относятся. Обратите внимание, что я сказал «скорее всего»: даже лучшее распознавание речи (и человеческий мозг!

Итак, некоторые параметры, которые вы можете искать, включают:

  • скорость пересечения нуля
  • частотный центроид
  • конверт (на самом деле это набор параметров, в том числе, например, время атаки)
  • спектральная огибающая
  • четный / нечетный гармонический баланс
  • voiciness
  • основной шаг

Если у вас есть набор параметров, которые, по вашему мнению, позволят вам различать звуки, вам потребуется использовать статистический метод для их классификации. Скрытая марковская модель часто используется в речи. Вы также можете посмотреть на логистическую регрессию, K-средства, и я уверен, что есть другие варианты, но я думаю, что HMM проверен и верен.

Бьорн Рош
источник
Ваш ответ хороший, но я в основном прошу о том, чтобы подобрать собственные звуки пользователя к звукам, которые он издает позже для использования моего программного обеспечения. Типа схожести. Скажем, пользователь издает разные типы звуков A, B и C. И характеристики этих звуков сохраняются как C_A, C_B и C_C соответственно.
bad_keypoints
Техника все та же: 1. выяснить, какие параметры вы собираетесь измерять, 2. измерить их, 3. использовать статистику, чтобы узнать, что отличает каждый звук, 4. использовать эти данные для классификации.
Бьорн Рош
так что это в основном то, что я думал. но я думаю, мне нужно будет посмотреть, какие параметры из хорошего длинного списка, который вы предоставили, я должен был бы пометить, чтобы они звучали неприятно.
bad_keypoints
1
Если честно, я очень пессимистично отношусь к возможности различать такие вещи, как щелчок пальцем и выключатель света в различных средах без большого количества образцов данных и, возможно, большего количества параметров, чем я дал, но я надеюсь, что ошибаюсь. Пожалуйста, сообщите о своих результатах, даже если это займет некоторое время.
Бьорн Рош
Кроме того, у некоторых людей в списке рассылки music-dsp ( music.columbia.edu/cmc/music-dsp ) могут быть другие предложения.
Бьорн Рош
0

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

Натан Дэй
источник
0

Я думаю, что рекомендации Бьорна очень хороши, но я хочу предоставить дополнительную информацию. Из вашего описания это звучит как проблема идентификации тембра. В этой области проводятся некоторые исследования в области компьютерной музыки (определение различных инструментов - полезная вещь, которую можно сделать, а различие между щелчком и хлопком - из-за тембра звука). Уильям Брентпровел некоторые исследования в этой области (ищите timbreID на его странице) и создал программное обеспечение для использования в Pure Data. В каждой ситуации вы ищете конкретные события, поэтому было бы неплохо выполнить некоторую автоматическую сегментацию по обнаружению начала. Поскольку вы уже принимаете STFT, для определения начала не потребуется слишком много дополнительной работы (посмотрите на обнаружение начала Spectral Flux). Схема системы может быть такой:

Подготовка

  • Определите соответствующие характеристики (например, скорость пересечения нуля, спектральный центроид, MFCC)
  • Обнаружить начало
  • Рассчитайте эти функции на входе аудио (ваши записи жестов)
  • Держите базу данных расчетов функций. Вам нужно будет определить, является ли это контролируемой или неконтролируемой тренировочной ситуацией. Например, пользователи заранее указывают, что оснастка - это «звук 1», а хлопок - «звук 2», или ваша система пытается кластеризовать их после тренировки.

классификация

  • Обнаружение начала в режиме реального времени и вычисление функций на входящем аудио
  • Используйте метрику расстояния (евклидово расстояние или другое расстояние Lp), чтобы выполнить классификацию ближайшего соседа или K-ближайшего соседа, чтобы определить «самый близкий» звук из вашей базы данных.

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

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

greatscott
источник
Я бы обнаружил начало, обнаружив внезапные изменения во входящих аудиоданных. Это должно работать. Я нахожусь на обнаружении начала и конца жестов, которые будут сохранены.
bad_keypoints
Да, это должно в основном работать. Единственная причина, по которой я предложил Spectral Flux, заключается в том, что вы все равно будете принимать STFT. Если вы ожидаете довольно тихую обстановку, то пороговое значение базовой амплитуды должно работать достаточно хорошо.
greatscott