3 pontos por GN⁺ 2024-08-02 | 1 comentários | Compartilhar no WhatsApp
  • SeekTune é um projeto que implementa o algoritmo de reconhecimento de músicas do Shazam, integrando as APIs do Spotify e do YouTube para permitir encontrar e baixar músicas
  • Para executar, são necessários Golang, FFmpeg, NPM e YT-DLP; é possível rodar o servidor e o cliente com Docker Compose ou em um ambiente nativo
  • A integração com o Spotify é feita configurando o Client ID e o Client Secret do app de desenvolvedor em server/.env; o app obtém e armazena em cache automaticamente os tokens de acesso necessários
  • O banco de dados padrão é SQLite; ao definir DB_TYPE=mongo nas variáveis de ambiente, é possível usar MongoDB, e, se não houver usuário e senha, a conexão será feita com mongodb://localhost:27017
  • A CLI oferece suporte a download por links do Spotify, salvamento de áudio local, correspondência de arquivos gravados e exclusão de fingerprints e músicas; itens salvos sem YouTube ID não aparecem como resultados de correspondência no frontend

Visão geral do projeto

  • SeekTune é uma aplicação que implementa o algoritmo de reconhecimento de músicas do Shazam
  • A implementação é baseada nos materiais da seção de recursos do README
  • Integra as APIs do Spotify e do YouTube para encontrar e baixar músicas
  • São fornecidos links para uma demonstração e para o processo de criação

Instalação e formas de execução

  • As ferramentas necessárias são Golang, FFmpeg, NPM e YT-DLP

  • O comando para clonar o repositório é o seguinte

    git clone https://github.com/cgzirim/seek-tune.git
    cd seek-tune
    
  • Configuração da API do Spotify

    • É necessário criar um app no Spotify e obter o Client ID e o Client Secret
    • Crie um arquivo .env no diretório server e configure os seguintes valores
    SPOTIFY_CLIENT_ID=your-client-id
    SPOTIFY_CLIENT_SECRET=your-client-secret
    
    • O app obtém e armazena em cache automaticamente os tokens de acesso necessários
  • Execução com Docker

    • Docker e Docker Compose são necessários
    • O build e a execução são feitos com o seguinte comando
    docker-compose up --build
    
    docker-compose down
    
  • Execução nativa

    • Instalar dependências do backend
    cd server
    go get ./...
    
    • Instalar dependências do cliente
    cd client
    npm install
    

Uso da CLI

  • O app cliente é executado no diretório client
    npm start
    
  • O backend é executado em um terminal separado
    cd server
    go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)]
    
  • É possível baixar músicas por links do Spotify
    go run *.go download <https://open.spotify.com/.../...>;
    
    • Links copiados do app móvel do Spotify não funcionam
    • É possível usar links copiados do app desktop ou da versão web
  • É possível salvar no banco de dados um arquivo de música local ou um diretório, com suporte a todos os formatos de áudio
    go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>
    
    • -f ou --force salva a música mesmo quando não encontra o YouTube ID
    • Sem YouTube ID, o frontend não exibe a correspondência
  • É possível encontrar correspondências para uma música ou arquivo gravado
    go run *.go find <path-to-wav-file>
    
  • Há suporte à exclusão de fingerprints e músicas
    go run *.go erase
    go run *.go erase db
    go run *.go erase all
    
    • O padrão exclui apenas o banco de dados
    • erase all exclui tanto o banco de dados quanto os arquivos de músicas
  • Se *.go não funcionar, é possível usar ./...

Saída de exemplo

  • O exemplo de download obtém informações da faixa do Spotify, baixa a faixa e salva as fingerprints
    $ 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
    
  • O exemplo de correspondência exibe as 20 principais correspondências e a previsão final para Voilà - André Rieu.wav
    • O principal resultado é Voilà by André Rieu, com pontuação 5390686.00
    • O tempo de busca é exibido como 856.386557ms
    • A previsão final também é exibida como Voilà by André Rieu

Seleção do banco de dados

  • O banco de dados padrão é SQLite
  • Para usar MongoDB, instale o MongoDB e configure as variáveis de ambiente de conexão
    • DB_TYPE: definir como "mongo" para usar MongoDB
    • DB_USER: nome de usuário do MongoDB
    • DB_PASS: senha do MongoDB
    • DB_NAME: nome do banco de dados MongoDB a ser usado
    • DB_HOST: hostname ou endereço IP do servidor MongoDB
    • DB_PORT: número da porta do servidor MongoDB
  • A URI de conexão do banco de dados é composta a partir das variáveis de ambiente
  • Se DB_USER ou DB_PASS não existirem, por padrão a conexão será feita com mongodb://localhost:27017

