Tenho experimentado algumas semanas para encontrar uma maneira de combinar / encontrar músicas semelhantes em uma biblioteca contendo diferentes gêneros de música.
Minha primeira tentativa foi detectar recursos como tempo ou quanto baixo há nas músicas para formar grupos, mas eu não fui muito longe com essa abordagem (detecção de batidas com base em alterações de volume), já que cerca de 20% das músicas batidas não precisam ser contadas sempre, às vezes 1/2 ou 1/3 deles e eu não conseguia implementar isso.
Após algumas semanas de tentativas fracassadas, tive uma nova idéia, descrita mais adiante neste Post. Simplificando, funciona usando amostras de arquivos do Spectrum, criando algo como um "espectro médio" de arquivos para compará-los. A idéia por trás disso era que, por exemplo, o Hardstyle tem muito mais baixo do que o rock médio, eu também verifiquei isso observando alguns Spectrums no Audacity.
- Arquivo 1: Obtenha espectros completos de FFT de arquivo (tamanho da amostra de 2048 atm, log de amplitudes dimensionado)
- Soma todas as matrizes de espectro, faça a média de cada bin
- Faça o mesmo em alguns outros arquivos, armazene todos os resultados
- Criar lista de diferenças de valores FFT entre o arquivo 1 e outros arquivos
- Faça a média das diferenças entre o arquivo 1 e o arquivo X
- Classificar em ordem crescente por essas médias
- Músicas com o "menor valor de diferença" são consideradas semelhantes.
Alguns de vocês, com bom conhecimento, podem me dizer se essa seria a maneira correta / boa de implementar minha idéia?
Respostas:
O que você está tentando fazer foi repetidamente tentado por centenas de pesquisadores e existe um grande corpo de trabalho sobre isso. Verifique os trabalhos da conferência ISMIR. Mesmo que não esteja atualizado, leia a tese de Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf
Para orientá-lo rapidamente no caminho certo:
A música pode ser semelhante de acordo com várias dimensões: a) timbre / textura / gênero; b) padrão rítmico; c) progressão da melodia / acordes ... e muito mais! Na sua mensagem, não está claro o que você deseja medir!
Isso é para os recursos. Agora você terá que pensar em uma maneira melhor de comparar suas músicas depois que elas forem representadas como uma sequência desses recursos. O cálculo das diferenças entre pares entre as seqüências não é muito inteligente - por exemplo: comparar uma música e a mesma música compensada por algum silêncio produzirá uma diferença enquanto é exatamente a mesma! Você prefere comparar a distribuição desses recursos; por exemplo, calcule o desvio médio / padrão dos recursos em relação à música A e o desvio médio / padrão dos recursos em relação à música B e, em seguida, faça uma distância probabilística (KL, Bhattacharyya sobre esses).
Último ponto, mas que será importante mais tarde: calcular a distância entre uma música e o resto do corpus para encontrar as correspondências mais próximas é bastante ineficiente. Ao lidar com grandes coleções, técnicas como LSH ou árvores Ball permitem que essas consultas de vizinhos mais próximos sejam realizadas sem comparação explícita com todo o corpus.
Como um aparte, a detecção do tempo é uma questão totalmente diferente. Se você quiser investigar, o melhor artigo sobre desempenho / acessibilidade sobre o tema é o Ellis 'Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . É incrivelmente simples, mas está próximo dos algoritmos de última geração.
fonte