Pregunta Cómo detectar el BPM de una canción en php [cerrado]


¿Cómo se puede determinar el tempo / BPM de una canción mediante programación? ¿Qué algoritmos se usan comúnmente y qué consideraciones se deben tomar?


76
2018-03-18 05:32


origen


Respuestas:


Esto es difícil de explicar en una sola publicación de StackOverflow. En general, los algoritmos de detección de tiempos más simples funcionan al ubicar los picos en la energía del sonido, que es fácil de detectar. Los métodos más sofisticados usan filtros de peine y otros métodos estadísticos / forma de onda. Para una explicación detallada que incluye muestras de código, verifique este artículo de GameDev fuera.


42
2018-03-18 05:38



Las palabras clave para buscar son "Detección de ritmo", "Seguimiento de ritmo" y "Recuperación de información de música". Hay mucha información aquí: http://www.music-ir.org/

Hay un (quizás) concurso anual llamado MIREX en el que se prueban diferentes algoritmos en su rendimiento de detección de tiempos.

http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/

Eso debería darle una lista de algoritmos para probar.

Un algoritmo clásico es Beatroot (google it), que es agradable y fácil de entender. Funciona así:

  1. Corto tiempo FFT la música para obtener un sonograma.
  2. Suma el aumenta en magnitud sobre todas las frecuencias para cada paso de tiempo (ignore las disminuciones). Esto le proporciona una función 1D variable en el tiempo llamada "flujo espectral".
  3. Encuentra los picos usando cualquier algoritmo de detección de picos antiguo. Estos se llaman "inicios" y corresponden al inicio de los sonidos en la música (inicio de notas, éxitos de batería, etc.).
  4. Construya un histograma de intervalos entre sesiones (IOI). Esto se puede usar para encontrar tempos probables.
  5. Inicialice un conjunto de "agentes" o "hipótesis" para el resultado del seguimiento de tiempos. Alimente a estos agentes los inicios uno a la vez en orden. Cada agente rastrea la lista de inicios que también son tiempos, y la estimación de tempo actual. Los agentes pueden aceptar los inicios, si encajan estrechamente con su último ritmo y tempo seguido, ignorarlos si son muy diferentes, o generar un nuevo agente si están en el medio. No todos los tiempos requieren un comienzo: los agentes pueden interpolar.
  6. A cada agente se le asigna un puntaje según cuán clara sea su hipótesis: si todos sus tiempos de compás son fuertes, obtiene una puntuación más alta. Si todos son regulares, obtiene una puntuación más alta.
  7. El agente que puntúa más alto es la respuesta.

Desventajas de este algoritmo en mi experiencia:

  • La detección de picos es más bien ad-hoc y sensible a los parámetros de umbral y otras cosas.
  • Algo de música no tiene inicios obvios en los beats. Obviamente no funcionará con esos.
  • Es difícil saber cómo resolver el problema de 60bpm-vs-120bpm, ¡especialmente con el seguimiento en vivo!
  • Tira a un mucho de información usando solo un flujo espectral 1D. Creo que puedes hacer mucho mejor teniendo unos pocos flujos espectrales de banda limitada (y tal vez uno de banda ancha para los tambores).

aquí es una demostración de una versión en vivo de este algoritmo, que muestra el flujo espectral (línea negra en la parte inferior) y los inicios (círculos verdes). Vale la pena considerar el hecho de que el ritmo se extrae de solamente los círculos verdes He reproducido los inicios solo como clics, y para ser sincero, no creo poder escuchar el ritmo de ellos, por lo que de alguna manera este algoritmo es mejor que las personas en la detección de latidos. Creo que la reducción a una señal de tan baja dimensión es su paso débil.

Curiosamente encontré un sitio muy bueno con muchos algoritmos y códigos para la detección de latidos hace unos años. Sin embargo, no lo pude volver a encontrar.

Editar: ¡Lo encontré!

Aquí hay algunos excelentes enlaces que deberían ayudarlo a comenzar:

http://marsyasweb.appspot.com/

