Распознавание тона аудио

Вы уверены, что ответ корректен? Ошибка анализа, средняя, что существует sth неправильно с данными, являющимися evaluted в строке var t = eval( "(" + request + ")" ) ;

19
задан Gabriele Cirulli 25 November 2009 в 15:19
поделиться

5 ответов

Чтобы распознать частоту звукового сигнала, вы должны использовать алгоритм FFT ( быстрое преобразование Фурье ). Насколько я могу судить, PyGame не имеет средств для записи звука и не поддерживает преобразование FFT.

Во-первых, вам нужно захватить необработанные дискретизированные данные со звуковой карты; этот вид данных называется ИКМ (импульсно-кодовая модуляция). Самый простой способ захвата звука в Python - использовать библиотеку PyAudio (привязка Python к PortAudio). GStreamer тоже может это сделать, это, вероятно, излишек для ваших целей. Захват 16-битных сэмплов с частотой 48000 Гц довольно типичен и, вероятно, лучшее, что дает вам обычная звуковая карта.

Если у вас есть необработанные аудиоданные PCM, вы можете использовать модуль fftpack из библиотеки scipy , чтобы прогнать образцы через преобразование БПФ. Это даст вам частотное распределение анализируемого аудиосигнала, то есть насколько сильным является сигнал в определенных частотных диапазонах. Затем нужно найти частоту с наиболее сильным сигналом.

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

19
ответ дан 30 November 2019 в 03:20
поделиться

Вам понадобится аудио библиотека, такая как встроенный audioop .

Анализ конкретной воспроизводимой ноты нетривиально, но может быть выполнен с помощью эти API.

Также можно использовать: http://wiki.python.org/moin/PythonInMusic

1
ответ дан 30 November 2019 в 03:20
поделиться

Эта ссылка показывает, что кто-то делает это в VB.NET, но основы того, что нужно сделать для достижения вашей цели, отражены в этих ссылках ниже.

0
ответ дан 30 November 2019 в 03:20
поделиться

Однажды я написал утилиту, которая делает именно это - анализирует, какие звуки воспроизводятся.

Вы можете посмотреть код здесь (или вы можете загрузить весь проект. Он интегрирован с Frets On Fire, клоном гитарного героя с открытым исходным кодом для создания настоящего гитарного героя). Он был протестирован с использованием гитары, губной гармошки и свистков :) Код уродливый, но он работает :)

Я использовал pymedia для записи и scipy для БПФ.

За исключением основ, которые другие уже отметили, Я могу дать вам несколько советов:

  1. Если вы записываете с микрофона, будет много шума. Вам придется использовать много проб и ошибок, чтобы установить пороги и методы очистки звука, чтобы заставить его работать. Одно из возможных решений - использовать электрогитару и подключить ее выход к аудиовходу. Это сработало для меня лучше всего.
  2. В частности, в районе 50 Гц много шума. Это не так уж и плохо, но его обертоны (см. Ниже) находятся на частотах 100 Гц и 150 Гц, и это близко к гитарным G2 и D3 .... Как я уже сказал, моим решением было переключиться на электрогитару.
  3. Есть компромисс между скоростью обнаружения и точностью. Чем больше сэмплов вы возьмете, тем больше времени у вас уйдет на обнаружение звуков, но вы сможете более точно определять высоту звука. Если вы действительно хотите сделать из этого проект, вам, вероятно, потребуется использовать несколько шкал времени.
  4. Когда воспроизводится тон, он имеет обертонов . Иногда через несколько секунд обертоны могут быть даже более мощными, чем основной тон. Если вы не справитесь с этим, ваша программа будет думать, что слышала E2 на несколько секунд, а затем E3. Чтобы преодолеть это, я использовал список воспроизводимых в данный момент звуков, а затем, пока эта нота или один из ее обертонов содержали в себе энергию, я предполагал, что это та же самая нота, которая воспроизводится ....
  5. Особенно трудно определить, когда кто-то играет ту же ноту 2 (или более) раз подряд, потому что это сложно отличить от случайных колебаний уровня звука. В моем коде вы увидите, что мне пришлось использовать константу, которую нужно было настроить в соответствии с используемой гитарой (очевидно, каждая гитара имеет свой собственный образец колебаний мощности).
19
ответ дан 30 November 2019 в 03:20
поделиться

Очень похожие вопросы:

Преобразование звука в последовательность нот - непростая задача, особенно с несколькими нотами одновременно. Прочтите результаты Google для "оценки частоты" и "распознавания заметок".

У меня есть несколько примеров оценки частоты Python , но это лишь часть того, что вам нужно решить, чтобы получить ноты из гитарных записей.

1
ответ дан 30 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: