Распознавание звука

У меня есть гитара, и мне нужен мой компьютер, чтобы он мог определить, какая нота играет, распознавая тон. Возможно ли сделать это на python, также возможно с pygame? Быть способным сделать это в Pygame было бы очень полезно.

5 ответов

Решение

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

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

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

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

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

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

Я использовал pymedia для записи и scipy для FFT.

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

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

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

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

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

Вам нужно будет использовать аудио-библиотеку, такую ​​как встроенный аудиопетель.

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

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

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

Другие вопросы по тегам