2009-06-05 2 views
6

Ho questi file con l'estensione ".adc". Sono semplicemente file di dati grezzi. Posso aprirli con Audacity usando File-> Importa-> Dati grezzi con codifica "Firmato a 16 bit" e frequenza di campionamento "16000 Khz".Python open raw file di dati audio

Mi piacerebbe fare lo stesso con python. Penso che il modulo audioop sia ciò di cui ho bisogno, ma non riesco a trovare esempi su come usarlo per qualcosa di così semplice.

L'obiettivo principale è aprire il file e riprodurre una determinata posizione nel file, ad esempio dal secondo 10 al secondo 20. Esiste qualcosa per il mio compito?

Grazie in anticipo.

risposta

7

Per aprire il file, è sufficiente disporre di file(). Per trovare una posizione, non è necessario audioop: è sufficiente convertire i secondi in byte e ottenere i byte richiesti del file. Ad esempio, se il tuo file è 16 kHz 16 bit mono, ogni secondo è 32.000 byte di dati. Quindi il decimo secondo è 320kB nel file. Basta cercare nella posizione appropriata nel file e quindi leggere il numero appropriato di byte.

E audioop non può aiutarti con la parte più difficile: ovvero, riprodurre l'audio. Il modo corretto per farlo dipende molto dal tuo sistema operativo.

MODIFICA: Siamo spiacenti, ho appena notato che il tuo nome utente è "thelinuxer". Si consideri pyAO per la riproduzione audio da Python su Linux. Probabilmente avrai bisogno di cambiare il formato di esempio per riprodurre l'audio --- audioop ti aiuterà con questo (vedi ratecv, tomono/tostereo, lin2lin e bias)

+0

Non 16kHz 16 bit mono essere 16.000 byte di dati? (e 32.000 byte se fosse stereo?) – elias

+0

Ah, nvm, ho capito! 16 bit == 2 byte. Quindi, 2 byte * 16 campioni/secondo == 32.000 byte/secondo. – elias

4

Grazie mille Sono stato in grado di fare quanto segue:

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

è possibile utilizzare PySoundFile per aprire il file come un array NumPy e riprodurlo 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) 

È possibile utilizzare l'indicizzazione sull'array NumPy per selezionare una determinata parte dei dati audio.