Referências e licença

1 comentários

 
GN⁺ 2024-08-02
Opiniões no Hacker News
  • Parte da tecnologia do Shazam veio do CCRMA, no campus de Stanford, um lugar especial também profundamente ligado ao início da história da computação
    É interessante como um número incomum de aplicações das primeiras tecnologias de computação estava relacionado a áudio. A caixinha de música de John Bardeen, os aparelhos auditivos que foram a primeira aplicação comercial do transistor, os osciladores de áudio feitos na garagem da HP em Palo Alto, o iPhone que veio na esteira do iPod, a internet construída sobre fios de cobre que carregavam linhas telefônicas analógicas, até o Bell Labs — os exemplos continuam
    Talvez seja bem atraente a hipótese de que os humanos primeiro aprendem a lidar com a faixa de kHz e depois avançam para as faixas de MHz/GHz

    • Acho que isso acontece porque áudio é relativamente fácil de manipular eletronicamente
      Sinais de áudio podem ser convertidos em sinais elétricos com relativa facilidade, mas gráficos são muito mais complexos já a partir de fazê-los aparecer em uma tela. Um alto-falante, que converte sinais elétricos em ondas sonoras, também é um dispositivo muito simples se olharmos apenas para sua estrutura essencial
      Além disso, áudio causa uma forte impressão nas pessoas; então, se eu quisesse demonstrar o poder da eletrônica ou dos computadores, também escolheria áudio
    • Parece uma interpretação forçada demais
  • Se isto for uma reprodução real do Shazam, pode estar sob patente da Apple pelo menos até março de 2025: https://patents.google.com/patent/US7627477

    • O artigo que descreve o algoritmo do Shazam, “An Industrial-Strength Audio Search Algorithm”(https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf), não tem uma data clara de publicação, mas, olhando https://www.researchgate.net/publication/220723446_An_Industrial_Strength_Audio_Search_Algorithm, parece ser um artigo de 2003
      Essa patente foi depositada nos EUA em 2004-10-21. Não sou especialista jurídico, mas isso parece poder servir como argumento contra essa patente nos EUA
    • Lembro que, cerca de 10 anos atrás, no HN, o Shazam ameaçou legalmente a divulgação do algoritmo, e um post popular ou o código-fonte acabou saindo do ar
      Acho que o print do PDF no Google Drive citado no texto original era esse material
    • O ponto central é criar uma impressão digital simples a partir da transformada rápida de Fourier do sinal de áudio e fazer uma indexação simples com uma busca simples por similaridade
      Só que, para esse método funcionar, é preciso ter assinaturas de todas as músicas da Terra ;)
    • Então isso significa que seria difícil fazer valer fora dos EUA
    • Ou seja, a mensagem é clonar o repositório agora
  • A palestra do cofundador do Shazam, Avery Wang, na DAFx17 foi boa
    Ela aborda um pouco a base teórica do algoritmo e também examina problemas práticos, como ruído de fundo: https://www.youtube.com/watch?v=YVTnj3OIhwI

    • Vou adicionar isto à minha lista para assistir. Quando li esse artigo, foi uma das primeiras vezes em que tive aquele momento de uau com algoritmos de computação
  • Parece que a precisão do Shazam caiu recentemente, e o SoundHound na verdade dá resultados melhores
    No Shazam aparecem muitos resultados pertencentes a tradições musicais asiáticas, o que por si só é bom, mas o problema é que são músicas erradas. Se eles ampliaram o conjunto de músicas candidatas, acho que também precisam melhorar o algoritmo; agora dá a sensação de haver mais colisões na tabela hash
    Referência: https://github.com/cgzirim/not-shazam/…

    • O SoundHound sempre foi melhor que o Shazam. Ele identifica até músicas cantadas por uma pessoa ou faixas bem baixas
    • Em agosto de 2021, comparei as bibliotecas de reconhecimento musical do Shazam, SoundHound e BeatFind
      A conclusão foi que BeatFind e Shazam conheciam o maior número de músicas, mas também havia aspectos complementares entre eles, e todos os serviços tinham pelo menos uma música que só eles reconheceram
      No teste, misturei músicas de vários gêneros e níveis de notoriedade, mas teria sido melhor se a amostra fosse maior. Também não testei ruídos como fala humana nem música filtrada vindo através de uma parede
      Curiosamente, “Night Driver” aparecia como “1 Shazams”, então provavelmente fui a primeira pessoa a usar o Shazam nela; e “THEY'RE TAKING THE HOBBITS TO ISENGARD!” — todo mundo sabe para onde estão levando os hobbits, mas nenhum dos serviços conseguiu reconhecê-la
  • Embora o projeto pareça bom de usar e modificar, pessoalmente acho que ainda é um pouco cedo para publicá-lo
    As instruções de execução parecem imprecisas, e o MongoDB é necessário, mas falta explicar como conectar e usar. Se possível, seria melhor tornar o DB substituível e oferecer uma opção menos pesada, como sqlite
    Se não for possível substituir o MongoDB, deveria fornecer um Dockerfile e docker compose para facilitar a execução e os testes. No npm install do cliente aparecem 8 vulnerabilidades críticas; mesmo que talvez não sejam um problema real, isso deixa a gente hesitante em continuar testando
    Mesmo sem se preocupar com patentes ou direitos autorais, seria melhor mudar o nome. Como o próprio GitHub fica nos EUA, se chegar um DMCA o projeto pode ser derrubado
    Por fim, seria bom ter também um recurso para adicionar músicas a partir de arquivos WAV. Nem todo áudio que quero testar está no Spotify ou no YouTube
    Não quero desanimar; é só que, quando faltam esses pequenos acabamentos, fica fácil as pessoas ignorarem ou subestimarem o projeto. Se eu tiver tempo, talvez envie um PR, e quero experimentar matching de áudio em áreas além da música, então este projeto parece o mais fácil de modificar

    • Concordo que o projeto precisa de mais trabalho de acabamento
      Vou melhorar as instruções de configuração e priorizar adicionar um DB baseado em arquivos para dar flexibilidade, além de resolver as vulnerabilidades do npm. A ideia de gerar fingerprints diretamente de arquivos WAV também é boa, então vou olhar isso com prioridade
      Também entendo o risco jurídico do nome do projeto e pretendo mudá-lo. Aceito sugestões de bons nomes
    • É para receber feedback valioso assim que se posta no HN. Ótimo resumo
  • Ainda não olhei o repositório em detalhes, mas fiquei curioso sobre de onde vêm os dados que são pesquisados
    Quero saber se ele carrega uma biblioteca, ou se pesquisa em alguma grande biblioteca obtida de algum lugar

    • Os dados vêm de um banco de dados de fingerprints conectado ao servidor. Essas fingerprints são criadas sempre que uma música é adicionada
  • Eu tinha isso na minha bucket list de coisas que queria muito criar; ficou muito legal

    • Fico feliz que tenha servido de inspiração. Pode clonar e desenvolver ainda mais
  • Seria bem interessante se houvesse uma forma de compartilhar fingerprints de maneira baseada na comunidade

    • Seria bom ter algo assim não só para áudio, mas também para imagens e clipes de vídeo
      Pelo que lembro, o BitTorrent usa uma tabela hash distribuída, mas o hash é do conteúdo inteiro, então não é muito útil para encontrar o original de obras derivadas com atribuição toda bagunçada
      Para encontrar originais de imagens, o Tineye às vezes serve
    • Parece que o MusicBrainz oferece suporte a isso: https://musicbrainz.org/doc/AcoustID
  • Se você insere músicas do Spotify, não seria mais natural devolver os resultados também como músicas do Spotify?

    • Na verdade, é isso mesmo. Só que o Spotify não permite download direto, então foi preciso encontrar e baixar a música pelo YouTube
  • Os telefones do Google têm um recurso embutido de reconhecimento de música, e ouvi dizer que é a implementação mais bem feita nessa área
    Fico curioso se alguém sabe qual abordagem eles usaram. Separadamente, sempre achei o SoundHound melhor que o Shazam

    • Pelo que lembro, havia um pequeno algoritmo ou peça de hardware que só acordava quando havia música tocando
      Assim o celular não precisava ficar sempre ativo, e a partir daí provavelmente dava para usar qualquer algoritmo de detecção existente. Para mim, essa etapa de consumo ultrabaixo parecia mágica, mas nunca li os detalhes