NotShazam - Algoritmo de Shazam reimplementado en Go
(github.com/cgzirim)- SeekTune es un proyecto que implementa el algoritmo de reconocimiento de canciones de Shazam e integra las API de Spotify y YouTube para permitir buscar y descargar canciones
- Para ejecutarlo se requieren Golang, FFmpeg, NPM y YT-DLP; el servidor y el cliente pueden correr con Docker Compose o en un entorno nativo
- La integración con Spotify se configura definiendo el Client ID y el Client Secret de una app de desarrollador en
server/.env; la app obtiene y cachea automáticamente los tokens de acceso necesarios - La base de datos predeterminada es SQLite; si se especifica
DB_TYPE=mongomediante una variable de entorno, se puede usar MongoDB, y si no hay usuario ni contraseña se conecta amongodb://localhost:27017 - La CLI permite descargar enlaces de Spotify, guardar audio local, buscar coincidencias de archivos grabados y borrar huellas digitales y canciones; los elementos guardados sin ID de YouTube no se muestran como resultados de coincidencia en el frontend
Descripción general del proyecto
- SeekTune es una aplicación que implementa el algoritmo de reconocimiento de canciones de Shazam
- La implementación se basa en los materiales de la sección de recursos del README
- Integra las API de Spotify y YouTube para poder buscar y descargar canciones
- Se proporcionan enlaces a una demo y al proceso de creación
Instalación y formas de ejecución
-
Las herramientas necesarias son Golang, FFmpeg, NPM y YT-DLP
-
El comando para clonar el repositorio es el siguiente
git clone https://github.com/cgzirim/seek-tune.git cd seek-tune -
Configuración de la API de Spotify
- Hay que crear una app de Spotify y obtener el Client ID y el Client Secret
- Crear un archivo
.enven el directorioservery configurar los siguientes valores
SPOTIFY_CLIENT_ID=your-client-id SPOTIFY_CLIENT_SECRET=your-client-secret- La app obtiene y cachea automáticamente los tokens de acceso necesarios
-
Ejecución con Docker
- Se requieren Docker y Docker Compose
- La compilación y la ejecución se realizan con el siguiente comando
docker-compose up --build- Después de iniciarse, la app queda accesible en
http://localhost:8080 - Para detenerla, usar el siguiente comando
docker-compose down -
Ejecución nativa
- Instalación de dependencias del backend
cd server go get ./...- Instalación de dependencias del cliente
cd client npm install
Uso de la CLI
- La app cliente se ejecuta desde el directorio
clientnpm start - El backend se ejecuta en una terminal aparte
cd server go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)] - Se pueden descargar canciones mediante enlaces de Spotify
go run *.go download <https://open.spotify.com/.../...>- Los enlaces copiados desde la app móvil de Spotify no funcionan
- Se pueden usar enlaces copiados desde la app de escritorio o la web
- Se pueden guardar en la base de datos archivos de canciones locales o directorios, y se admiten todos los formatos de audio
go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>-fo--forceguarda la canción aunque no pueda encontrar un ID de YouTube- Si no hay ID de YouTube, el frontend no muestra la coincidencia
- Se pueden buscar coincidencias de canciones o archivos grabados
go run *.go find <path-to-wav-file> - Permite borrar huellas digitales y canciones
go run *.go erase go run *.go erase db go run *.go erase all- El valor predeterminado borra solo la base de datos
erase allborra tanto la base de datos como los archivos de canciones
- Si
*.gono funciona, se puede usar./...
Salida de ejemplo
- El ejemplo de descarga obtiene primero la información de la pista de Spotify, luego descarga la pista y guarda las huellas digitales
$ go run *.go download https://open.spotify.com/track/4pqwGuGu34g8KtfN8LDGZm/… Getting track info... Now, downloading track... Fingerprints saved in MongoDB successfully 'Voilà' by 'André Rieu' was downloaded Total tracks downloaded: 1 - El ejemplo de coincidencia muestra las 20 mejores coincidencias y la predicción final para
Voilà - André Rieu.wav- El resultado principal es
Voilà by André Rieuy su puntuación es5390686.00 - El tiempo de búsqueda se muestra como
856.386557ms - La predicción final también se muestra como
Voilà by André Rieu
- El resultado principal es
Selección de base de datos
- La base de datos predeterminada es SQLite
- Para usar MongoDB, instalar MongoDB y configurar las variables de entorno de conexión
DB_TYPE: configurar en"mongo"para usar MongoDBDB_USER: nombre de usuario de MongoDBDB_PASS: contraseña de MongoDBDB_NAME: nombre de la base de datos MongoDB a usarDB_HOST: nombre de host o dirección IP del servidor MongoDBDB_PORT: número de puerto del servidor MongoDB
- La URI de conexión a la base de datos se construye a partir de las variables de entorno
- Si no hay
DB_USERoDB_PASS, por defecto se conecta amongodb://localhost:27017
Recursos y licencia
- How does Shazam work - Coding Geek: recurso principal
- Song recognition using audio fingerprinting
- How does Shazam work - Toptal
- Creating Shazam in Java
- El proyecto se distribuye bajo la MIT License
1 comentarios
Opiniones de Hacker News
Parte de la tecnología de Shazam salió de CCRMA, en el campus de Stanford, un lugar especial que también está profundamente conectado con la historia temprana de la computación.
Es interesante que una cantidad inusualmente grande de aplicaciones de las primeras tecnologías informáticas haya estado relacionada con el audio. La caja musical de John Bardeen, los audífonos como primera aplicación comercial del transistor, los osciladores de audio que se hacían en el garaje de HP en Palo Alto, el iPhone que siguió al iPod, Internet construido sobre cables de cobre que transportaban líneas telefónicas analógicas, y hasta Bell Labs: los ejemplos siguen.
Quizá también suene bastante atractiva la hipótesis de que los humanos primero aprenden a manejar el rango de kHz y luego pasan al rango de MHz/GHz.
Las señales de audio pueden convertirse en señales eléctricas con relativa facilidad, pero con los gráficos todo es mucho más complejo, empezando por hacer que se vean en una pantalla. Un altavoz que convierte señales eléctricas en ondas sonoras también es, si miras solo su estructura central, un dispositivo muy simple.
Además, el audio causa una fuerte impresión en las personas, así que si quisiera mostrar el poder de la electrónica o de las computadoras, yo también habría elegido el audio.
Si esto es una reproducción real de Shazam, podría estar bajo una patente de Apple al menos hasta marzo de 2025: https://patents.google.com/patent/US7627477
Esa patente se presentó en EE. UU. el 2004-10-21. No soy experto legal, pero en Estados Unidos esto parece que podría ser una base en contra de esa patente.
Probablemente la captura del PDF en Google Drive que aparece en el artículo original era ese material.
Eso sí, para que este método funcione necesitas firmas de toda la música del planeta ;)
La charla que dio Avery Wang, cofundador de Shazam, en DAFx17 estuvo buena.
Trata un poco la base teórica del algoritmo y también revisa problemas reales como el ruido de fondo: https://www.youtube.com/watch?v=YVTnj3OIhwI
Últimamente siento que la precisión de Shazam bajó, y que SoundHound incluso da mejores resultados.
En Shazam me aparecen muchos resultados que pertenecen a tradiciones musicales asiáticas, lo cual en sí está bien, pero el problema es que son canciones equivocadas. Si ampliaron el rango de música candidata, parece que también deberían mejorar el algoritmo, y ahora da la sensación de que hay más colisiones en la tabla hash.
Referencia: https://github.com/cgzirim/not-shazam/…
La conclusión fue que BeatFind y Shazam conocían la mayor cantidad de canciones, pero también se complementaban entre sí, y todos los servicios tenían al menos una canción que solo ellos reconocían.
En la prueba mezclé canciones de varios géneros y niveles de reconocimiento, aunque habría sido mejor tener una muestra más grande. Tampoco probé ruido como voces humanas ni música filtrada escuchada a través de una pared.
Curiosamente, “Night Driver” aparecía como “1 Shazams”, así que probablemente fui la primera persona en shazamearla, y aunque todos saben a dónde están llevando a los hobbits en “THEY'RE TAKING THE HOBBITS TO ISENGARD!”, ninguno de los servicios pudo reconocerla.
El proyecto parece fácil de usar y modificar, pero personalmente creo que todavía es un poco pronto para publicarlo
Las instrucciones de ejecución parecen imprecisas, y aunque requiere MongoDB, falta explicar cómo conectarlo y usarlo. Si es posible, sería mejor hacer que la DB sea reemplazable y ofrecer una opción más ligera, como sqlite
Si no se puede reemplazar MongoDB, deberían ofrecer Dockerfile y docker compose para que sea fácil ejecutarlo y probarlo. En el
npm installdel cliente aparecen 8 vulnerabilidades críticas; aunque quizá no sean un problema real, da cierta duda seguir probandoAunque no te preocupen las patentes o los derechos de autor, convendría cambiar el nombre. Como GitHub está en EE. UU., si llega una DMCA pueden bajar el proyecto
Por último, también estaría bueno tener una función para agregar canciones desde archivos WAV. No todo el audio que quiero probar está en Spotify o YouTube
No lo digo para desanimar; cuando faltan estos pequeños detalles de acabado, es fácil que la gente ignore el proyecto o lo valore menos. Si tengo tiempo quizá envíe un PR, y como quiero experimentar con coincidencia de audio en áreas fuera de la música, este proyecto parece el más fácil de modificar
Voy a priorizar mejorar la guía de configuración, agregar una DB basada en archivos para dar más flexibilidad y resolver las vulnerabilidades de
npm. La idea de generar huellas directamente desde archivos WAV también es buena, así que la revisaré con prioridadTambién entiendo el riesgo legal del nombre del proyecto y planeo cambiarlo. Si tienen buenas sugerencias de nombres, me gustaría recibirlas
Todavía no revisé el repositorio en detalle, pero me da curiosidad saber de dónde vienen los datos sobre los que se busca
Quiero saber si carga una biblioteca, o si busca en alguna biblioteca grande obtenida de algún lado
Tenía en mi lista de cosas por hacer antes de morir algo así que siempre quise construir; está realmente genial
Sería bastante bueno si hubiera una forma de compartir las huellas de manera basada en la comunidad
Según recuerdo, BitTorrent usa una tabla hash distribuida, pero el hash se calcula sobre el contenido completo, así que no sirve mucho para encontrar el original de obras derivadas con atribución desordenada
Para encontrar originales de imágenes, Tineye a veces sirve
Si ingresas canciones de Spotify, ¿no sería más natural devolver también canciones de Spotify como resultado?
Los teléfonos de Google tienen una función integrada de reconocimiento de música, y escuché que es la mejor implementada en este campo
Me pregunto si alguien sabe qué enfoque usa. Por otro lado, siempre sentí que SoundHound era mejor que Shazam
Así el teléfono no tenía que estar siempre activo, y a partir de ahí probablemente podía usar cualquier algoritmo de detección existente. Para mí, esa etapa de consumo ultrabajo parecía magia, pero nunca leí los detalles