http://www.vamp-plugins.org/download.html


30
2018-03-27 15:30



La extracción de latidos implica la identificación de estructuras métricas cognitivas en la música. Muy a menudo, estos no corresponden a la energía del sonido físico; por ejemplo, en la mayoría de la música hay un nivel de síncopa, lo que significa que el ritmo de "pisada" que percibimos no se corresponde con la presencia de un sonido físico. Esto significa que este es un campo bastante diferente a detección de inicio, que es la detección de los sonidos físicos, y se realiza de una manera diferente.

Podrías probar el Aubio biblioteca, que es una biblioteca simple de C que ofrece herramientas de extracción tanto de inicio como de latido.

También está el en línea Echonest API, aunque esto implica subir un MP3 a un sitio web y recuperar XML, por lo que podría no ser tan adecuado.

EDITAR: Me encontré con esta última noche, una biblioteca C / C ++ de aspecto muy prometedor, aunque no la he usado yo misma. Complementos de Vamp


22
2018-03-18 07:56



El área general de investigación que le interesa se llama MUSIC INFORMATION RETRIEVAL 

Hay muchos algoritmos diferentes que hacen esto, pero todos se centran fundamentalmente en la DETECCIÓN DE ONSET.

La detección de inicio mide el inicio de un evento, el evento en este caso es una nota que se está reproduciendo. Puede buscar cambios en la transformada de Fourier ponderada (contenido de alta frecuencia) puede buscar grandes cambios en el contenido espectral. (Diferencia espectral). (hay un par de documentos que le recomiendo que busque más abajo). Una vez que aplica un algoritmo de detección de inicio, elige dónde están los latidos mediante el umbral.

Hay varios algoritmos que puede usar una vez que haya obtenido esa localización de tiempo del ritmo. Puedes convertirlo en un tren de pulsos (crea una señal que sea cero para todo el tiempo y 1 solo cuando ocurra tu ritmo) luego aplica una FFT a eso y BAM ahora tienes una frecuencia de inicios en el pico más grande.

Aquí hay algunos documentos que lo guiarán en la dirección correcta:

http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

Aquí hay una extensión de lo que algunas personas están discutiendo:

Alguien mencionó observar la aplicación de un algoritmo de aprendizaje automático: básicamente recopilar una serie de características de las funciones de detección de inicio (mencionadas anteriormente) y combinarlas con la señal en bruto en una red neuronal / regresión logística y aprender qué es lo que hace latir un latido.

mira al Dr. Andrew Ng, tiene conferencias gratuitas de aprendizaje automático de la Universidad de Stanford en línea (no las conferencias de video prolongadas, en realidad hay un curso a distancia en línea)


9
2018-03-13 20:43



Si puede gestionar la interfaz con el código python en su proyecto, Echo Nest Remix API es una API bastante astuta para python:

Hay un método analysis.tempo que te dará el BPM. Puede hacer mucho más que simples BPM, como se puede ver en los documentos API o esta tutorial


9
2018-03-18 06:18



Realice un Transformada de Fouriery encuentra picos en el espectro de potencia. Está buscando picos por debajo del límite de 20 Hz para el oído humano. Supongo que típicamente en el rango de 0.1-5ish Hz es generoso.

ASI pregunta que podría ayudar: Biblioteca de detección de audio Bpm

Además, esta es una de varias preguntas de "búsqueda de picos" en SO: Detección máxima de señal medida


Editar: No es que yo haga procesamiento de audio. Es solo una suposición basada en el hecho de que estás buscando una propiedad de dominio de frecuencia del archivo ...


otra edición: Vale la pena señalar que los formatos de compresión con pérdida como mp3 almacenan datos de dominio de Fourier en lugar de datos de dominio de tiempo en primer lugar. Con un poco de astucia, puede ahorrarse algunos cálculos pesados ​​... pero vea el comentario reflexivo de cobbal.


7
2018-03-18 05:37



La detección precisa de BPM es muy difícil. Ver esta pregunta stackoverflowy mi respuesta a eso


2
2018-03-18 09:55