es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Usa pydub con la opción lazy: Pydub tiene una opción lazy que se puede establecer en True 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:
    from pydub import AudioSegment
    
    audio = AudioSegment.from_file("mi_archivo_de_audio.mp3", format="mp3", lazy=True)
    

    Esto cargará y procesará el archivo de audio en fragmentos a medida que se utiliza.

    1. Usa 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:
    import audioread
    
    with audioread.audio_open("mi_archivo_de_audio.mp3") as f:
        for buf in f:
            # haz algo con buf (datos de audio)
    

    Este código leerá el archivo de audio “mi_archivo_de_audio.mp3” en fragmentos y procesará cada fragmento en el bucle.

    1. Usa ffmpeg y numpy.frombuffer: Otra forma es usar ffmpeg para convertir el archivo de audio al formato WAV y luego utilizar numpy.frombuffer para leer los datos de audio por fragmentos. Aquí tienes un ejemplo:
    import subprocess
    import numpy as np
    
    # convierte el archivo de audio al formato WAV usando ffmpeg
    ffmpeg_cmd = ['ffmpeg', '-i', 'mi_archivo_de_audio.mp3', '-f', 'wav', '-']
    proc = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE, bufsize=8192)
    
    # lee los datos de audio en fragmentos usando numpy.frombuffer
    while True:
        fragmento = proc.stdout.read(8192)
        if not fragmento:
            break
        datos = np.frombuffer(fragmento, dtype=np.int16)
        # haz algo con los datos de audio
    

    Este código usará subprocess para llamar a ffmpeg y convertir el archivo de audio al formato WAV. Los datos de audio luego se leerán en fragmentos usando numpy.frombuffer, y cada fragmento se puede procesar según sea necesario.

    Espero que esto te ayude. Déjame saber si tienes alguna pregunta adicional.

Comments are closed.