2009-11-25 21 views
17

Tengo una guitarra y necesito que mi pc pueda saber qué nota se está reproduciendo, reconociendo el tono. ¿Es posible hacerlo en python, también es posible con pygame? Ser capaz de hacerlo en pygame sería muy útil.Reconociendo el tono del audio

+0

¿Va a conectar su computadora directamente a la computadora o depender del micrófono de la computadora? – theycallmemorty

+1

desde el micrófono –

Respuesta

18

Reconocer la frecuencia de una señal de audio, se utiliza la FFT (fast Fourier transform) algoritmo. Por lo que puedo decir, PyGame no tiene medios para grabar audio, ni admite la transformación FFT.

En primer lugar, debe capturar los datos muestreados sin procesar de la tarjeta de sonido; este tipo de datos se llama PCM (Pulse Code Modulation). La forma más sencilla de capturar audio en Python es usar el PyAudio library (enlaces de Python a PortAudio). GStreamer también puede hacerlo, es probablemente una exageración para sus propósitos. La captura de muestras de 16 bits a una velocidad de 48000 Hz es bastante típica y probablemente sea la mejor que una tarjeta de sonido normal le dará.

Una vez que tiene datos de audio PCM en bruto, puede usar el módulo fftpack del scipy library 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 cuestión de encontrar la frecuencia que tiene la señal más fuerte.

Usted podría necesita un poco de filtrado adicional para evitar harmonic frequencies No estoy seguro.

+0

¿Existe una forma estándar para manejar una secuencia de notas? – unutbu

+0

No estoy seguro de lo que está preguntando, ¿puede dar más detalles? – intgr

+0

Si realiza una secuencia de notas FFT, obtendrá información acerca de las frecuencias dominantes, pero perderá información sobre la posición de tiempo de las notas. (¿O estoy equivocado?) Supongo que podrías intentar cortar el audio en bruto para aplicar la FFT a notas individuales, pero averiguar dónde cortar parece difícil. – unutbu

1

Necesitará utilizar una biblioteca de audio como la incorporada audioop.

Analizar la nota específica que se está reproduciendo no es trivial, pero se puede hacer utilizando esas API.

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

+3

El módulo 'audioop' solo puede hacer análisis bastante primitivos y técnicas de compresión. Esto no es en absoluto adecuado para los propósitos del solicitante. El enlace wiki es una larga lista de enlaces que probablemente causa más confusión de la que evita. – intgr

0

Este link muestra que alguien lo hace en VB.NET, pero los conceptos básicos de lo que se debe hacer para lograr su objetivo se capturan en estos enlaces a continuación.

19

una vez me escribió una utilidad que hace exactamente eso - se analiza lo que se está reproduciendo sonidos.

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

Utilicé pymedia para grabar y scipy para la FFT.

A excepción de los conceptos básicos que otros ya se ha señalado, le puedo dar algunos consejos:

  1. Si graba desde un micrófono, hay una gran cantidad de ruido. Tendrá que usar una gran cantidad de prueba y error para establecer los umbrales y los métodos de limpieza del 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 abajo) están en 100 Hz y 150 Hz, y eso está cerca de los G2 y D3 de la guitarra ... Como dije, mi solución fue cambiar a una guitarra eléctrica.
  3. Existe 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 detectar el tono exacto. Si realmente desea hacer un proyecto de esto, probablemente necesite usar varias escalas de tiempo.
  4. Cuando se reproduce un tono, tiene overtones. 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 programa cree que escuchó E2 por unos segundos, y luego E3. Para superar esto, utilicé una lista de sonidos actualmente en reproducción, y luego, siempre y cuando esta nota, o uno de sus sobretonos tuviera energía, supuse que era la misma nota que se estaba reproduciendo ...
  5. Es específicamente difícil para 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).
+7

¿Te importaría subir la fuente de nuevo? Parece que lo tomaron – Sirens

1

preguntas muy similares:

convertir el sonido en una secuencia de notas no es una cosa fácil de hacer, especialmente con varias notas En seguida. Lea los resultados de Google para "estimación de frecuencia" y "reconocimiento de notas".

Tengo algunos Python frequency estimation examples, pero esto es solo una parte de lo que necesita resolver para obtener notas de grabaciones de guitarra.

Cuestiones relacionadas