NotShazam - Algoritmo do Shazam reimplementado em Go
(github.com/cgzirim)- 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=mongonas variáveis de ambiente, é possível usar MongoDB, e, se não houver usuário e senha, a conexão será feita commongodb://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
.envno diretórioservere 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- Após iniciar, o app fica acessível em
http://localhost:8080 - Para parar, use o seguinte comando
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
clientnpm 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>-fou--forcesalva 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 allexclui tanto o banco de dados quanto os arquivos de músicas
- Se
*.gonã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ção5390686.00 - O tempo de busca é exibido como
856.386557ms - A previsão final também é exibida como
Voilà by André Rieu
- O principal resultado é
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 MongoDBDB_USER: nome de usuário do MongoDBDB_PASS: senha do MongoDBDB_NAME: nome do banco de dados MongoDB a ser usadoDB_HOST: hostname ou endereço IP do servidor MongoDBDB_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_USERouDB_PASSnão existirem, por padrão a conexão será feita commongodb://localhost:27017
Referências e licença
- How does Shazam work - Coding Geek: recurso principal
- Song recognition using audio fingerprinting
- How does Shazam work - Toptal
- Creating Shazam in Java
- O projeto é distribuído sob a MIT License
1 comentários
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
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
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
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
Acho que o print do PDF no Google Drive citado no texto original era esse material
Só que, para esse método funcionar, é preciso ter assinaturas de todas as músicas da Terra ;)
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
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/…
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 installdo cliente aparecem 8 vulnerabilidades críticas; mesmo que talvez não sejam um problema real, isso deixa a gente hesitante em continuar testandoMesmo 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
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 prioridadeTambém entendo o risco jurídico do nome do projeto e pretendo mudá-lo. Aceito sugestões de bons nomes
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
Eu tinha isso na minha bucket list de coisas que queria muito criar; ficou muito legal
Seria bem interessante se houvesse uma forma de compartilhar fingerprints de maneira baseada na comunidade
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
Se você insere músicas do Spotify, não seria mais natural devolver os resultados também como músicas do Spotify?
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
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