Reconociendo el tono del audio.

Tengo una guitarra y necesito mi PC para poder decir qué nota se está tocando, reconociendo el tono. ¿Es posible hacerlo en python, también es posible con pygame? Ser capaz de hacerlo en pygame sería muy útil.

Para reconocer la frecuencia de una señal de audio, debe utilizar el algoritmo FFT ( transformada rápida de Fourier ). Por lo que puedo decir, PyGame no tiene medios para grabar audio, ni es compatible con la transformación FFT.

Primero, necesita capturar los datos muestreados en bruto de la tarjeta de sonido; Este tipo de datos se llama PCM (Modulación de código de pulsos). La forma más sencilla de capturar audio en Python es usar la biblioteca de PyAudio (enlaces de Python a PortAudio). GStreamer también puede hacerlo, probablemente sea una exageración para tus propósitos. Capturar muestras de 16 bits a una frecuencia de 48000 Hz es bastante típico y probablemente lo mejor que una tarjeta de sonido normal le dará.

Una vez que tenga datos de audio PCM sin procesar, puede usar el módulo fftpack de la biblioteca scipy para ejecutar las muestras a través de la transformación FFT. Esto le dará una distribución de frecuencia de la señal de audio analizada, es decir, qué tan fuerte es la señal en ciertas bandas de frecuencia. Entonces, es una cuestión de encontrar la frecuencia que tenga la señal más fuerte.

Es posible que necesite un filtro adicional para evitar las frecuencias armónicas. No estoy seguro.

Una vez escribí una utilidad que hace exactamente eso: analiza qué sonidos se están reproduciendo.

Puede ver el código aquí (o puede descargar el proyecto completo. Está integrado con Frets On Fire, un clon de código abierto de héroe de la guitarra para crear un verdadero héroe de la guitarra). Fue probado usando una guitarra, una armónica y silbidos 🙂 El código es feo, pero funciona 🙂

Utilicé pymedia para grabar, y scipy para la FFT.

Excepto por lo básico que otros ya mencionaron, puedo darte algunos consejos:

  1. Si grabas desde el micrófono, hay mucho ruido. Tendrá que usar una gran cantidad de prueba y error para establecer umbrales y métodos de limpieza de sonido para que funcione. Una posible solución es usar una guitarra eléctrica y conectar su salida a la entrada de audio. Esto funcionó mejor para mí.
  2. Específicamente, hay mucho ruido alrededor de 50Hz. Eso no es tan malo, pero sus armónicos (ver más abajo) están a 100 Hz y 150 Hz, y eso está cerca de G2 y D3 de la guitarra … Como dije, mi solución fue cambiar a una guitarra eléctrica.
  3. Hay una compensación entre la velocidad de detección y la precisión. Cuantas más muestras tome, más tiempo le llevará detectar sonidos, pero será más preciso al detectar el tono exacto. Si realmente quiere hacer un proyecto a partir de esto, probablemente necesite usar varias escalas de tiempo.
  4. Cuando se toca un tono, tiene sobretonos . A veces, después de unos segundos, los armónicos pueden ser incluso más poderosos que el tono base. Si no lidias con esto, tu progtwig cree que escuchó E2 durante unos segundos y luego E3. Para superar esto, utilicé una lista de los sonidos que se reproducían actualmente, y luego, mientras esta nota, o uno de sus connotaciones tuvieran energía, asumí que se estaba reproduciendo la misma nota …
  5. Es especialmente difícil de detectar cuando alguien toca la misma nota 2 (o más) veces seguidas, porque es difícil distinguir entre eso y las fluctuaciones aleatorias del nivel de sonido. Verás en mi código que tuve que usar una constante que tenía que configurarse para que coincidiera con la guitarra utilizada (al parecer, cada guitarra tiene su propio patrón de fluctuaciones de potencia).

Necesitará utilizar una biblioteca de audio como el audioop incorporado .

El análisis de la nota específica que se está reproduciendo no es trivial, pero se puede hacer usando esas API.

También podría ser de uso: http://wiki.python.org/moin/PythonInMusic

Preguntas muy similares:

  • Procesamiento de audio – Reconocimiento de tono
  • Detección de tono en tiempo real
  • Detección de tono en tiempo real mediante FFT

Convertir el sonido en una secuencia de notas no es algo fácil de hacer, especialmente con varias notas a la vez. Lea los resultados de Google para “estimación de frecuencia” y “reconocimiento de notas”.

Tengo algunos ejemplos de estimación de frecuencia de Python , pero esto es solo una parte de lo que necesitas resolver para obtener notas de las grabaciones de guitarra.

Este enlace muestra cómo lo hace alguien en VB.NET, pero los conceptos básicos de lo que debe hacerse para lograr su objective se describen en estos enlaces a continuación.

  • STFT
  • Colley Tukey
  • FFT