¿Cómo extraer los datos en bruto de un archivo mp3 usando python?

Tengo tarea con respecto al análisis de datos de audio usando Python. Me pregunto si hay algún buen módulo para usar para extraer los datos en bruto de un archivo mp3. Me refiero a los datos en bruto, no a los metadatos, a las tags id3.

Sé cómo usar el módulo wave para procesar archivos .wav . Puedo readframes para obtener los datos en bruto. Pero no sé cómo hacerlo con mp3. He buscado mucho en google y stackoverflow y encuentro eyeD3 . Pero, desafortunadamente, la documentación es bastante frustrante y ahora la versión es 0.7.1, diferente de la mayoría de los ejemplos que puedo encontrar en Internet.

¿Hay algún buen módulo que pueda extraer datos en bruto de un mp3? Si hay alguna buena documentación para eyeD3 , también es buena.

Si entiendo tu pregunta, puedes intentar usar pydub (una biblioteca que escribí) para obtener los datos de audio así:

 from pydub import AudioSegment sound = AudioSegment.from_mp3("test.mp3") # sound._data is a bytestring raw_data = sound._data 

¿Has intentado abrir el archivo en modo binario de lectura?

 f = open("test.mp3", "rb") first16bytes = f.read(16) etc... 

Hay algunas preguntas similares que flotan alrededor de stackoverflow. Hay distintos casos de uso.

  1. El usuario desea convertir archivos .mp3 a archivos PCM, como los archivos .wav.

  2. El usuario desea acceder a los datos sin procesar en el archivo .mp3 (es decir, no tratarlos como PCM comprimidos). Aquí el caso de uso es el de entender cómo funcionan los esquemas de compresión como MP3 y AAC.

Esta respuesta está dirigida a la segunda de ellas, aunque no tengo un código de trabajo para compartir o señalar.

Los esquemas de compresión, como el MP3, generalmente funcionan en el dominio de la frecuencia. Como ejemplo simplificado, puede tomar un archivo .wav de 1024 muestras a la vez, transformar cada bloque de 1024 muestras con una FFT y almacenarlas. En términos generales, la compresión con pérdida luego arroja información del dominio de la frecuencia para permitir codificaciones más pequeñas.

Una implementación de python pura es muy poco práctica si todo lo que quieres hacer es convertir de .mp3 a .wav. Pero si desea explorar cómo funcionan los esquemas .mp3 y relacionados, tener algo con lo que pueda manipular fácilmente, incluso si el código se ejecuta 1000 veces más lento que el que usa ffmpeg, puede ser útil, especialmente si está escrito de una manera que permita lector del código fuente para ver cómo funciona la compresión .mp3. Por ejemplo, consulte http://bugra.github.io/work/notes/2014-07-12/discre-fourier-cosine-transform-dft-dct-image-compression/ para ver un libro de trabajo de IPython que explica cómo se transforma el dominio de la frecuencia Se utilizan en esquemas de compresión de imagen como JPEG. Algo así para la compresión MP3 y similar sería útil para las personas que aprenden sobre la compresión.

Un archivo .mp3 es básicamente una secuencia de marcos MP3, cada uno de los cuales tiene un encabezado y un componente de datos. La primera tarea es escribir una clase (o clases) de Python para representarlas y leerlas desde un archivo .mp3. Primero lea el archivo en modo binario (es decir, f = abrir (nombre de archivo, “rb”) y luego data = f.read () – en una máquina moderna, dado que una canción típica de 5min en .mp3 tiene aproximadamente 5MB. También puedes leer todo de una vez.

También puede valer la pena escribir un esquema de encoding más simple (y mucho menos eficiente) a lo largo de estas líneas para explorar cómo funciona, agregando gradualmente los esquemas de trucos como el uso de MP3 y AAC a medida que avanza. Por ejemplo, divida un archivo de entrada PCM en 1024 bloques de muestra, use una FFT o DCT o algo así, y vuelva a ver cómo recupera sus datos originales. Luego, explore cómo puede eliminar los datos de la versión transformada en frecuencia, y vea qué efecto tiene cuando se transforma nuevamente en datos PCM. El resultado final será muy pobre al principio, pero al ver los problemas y ver lo que hacen, por ejemplo, MP3 y AAC, puede aprender por qué estos esquemas de compresión hacen las cosas como lo hacen.

En resumen, si su caso de uso es uno de ‘estar listo’, es probable que no quiera usar Python. Por otro lado, si su caso de uso es uno de ‘aprender cómo se hacen las cosas’, eso es diferente. (Como regla general, lo que podría hacer con un ensamblaje optimizado en un Pentium 100 de los años 90, puede hacer aproximadamente el mismo rendimiento utilizando Python en un Core i5 moderno, algo así: hay un factor de 100 o menos en el rendimiento en bruto, y una desaceleración similar del uso de Python).