/ / Gerar curva de volume de mp3 - python, waveform

Gerar curva de volume a partir de mp3 - python, waveform

Eu estou tentando construir algo em python que podeanalise um mp3 enviado e gere os dados necessários para construir um gráfico de forma de onda. Tudo o que eu encontrei é muito mais complexo do que eu preciso. Finalmente, estou tentando construir algo como você vê no SoundCloud.

Eu estive procurando numpy e fft"s, mas tudo parece mais complicado do que eu preciso. Qual é a melhor abordagem para isso? Eu vou construir o gráfico real usando canvas, então não se preocupe com essa parte, eu só preciso dos dados para plotar.

Respostas:

1 para resposta № 1

Um arquivo MP3 é uma versão codificada de uma forma de onda. Antes de poder trabalhar com a forma de onda, você deve primeiro decodificar os dados do MP3 em uma forma de onda PCM. Uma vez que você tenha dados PCM, cada amostra representa a amplitude da forma de onda no ponto no tempo. Se assumirmos que um decodificador de MP3 envia valores assinados de 16 bits, suas amplitudes vão de -16384 a +16383. dividindo cada um por 16384, as amostras de forma de onda variarão entre +/- 1,0.

O problema é realmente um dos decodificadores de MP3 para PCM. Tanto quanto eu sei, não há decodificador de python nativo. Você pode, no entanto, usar o LAME, chamado de python como um subprocesso ou, com um pouco mais de trabalho, fazer a interface da biblioteca LAME diretamente para o Python com algo como SWIG. Não é uma tarefa trivial.

Plotar esses dados torna-se um exercício para o leitor.


1 para resposta № 2

Eu sugiro que você use Pygame, se você não quer lidar com o funcionamento interno do formato de arquivo mp3.

Pygame é uma biblioteca multimídia que pode abrirformatos de arquivos de áudio comuns - incluindo .mp3 e .ogg como objetos "Sound" - se você tiver o Numpy instalado por baixo, pode procurar o som descompactado (e portanto, pós fft transforma), usando a chamada pygame.sndarray.array - que retorna um objeto de matriz numpy com as amostras de som.

Eu encontrei um pequeno truque - seja shure para chamarpygame.mixer.init com os mesmos parâmetros (para freqüência, tamanho de amostra de bit e n.de canais) que seu arquivo .mp3 possui, ou a chamada para sndarray.array pode gerar uma exceção.

Verifique a documentação em http://www.pygame.org/docs/