3 puntos por GN⁺ 2024-08-02 | 1 comentarios | Compartir por WhatsApp
  • 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=mongo mediante una variable de entorno, se puede usar MongoDB, y si no hay usuario ni contraseña se conecta a mongodb://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 .env en el directorio server y 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 client
    npm 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>
    
    • -f o --force guarda 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 all borra tanto la base de datos como los archivos de canciones
  • Si *.go no 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é Rieu y su puntuación es 5390686.00
    • El tiempo de búsqueda se muestra como 856.386557ms
    • La predicción final también se muestra como Voilà by André Rieu

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 MongoDB
    • DB_USER: nombre de usuario de MongoDB
    • DB_PASS: contraseña de MongoDB
    • DB_NAME: nombre de la base de datos MongoDB a usar
    • DB_HOST: nombre de host o dirección IP del servidor MongoDB
    • DB_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_USER o DB_PASS, por defecto se conecta a mongodb://localhost:27017

Recursos y licencia

1 comentarios

 
GN⁺ 2024-08-02
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.

    • Creo que es porque el audio es relativamente fácil de manipular electrónicamente.
      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.
    • Me parece una interpretación demasiado forzada.
  • 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

    • El paper de Shazam que describe el algoritmo, “An Industrial-Strength Audio Search Algorithm”(https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf), no tiene una fecha de publicación clara, pero según https://www.researchgate.net/publication/220723446_An_Industrial_Strength_Audio_Search_Algorithm parece ser un paper de 2003.
      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.
    • Recuerdo que hace unos 10 años en HN Shazam amenazó legalmente la publicación del algoritmo, y por eso se bajó un post popular o su código fuente.
      Probablemente la captura del PDF en Google Drive que aparece en el artículo original era ese material.
    • La idea central es crear una huella simple a partir de la transformada rápida de Fourier de la señal de audio, y luego hacer una indexación simple y una búsqueda de similitud simple.
      Eso sí, para que este método funcione necesitas firmas de toda la música del planeta ;)
    • Entonces significa que sería difícil hacerla cumplir fuera de Estados Unidos.
    • O sea que hay que clonar el repositorio ahora.
  • 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

    • Esto va a mi lista para ver. Cuando leí este paper fue una de las primeras veces que tuve un momento de wow con algoritmos de computación.
  • Ú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/…

    • SoundHound siempre fue mejor que Shazam. También detecta canciones cantadas por una persona o temas muy silenciosos.
    • En agosto de 2021 comparé las bibliotecas de reconocimiento musical de Shazam, SoundHound y BeatFind.
      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 install del cliente aparecen 8 vulnerabilidades críticas; aunque quizá no sean un problema real, da cierta duda seguir probando
    Aunque 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

    • Coincido en que al proyecto le hace falta más trabajo de acabado
      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 prioridad
      También entiendo el riesgo legal del nombre del proyecto y planeo cambiarlo. Si tienen buenas sugerencias de nombres, me gustaría recibirlas
    • Para recibir feedback tan valioso como este es que lo publico en HN. Buen resumen
  • 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

    • Los datos vienen de una base de datos de huellas conectada al servidor. Cada vez que se agrega una canción, se generan esas huellas
  • Tenía en mi lista de cosas por hacer antes de morir algo así que siempre quise construir; está realmente genial

    • Me alegra que te haya inspirado. Puedes clonarlo y llevarlo más lejos
  • Sería bastante bueno si hubiera una forma de compartir las huellas de manera basada en la comunidad

    • Me gustaría que existiera algo así no solo para audio, sino también para imágenes y clips de video
      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
    • Parece que MusicBrainz soporta esto: https://musicbrainz.org/doc/AcoustID
  • Si ingresas canciones de Spotify, ¿no sería más natural devolver también canciones de Spotify como resultado?

    • En realidad, sí. Pero Spotify no permite descargas directas, así que tuve que buscar y descargar las canciones desde YouTube
  • 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

    • Según recuerdo, había un pequeño algoritmo o pieza de hardware que solo se activaba cuando había música sonando
      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