Python – Leyendo un archivo de audio grande a un flujo?
La Pregunta
Quiero cargar un archivo de audio de cualquier tipo (mp3, m4a, flac, etc.) y escribirlo en un flujo de salida.
Intenté usar pydub
, pero carga todo el archivo de una vez, lo cual lleva mucho tiempo y agota fácilmente la memoria.
También intenté usar python-vlc
, pero ha sido poco confiable y demasiado “caja negra”.
Entonces, ¿cómo puedo abrir archivos de audio grandes por fragmentos para transmitir?
Edición #1
Encontré medio de una solución aquí, pero necesitaré investigar más para encontrar la otra mitad.
TL;DR: Utiliza subprocess y ffmpeg para convertir el archivo a datos en formato wav
, y transmite esos datos a través de np.frombuffer
. El problema es que el subprocess aún debe terminar antes de usar frombuffer
.
…a menos que sea posible que la tubería sea escrita en un hilo mientras np la lee desde otro hilo, lo cual aún no he probado. Por ahora, este problema no está resuelto.
davy.ai
Solución:
Hay algunas formas en las que puedes abrir archivos de audio grandes en fragmentos para su transmisión. Aquí te presento algunas sugerencias:
pydub
con la opciónlazy
: Pydub tiene una opciónlazy
que se puede establecer enTrue
al cargar un archivo de audio. Esta opción cargará el archivo de audio de manera perezosa, es decir, solo cargará el audio en fragmentos a medida que se va procesando. Esto puede ayudar a evitar cargar todo el archivo en memoria de una vez. Aquí tienes un ejemplo:Esto cargará y procesará el archivo de audio en fragmentos a medida que se utiliza.
audioread
: Audioread es un paquete de Python que se puede utilizar para extraer datos de audio de una variedad de formatos de archivo. Está diseñado para ser muy eficiente en el uso de memoria y puede leer archivos de audio en fragmentos. Aquí tienes un ejemplo:Este código leerá el archivo de audio “mi_archivo_de_audio.mp3” en fragmentos y procesará cada fragmento en el bucle.
ffmpeg
ynumpy.frombuffer
: Otra forma es usarffmpeg
para convertir el archivo de audio al formato WAV y luego utilizarnumpy.frombuffer
para leer los datos de audio por fragmentos. Aquí tienes un ejemplo:Este código usará
subprocess
para llamar affmpeg
y convertir el archivo de audio al formato WAV. Los datos de audio luego se leerán en fragmentos usandonumpy.frombuffer
, y cada fragmento se puede procesar según sea necesario.Espero que esto te ayude. Déjame saber si tienes alguna pregunta adicional.