He estado experimentando algunas semanas para encontrar una manera de combinar / encontrar canciones similares en una biblioteca que contenga diferentes géneros de música.
Mi primer intento fue detectar características como Tempo o la cantidad de graves que hay en las canciones para formar grupos, pero no llegué lejos con este enfoque (detección de ritmos basada en cambios de volumen) ya que no es necesario contar alrededor del 20% de los ritmos de las canciones. siempre, a veces 1/2 o 1/3 de ellos y no pude implementar eso.
Después de algunas semanas de intentos fallidos, tuve una nueva idea que se describe más adelante en esta publicación. En pocas palabras, funciona tomando muestras de archivos de Spectrum, haciendo algo así como un "espectro promedio" de archivos para compararlos. La idea detrás era que, por ejemplo, Hardstyle tiene mucho más bajo que la música rock promedio, también verifiqué esto mirando algunos espectros en Audacity.
- Archivo 1: Tome espectros FFT de archivo completo (2048 Tamaño de muestra atm, Amplitudes Log. Escalado)
- Suma todas las matrices de espectro, toma promedios de cada contenedor
- Haz lo mismo con otros archivos, almacena todos los resultados
- Hacer una lista de las diferencias de valores FFT entre el archivo 1 y otros archivos
- Hacer promedio de las diferencias entre el archivo 1 y el archivo X
- Ordenar ascendente por estos promedios
- Las canciones con el "valor de diferencia" más bajo se consideran similares.
¿Pueden algunos de ustedes que tienen buen conocimiento decirme si esta sería la forma correcta / buena de implementar mi Idea?
Respuestas:
Cientos de investigadores han intentado una y otra vez lo que está tratando de hacer y hay mucho trabajo sobre esto. Consulte las actas de la conferencia ISMIR. Incluso si no está actualizado, lea la tesis de Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf
Para orientarte rápidamente en el camino correcto:
La música puede ser similar según muchas dimensiones: a) timbre / textura / género; b) patrón rítmico; c) melodía / progresión de acordes ... ¡y más! ¡De su mensaje no está claro lo que quiere medir!
Eso es por las características. Ahora tendrá que pensar en una mejor manera de comparar sus canciones una vez que se hayan representado como una secuencia de esas características. Calcular diferencias por pares entre secuencias no es muy inteligente, por ejemplo: ¡comparar una canción y el mismo desplazamiento de la canción con algo de silencio producirá una diferencia mientras sea exactamente la misma! Prefiere comparar la distribución de esas características; por ejemplo, calcule la desviación media / estándar de las características sobre la canción A y la desviación media / estándar de las características sobre la canción B y luego tome una distancia probabilística (KL, Bhattacharyya sobre esas).
Último punto, pero que importará más adelante: calcular la distancia entre una canción y el resto del corpus para encontrar las coincidencias más cercanas es bastante ineficiente. Cuando se trata de grandes colecciones, las técnicas como los árboles LSH o Ball permiten que las consultas de los vecinos más cercanos se realicen sin una comparación explícita con todo el corpus.
Por otro lado, la detección de tempo es un asunto completamente diferente. Si desea analizarlo, el mejor documento de rendimiento / accesibilidad sobre el tema es Ellis 'Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Es increíblemente simple pero está cerca de los algoritmos más modernos.
fuente