Arquivo

Archive for the ‘SongID’ Category

Chromagram

Método para obtenção de caracteristicas em um sinal de audio,  robusto e atualmente utilizado em reconhecimento de acordes músicais, reconhecimento de covers e para encontrar similaridade em pedaços de áudios.

Enquanto um spectrograma é capaz de nos mostrar a variação da intensidade, magnitude de um sinal para cada frequencia no decorrer do tempo, o Chromagrama consegue nos informar a distribuição da energia representados por 12 possíveis notas chamadas de escala cromática, comumente  classificados como “c, c#, d, d#, e, f, f#, g, g#, a, a#, b”.

Para conseguir esta informação teremos que reestruturar nosso espectrograma.

Antes de qualquer coisa teremos que efetuar o resample ou downsample do Sinal de áudio, fiz alguns testes usando resample ou seja convertendo qualquer sample rate para 11025 Hz, achei  este processo um pouco lento e então decidi fazer o downsample usando “Decimation” que de quebra já me faz um filtro por Low-pass e anti-aliasing, como o nome já sugere o downsample a grosso modo “joga fora” algumas amostras do sinal, o decimation trabalha usando um fator inteiro, portanto se meu sinal original possui  44100 Hz de sample rate e se preciso que este sinal vá para 11025 Hz de sample rate terei que ter um Fator=4 ou seja 44100/4 = 11025.

Após estes passos poderei  adquirir o espectrograma aplicando 2048 frames, para computar o chromograma precisarei converter o spectrograma  de domínio da freqüência para pitch do domínio, isto é feito aplicando Logarithmic Frequency assim poderemos mapear os 12 elementos de interesse.

E finalmente teremos nosso chromagrama com 12 posições, uma para cada nota no decorrer do tempo…

Escrevi algo conceitual em python deixei o código o mais limpo possível para melhor entendimento, estou plotando os resultados com o matplotlib, importante dizer que o matplotlib não aguenta plotar arrays muito grandes portanto para os meus testes utilizei arquivos de audios pequenos em torno de 30 segundos, seguindo esta linha recortei 28 segundos iniciais da música “Def Leppard – Animal”, e ai esta o resultado do Script.

Image

Source em:

https://github.com/ederwander/Chromagram/blob/master/Chromagram.py

Audio FingerPrint em Python

Audio  Fingerprint é o ato de reconhecer um determinado audio dentro de um amplo número de sons…

Este conceito é utilizado pelo Shazam, que tem o poder de lhe retornar o nome de uma música com uma pequena amostra a partir de qualquer pedaço de uma canção.

Ao ler um post escrito por Roy Van Rijn  decidi tentar escrever algo semelhante seguindo todos os passos descrito em seu blog.

Aproveitei um pedaço de um projeto antigo  esteganografia-spectrograma-em-arquivos-de-audio reescrevi minha função para visualizar spectrogramas para melhor se adaptar ao novo código, para testar o novo spectrograma peguei dois arquivos fract.mp3 e mandel.mp3 eles podem ser encontrados neste site.

Primeiro converti os dois arquivos em .WAV os deixando em Mono, o mpg123 me ajudou neste trabalho de coversão!

E aqui esta os resultados do meu Spectrograma:

Para o Mandel.wav


E agora o fract.wav

Legal minha função para mostrar o Spectograma funciona perfeitamente!

Vamos agora para o próximo passo descrito por Roy Van Rijn, encontrar as maiores frequencias dentro de cada tempo de uma música.

Com esta etapa concluida eu consigo montar uma “Constelation Map” contendo os maiores pontos (frequencias) dentro de um spectrograma, para demonstrar eu plotei o resultado da música inteira “Rihanna feat David Guetta – Whos That Chick(Radio Edit)”

Resultado mostrando a “Constelation Map” para a música Rihanna feat David Guetta – Whos That Chick(Radio Edit):

Todos os pontos em vermelho são onde encontrei as maiores frequencias correspondentes a cada tempo dentro da canção!

O proximo passo é indexar estes valores dentro de um arquivo .txt por exemplo!

Em meu arquivo .txt tenho:

[142, 393, 578, 1802]
[71, 378, 400, 1725]
[52, 204, 406, 753]
[51, 205, 425, 773]
[137, 392, 697, 833]
[140, 201, 660, 773]
[53, 300, 666, 776]
[51, 342, 497, 701]
[50, 200, 414, 731]
[57, 367, 697, 833]
[85, 223, 690, 783]
[55, 234, 697, 845]
[50, 204, 403, 773]
[121, 238, 571, 714]
[52, 370, 544, 721]
[132, 325, 463, 794]
[164, 226, 515, 712]

.

.

.

Indexei cerca de 1000 canções eu precisei converter todas para .wav sempre em mono!

Lol após isso é importante colocar todos estes valores dentro de uma grande hash table para uma melhor performace.

E vamos ao grande teste pegar um pedaço de qualquer canção indexada e ver se conseguimos o retorno correto !

Vamos tentar 18 segundos de áudio bem sujo e ver o resultado!

Primeiro tentei este pedaço Chick_noise2.wav

Ual funciona !

O som está bem degradado e sujo, decidi pegar um som gravado do microfone de meu smart phone quando estava dentro de um shopping escutando um som ambiente, ajustei para obter os acertos comparando menos frequencias pois o áudio estava deplorável a gravação é esta Clipe som 03.wav

Resultado:

Funcionou !

Vamos tentar outra música também gravada do microphone de meu smart phone dentro do shopping Clipe som 06.wav

Resultado:

Funcionou novamente!

Estas demonstrações são de arquivos com áudio bem degradados e sujos, podemos perceber que em todas elas temos um grande nível de ruido e mesmo assim funciona!

Um agradecimento especial ao Roy que postou em seu blog todos os passos para este feito!

Eng Eder de Souza