2009-06-05 23 views
6

Tengo estos archivos con la extensión ".adc". Simplemente son archivos de datos brutos. Puedo abrirlos con Audacity usando File-> Import-> Raw data con codificación "Signed 16 bit" y frecuencia de muestreo "16000 Khz".Archivo de datos de audio en bruto abierto Python

Me gustaría hacer lo mismo con Python. Creo que el módulo audioop es lo que necesito, pero parece que no puedo encontrar ejemplos sobre cómo usarlo para algo tan simple.

El objetivo principal es abrir el archivo y reproducir una determinada ubicación en el archivo, por ejemplo, del segundo 10 al segundo 20. ¿Hay algo allí para mi tarea?

Gracias por adelantado.

Respuesta

7

Para abrir el archivo, solo necesita file(). Para encontrar una ubicación, no necesita audioop: solo necesita convertir segundos en bytes y obtener los bytes requeridos del archivo. Por ejemplo, si su archivo es 16 kHz 16bit mono, cada segundo es 32,000 bytes de datos. Entonces el décimo segundo es 320kB en el archivo. Simplemente busque el lugar apropiado en el archivo y luego lea la cantidad adecuada de bytes.

Y audioop no puede ayudarle con la parte más difícil: a saber, reproducir el audio. La forma correcta de hacer esto depende de su sistema operativo.

EDIT: Perdón, acabo de notar que su nombre de usuario es "thelinuxer". Considere pyAO para reproducir audio de Python en Linux. Probablemente necesite cambiar el formato de muestra para reproducir el audio --- audioop lo ayudará con esto (vea ratecv, tomono/tostereo, lin2lin y sesgo)

+0

¿No sería 16kHz 16bit mono ser 16,000 bytes de datos? (y 32,000 bytes si fuera estéreo?) – elias

+0

¡Ah, nvm, lo entiendo! 16 bit == 2 bytes. Luego, 2 bytes * 16 muestras/segundo == 32,000 bytes/segundo. – elias

4

Muchas gracias He podido hacer lo siguiente:

def play_data(filename, first_sec, second_sec): 
    import ao 
    from ao import AudioDevice 
    dev = AudioDevice(2, bits=16, rate=16000,channels=1) 
    f = open(filename, 'r') 
    data_len = (second_sec-first_sec)*32000 
    f.seek(32000*first_sec) 
    data = f.read(data_len) 
    dev.play(data) 
    f.close() 

play_data('AR001_3.adc', 2.5, 5) 
1

puede utilizar PySoundFile para abrir el archivo como una matriz NumPy y jugar con python-sounddevice.

import soundfile as sf 
import sounddevice as sd 

sig, fs = sf.read('myfile.adc', channels=2, samplerate=16000, 
        format='RAW', subtype='PCM_16') 
sd.play(sig, fs) 

Puede utilizar la indexación en la matriz NumPy para seleccionar una parte determinada de los datos de audio.

Cuestiones relacionadas