Cómo funciona Shazam (2022)
(cameronmacleod.com)- Shazam encuentra una canción con solo unos segundos de grabación de micrófono creando una huella digital de audio (fingerprint) y buscándola en una base de datos, en lugar de comparar todo el audio completo
- Comparar la forma de onda desplazándola tal cual no es realista a escala de 10 millones de canciones, ni funciona bien por el ruido del micrófono, los cambios de volumen y los efectos de frecuencia
- El flujo clave consiste en convertir el audio en un spectrogram, encontrar los picos de frecuencia intensos y luego guardar pares de picos como hashes para compararlos rápidamente
- Los picos tienden a mantenerse relativamente bien incluso con ruido y reducen la cantidad de datos almacenados, pero deben distribuirse de manera uniforme en tiempo y frecuencia para poder reconocer cualquier parte de una canción
- En la etapa de reconocimiento, las diferencias Track time - Sample time de los hashes coincidentes se agrupan en un histograma, y se elige como respuesta la canción que más se concentra en un mismo bin
El problema que Shazam tiene que resolver
- Shazam es una app que graba durante unos segundos una canción que está sonando alrededor y luego la busca en una base de datos para mostrar el resultado
- Antes de convertirse en app, Shazam era un servicio basado en número telefónico
- El usuario llamaba a un número y tenía que acercar el micrófono del celular hacia la música
- Después de 30 segundos, Shazam cortaba la llamada y enviaba por SMS la información de la canción que había escuchado
- En 2002, la calidad de las llamadas móviles hacía todavía más difícil el reconocimiento de canciones
- En un ejemplo pequeño, se podría mover poco a poco un fragmento de audio sobre toda la pista para comprobar si coincide
- Pero si se busca en una base de datos de 10 millones de canciones sin saber de cuál se trata, el tiempo aumenta muchísimo
- Las muestras reales tomadas por micrófono pueden cambiar su forma de onda por ruido de fondo, efectos de frecuencia y variaciones de volumen, así que una comparación simple por desplazamiento no encaja bien
Flujo general del sistema
- El método de Shazam se divide en los flujos de register y recognise
- register es el flujo para guardar canciones y poder encontrarlas después
- recognise es el flujo para identificar a qué canción pertenece un fragmento corto de audio
- Ambos flujos pasan por la misma etapa de preprocesamiento
- cálculo del spectrogram del audio
- búsqueda de los picos de frecuencia más intensos dentro del spectrogram
- generación de hashes agrupando esos picos en pares
- El flujo de register guarda en la base de datos los hashes calculados
- El flujo de recognise compara los hashes creados a partir de un audio nuevo con los hashes de la base de datos para identificar la canción en la etapa de matching
Cálculo del spectrogram
- La transformada de Fourier indica qué frecuencias contiene un audio
- Si se aplica la transformada de Fourier a una onda seno de 20Hz, aparece un gran spike cerca de 20Hz
- Como una onda seno contiene una sola frecuencia, también se le llama pure tone
- El resultado de la transformada de Fourier es el frequency spectrum
- La representación centrada en el eje del tiempo es el time domain
- La representación centrada en el eje de frecuencia es el frequency domain
- El eje Y del frequency spectrum muestra la intensidad de cada componente de frecuencia, y los componentes más intensos se oyen con más claridad en la señal del time domain
- Si se suman varias ondas seno, sus componentes de frecuencia se combinan
- Si a una onda seno de 20Hz se le suma una onda seno de 50Hz con la mitad de intensidad, aparecen un spike de 20Hz y otro más pequeño de 50Hz
- Todas las señales de audio pueden reconstruirse a partir de este tipo de ondas
- El frequency domain revela información que no se ve con claridad en el time domain
- Aunque se agregue ruido y cambie la forma en el time domain, en el frequency domain los spikes principales de frecuencia pueden seguir viéndose claramente
- Si se aplica una sola vez la transformada de Fourier a toda la canción, solo se ve la intensidad total de las frecuencias, pero en una canción real las frecuencias cambian con el tiempo
- Si se divide la canción en pequeños segmentos, se aplica la transformada de Fourier a cada uno y luego se combinan, se obtiene un spectrogram
- El spectrogram representa al mismo tiempo tiempo, frecuencia e intensidad, y la intensidad puede mostrarse con colores
- En el spectrogram del ejemplo, “Like a Stone”, los puntos más brillantes, es decir, la mayoría de las frecuencias intensas, aparecen por debajo de 5000Hz
- Esta distribución es común en la música, y la mayor parte del rango de frecuencias del piano está entre 27Hz y 4186Hz
Fingerprint basado en picos
- La huella digital de audio comienza encontrando picos en el spectrogram
- Un pico es el componente de frecuencia más grande en un instante específico
- En música, un sonido fuerte como el de un solo de guitarra puede convertirse en el pico de ese momento
- Los picos son relativamente menos sensibles al ruido
- Para que el ruido vuelva irreconocible un pico, tendría que ser más grande que ese pico
- Un pico del spectrogram es uno de los componentes de frecuencia más intensos de la pista
- Si se guardan solo los picos, se reduce la cantidad de datos necesaria para el fingerprint
- En lugar de guardar toda la información de frecuencia, se conservan solo los componentes de frecuencia más intensos
- Al reducir los datos a buscar, la búsqueda del fingerprint se vuelve más rápida
- Los picos deben distribuirse de forma uniforme tanto en tiempo como en frecuencia
- Si se concentran solo en una parte del tiempo, no se podrán reconocer muestras de otras secciones de la canción
- Si se concentran en una banda de frecuencia estrecha, un ruido fuerte en esa banda, como una bocina de auto, puede cambiar la selección de picos y dificultar el reconocimiento de esa sección
Encontrar picos con maximum filter
- Para encontrar picos de manera uniforme, se puede usar la técnica de procesamiento de imágenes maximum filter
- maximum filter busca el valor máximo dentro del vecindario alrededor de cada pixel y cambia ese pixel por el valor de ese máximo local
- El ejemplo usa una región de 3x3 alrededor de cada pixel
- Este proceso expande los picos locales hacia el área vecina
- El spectrogram al que se le aplica maximum filter se ve como una versión de baja resolución del spectrogram original
- Esto pasa porque los picos de la señal se expanden y ocupan otros pixeles
- Los cuadros del mismo color corresponden a un mismo pico local de la imagen original
- maximum filter tiene como parámetro el tamaño de la caja usada para encontrar máximos locales
- Si se usa una caja pequeña, aparecen más picos
- Si se usa una caja grande, aparecen menos picos
- La posición de los picos se recupera encontrando los puntos donde el valor del spectrogram original y el del spectrogram filtrado son iguales
- Los puntos que no son picos cambian al valor del pico local y por eso ya no coinciden
- Solo los puntos cuyo valor se mantiene igual son picos
- Si se dibujan todos los picos juntos, se obtiene un constellation map
- Recibe ese nombre porque parece una imagen del cielo nocturno
- La cantidad de picos afecta directamente el tamaño del fingerprint
- Si hay que almacenar millones de canciones, es importante mantener pequeño el fingerprint
- Si se reducen los picos, también baja la precisión y disminuyen las posibilidades de hacer matching correcto con la muestra
- Hay dos formas de reducir la cantidad de picos
- usar los N picos principales, donde N debe ser proporcional a la duración del audio para que las canciones cortas no queden sobrerrepresentadas
- usar todos los picos por encima de cierto threshold, lo que no garantiza un tamaño de fingerprint por hora, pero puede ser más preciso
Convertir pares de picos en hashes
- Si el fingerprint fuera solo un conjunto de picos individuales del spectrogram, la redundancia crecería muy rápido
- Si la frecuencia de cada pico se representa con 10 bits, se pueden representar 2^10=1024 frecuencias individuales
- Si hay miles de puntos por pista, habrá muchas repeticiones
- La unicidad del fingerprint es importante
- Cuanto mayor sea la unicidad, más rápida será la búsqueda
- También ayuda a reconocer más canciones
- El método de Shazam crea hashes usando pares de picos, no picos individuales
- El hash incluye las frecuencias fA, fB de los dos picos y la diferencia de tiempo ΔT entre ellos
- Si cada pico tiene información de frecuencia de 10 bits y ΔT también se representa con 10 bits, en total hay 30 bits de información
- 2^30=1,073,741,824 posibilidades son muchísimo más que las 1024 de un punto individual
- Para generar los pares se usan un anchor point y una target zone
- Se elige un punto como anchor point
- Se calcula la target zone del spectrogram con respecto a ese anchor point
- Se crean pares entre el anchor point y todos los puntos dentro de la target zone
- El paper de Shazam no explica en detalle cómo se elige la target zone
- En la imagen del paper, la target zone empieza un poco después en el tiempo que el anchor point y está centrada alrededor de la frecuencia del anchor point
- Los pares generados se guardan en la base de datos como hashes
- Los componentes del hash son fA, fB y ΔT
- Como información adicional se guardan el tiempo del Point A y el Track ID
- El tiempo del Point A y el Track ID luego se usan en el matching para encontrar un momento específico de una canción específica
- El conjunto de todos los hashes de una pista forma el fingerprint de esa pista
Método de matching
- El flujo de recognise crea un fingerprint a partir de la muestra y lo compara con los fingerprints ya almacenados en la base de datos
- El algoritmo de matching avanza en cuatro pasos
- trae de la base de datos todos los hashes que coinciden con el fingerprint de la muestra
- agrupa los hashes por canción
- para cada canción, verifica si los hashes se alinean en el tiempo
- elige la pista con la mayor cantidad de hashes alineados
- abracadabra no busca directamente la 3-tupla (fA, fB, ΔT), sino que la guarda como un valor único devuelto por
hash(fA, fB, ΔT)- En vez de buscar tres valores por cada hash, puede buscar uno solo
- Cada hash de la base de datos está asociado a un Track ID, así que se pueden agrupar por canción
- Después de agruparlos así, se puede asignar una puntuación a cada pista candidata
- Si la muestra coincide con una canción, los hashes de la muestra deberían alinearse bien con una sección de la canción original
- El ruido puede crear picos que parezcan venir de otros momentos dentro de la muestra
- También puede pasar que un hash coincida con la canción equivocada
- La alineación se comprueba calculando el valor Track time - Sample time para cada hash coincidente
- Los hashes que realmente coinciden comparten la misma diferencia
- En el ejemplo, las filas con diferencia 10 son el true match, y las demás diferencias son false match
- Luego se construye un histograma con esos valores de diferencia y se usa el bin más grande como score de la canción
- En una canción que no hace buen match, todos los bins tienen valores bajos
- En una buena coincidencia, aparece un gran spike en un solo bin
- La razón por la que no se elige simplemente la canción con más hashes coincidentes es el sesgo por longitud de la canción
- Las canciones largas tienen más probabilidad de acumular más matches que las cortas
- En Spotify incluso hay pistas de más de 4 horas, así que el resultado podría sesgarse mucho
abracadabra y materiales de referencia
- abracadabra es un proyecto open source que implementa el método del paper de Shazam
- Permite seguir en código Python el proceso de spectrogram, búsqueda de picos, hashing y matching
- También puede usarse como library en otros proyectos
- Implementaciones y materiales relacionados
- abracadabra docs: documentación de abracadabra
- dejavu: otra implementación de reconocimiento de canciones escrita en Python
- Computer Vision for Music Identification: enfoque de reconocimiento de canciones similar al de dejavu
- Chromaprint: algoritmo que usa un enfoque algo distinto
- Musicbrainz: explicación de audio fingerprint en la enciclopedia open source de información musical
- Playing with Shazam fingerprints: experiencia de haber implementado el algoritmo de Shazam en 2009
- Alignment of videos of same event using audio fingerprinting: ejemplo de uso de audio fingerprint más allá de la música, para alinear videos del mismo evento
1 comentarios
Opiniones en Hacker News
The Wall Street Journal tiene un video muy bien hecho que explica Shazam
https://www.wsj.com/video/series/in-depth-features/how-shaza...
Chris, cofundador de Shazam
Lawn Love alquiló la suite del piso de arriba entre 2014 y 2018, y los desarrolladores de la app móvil de Shazam en esa oficina se mantuvieron discretos incluso después de la adquisición; nunca oímos ningún festejo con champaña
Cuando Shazam salió en 2008, el enfoque basado en hashes fue una elección inteligente
Yo habría empezado por crear una forma de convertir cada canción en hashes de la manera más eficiente posible en términos de cómputo
Si se lanzara hoy, la línea básica de I+D probablemente habría sido entrenar un modelo, lo cual podría haber sido mucho menos eficiente y más caro de hospedar
Aunque es un problema en el que uno siente que un modelo podría hacerlo bien, dado que el número de canciones es finito, es muy probable que el método de hashes tenga mucho mejor rendimiento
La estructura consiste en encontrar cuántos hashes, de las decenas o como mucho unos pocos cientos bajos obtenidos de una muestra corta, coinciden y si lo hacen de forma más o menos continua
Aun hoy no creo que lo harían con entrenamiento de modelos, porque todos los días se agregan enormes cantidades de canciones nuevas y habría que reentrenar continuamente
Los hashes siguen pareciendo un mejor enfoque no solo por eficiencia, sino también en términos de robustez general
Luego se podía buscar una canción como se busca una palabra en un diccionario, y espero que esta idea no desaparezca fácilmente
[1]: https://en.wikipedia.org/wiki/Parsons_code
La primera app para celular fue en 2006 para BREW
2008 fue simplemente cuando Apple lanzó la App Store; antes de eso, terceros no podían crear apps para iPhone
Ambos son excelentes soluciones de indexación y compresión; solo cambia la escala de los datos
Quizá haya alguna forma de crear un modelo de embeddings que permita calcular un vector de embedding para cada canción nueva sin un reentrenamiento completo
Shazam es uno de esos raros productos que, en 20 años, no ha perdido esa sensación de magia
Está realmente cerca de lo que los tecnólogos deberían aspirar a construir
A diferencia de funciones que por fuera parecen similares, como el reconocimiento de imágenes de animales u objetos, pero que en su mayoría se acercan a una extraña magia de machine learning, esto encaja en un dominio poco común pero comprensible
Recuerdo que en un iPhone de la generación anterior ni siquiera cargaba a tiempo, así que terminé borrándola
La función Now Playing detecta canciones continuamente y las deja en el historial, y en Google Assistant incluso se puede buscar una canción solo tarareándola
No funciona de manera confiable, pero a veces acierta exactamente
Intenté encontrar una canción que alguien estaba cantando en America’s Got Talent y me sorprendió que el resultado volviera con ese cantante de AGT
Me pregunté si también indexan programas de televisión
Pero uno se pregunta qué harían los product managers si no siguieran arruinando el producto para conseguir bonos y vacaciones
También existe Chromaprint, que funciona de una forma un poco distinta
Se basa en patrones de cambio de tono, no en los máximos del espectro
Chromaprint se usa en AcoustID, una gran base de datos pública que vincula huellas de audio con grabaciones de MusicBrainz
Sorprende que contenga una cantidad enorme de música aun sin tanto respaldo comercial como Shazam
[1]: https://oxygene.sk/2011/01/how-does-chromaprint-work/
Es bueno para detectar duplicados, pero el diseño de huellas de Shazam permite hacer coincidir un fragmento corto con una canción completa
Es un artículo excelente que capta muy bien qué hace un espectrograma, y casi imprescindible para quien quiera entender cómo funciona la extracción de huellas de audio
También hay algoritmos aproximados similares en otros medios, así que vale la pena estudiar este artículo con calma para entender el hashing en el mundo real
Lo que hizo Shazam fue hashear de manera combinatoria para reducir los falsos positivos
Hay un sitio excelente que trata con matching algorítmico no canciones, sino clasificación de géneros y las ramificaciones de subgéneros que generan las firmas de canciones nuevas.
Es un recurso increíble mantenido como proyecto personal paralelo, pero parece estar en riesgo de desaparecer por motivos como problemas de hosting.
Antes existían Music DNA de Pandora o funciones similares de LastFM, pero este sitio es como una red visual de conexiones de toda la música creada por la humanidad hasta 2023, así que si desaparece sería una pérdida para toda la web.
Every Noise At Once
https://everynoise.com
Every Noise at Once - https://news.ycombinator.com/item?id=26668426 - abril de 2021, 94 comentarios
Every Noise at Once - https://news.ycombinator.com/item?id=20585447 - agosto de 2019, 82 comentarios
Every Noise at Once – an algorithmically-generated scatter-plot of musical genre - https://news.ycombinator.com/item?id=10269685 - septiembre de 2015, 23 comentarios
An algorithmically-generated scatter-plot of musical genres - with samples - https://news.ycombinator.com/item?id=9315499 - abril de 2015, 3 comentarios
Cuando estaba en Spotify era investigador de géneros.
Muestra canciones similares y creo que lo hace bastante bien.
Es sorprendente lo intuitivo que es este método y lo bien que encaja con nuestro propio proceso de percepción.
A grandes rasgos, identifica fragmentos de melodía y luego intenta alinearlos en orden.
Es parecido a cómo podemos reconocer algo con solo escuchar 5, 7 o 10 notas.
Creo haber leído también sobre otros métodos de extracción de huellas de canciones que dependen de cosas como picos de volumen; aunque esos métodos puedan funcionar igual de bien, no se parecen en nada a lo que hace nuestro cerebro.
Este método es bastante genial porque no se apoya en un “subproducto artificial”, sino que básicamente funciona de una manera similar a la nuestra.
Técnicamente no siempre es una melodía, pero probablemente en la mayoría de los casos sí lo sea.
Me da curiosidad cómo maneja Shazam los casos en que el eje temporal no es lineal o no es constante.
Por ejemplo, cintas, wow and flutter, o situaciones en las que algo se acelera y desacelera constantemente.
Hasta donde sé, la extracción de huellas es muy sensible al tiempo, y cortarla en fragmentos de unos 50 ms no lo resuelve por completo.
La última vez que lo vi, la técnica general para este tipo de problema, Dynamic Time Warping, tenía un costo computacional demasiado alto.
Son artículos relacionados. Si hay más, me interesa conocerlos.
How Shazam Works (2003 Paper) - https://news.ycombinator.com/item?id=33299853 - octubre de 2022, 1 comentario
Creating Shazam in Java (2010) - https://news.ycombinator.com/item?id=32530056 - agosto de 2022, 36 comentarios
Shazam turns 20 - https://news.ycombinator.com/item?id=32520593 - agosto de 2022, 227 comentarios
How Shazam Works (2015) - https://news.ycombinator.com/item?id=23806142 - julio de 2020, 7 comentarios
Designing an audio adblocker - https://news.ycombinator.com/item?id=18855029 - enero de 2019, 186 comentarios
Show HN: A radio/podcast adblocker featuring ML and Shazam-like fingerprinting - https://news.ycombinator.com/item?id=18459058 - noviembre de 2018, 2 comentarios
Show HN: Shazam-like acoustic fingerprinting of continuous audio streams - https://news.ycombinator.com/item?id=15809291 - noviembre de 2017, 76 comentarios
How Shazam Works (2015) - https://news.ycombinator.com/item?id=15350729 - septiembre de 2017, 13 comentarios
Tell HN: Shazam picks up song from my kitchen light - https://news.ycombinator.com/item?id=11593305 - abril de 2016, 2 comentarios
How Shazam works - https://news.ycombinator.com/item?id=9870408 - julio de 2015, 48 comentarios
Patent infringement claim re: “Creating Shazam in Java” blogpost (2010) - https://news.ycombinator.com/item?id=9594480 - mayo de 2015, 18 comentarios
The Shazam Effect (2014) - https://news.ycombinator.com/item?id=9593429 - mayo de 2015, 37 comentarios
The Shazam Effect - https://news.ycombinator.com/item?id=8634357 - noviembre de 2014, 34 comentarios
Ask HN: Is there an audio search technology that finds exact and similar audio? - https://news.ycombinator.com/item?id=8420141 - octubre de 2014, 3 comentarios
Source code example of the Shazam algorithm - https://news.ycombinator.com/item?id=5724422 - mayo de 2013, 16 comentarios
Creating Shazam in Java - https://news.ycombinator.com/item?id=5723863 - mayo de 2013, 43 comentarios
An Industrial-Strength Audio Search Algorithm (Shazam) - https://news.ycombinator.com/item?id=2621103 - junio de 2011, 4 comentarios
Shazam's Search for Songs Creates New Music Jobs - https://news.ycombinator.com/item?id=2215295 - febrero de 2011, 1 comentario
How does the music-identifying app Shazam work its magic? - https://news.ycombinator.com/item?id=2214992 - febrero de 2011, 2 comentarios
Implementing Shazam with Java in a weekend - https://news.ycombinator.com/item?id=1702975 - septiembre de 2010, 23 comentarios
Shazam: not magic after all - https://news.ycombinator.com/item?id=909263 - octubre de 2009, 28 comentarios
How does the music-identifying app Shazam work its magic? - https://news.ycombinator.com/item?id=893353 - octubre de 2009, 16 comentarios