Lettura di file *. Wav in Python



Answers

Ho fatto qualche ricerca stasera e ho capito questo:

import wave, struct

waveFile = wave.open('sine.wav', 'r')

length = waveFile.getnframes()
for i in range(0,length):
    waveData = waveFile.readframes(1)
    data = struct.unpack("<h", waveData)
    print(int(data[0]))

Spero che questo frammento aiuti qualcuno. Dettagli: usando il modulo struct , puoi prendere i frame d'onda (che sono in binario complementare 2s tra -32768, 0x8000 e 32767; 0x7FFF) Questo legge un file MONO, 16-BIT, WAVE. Ho trovato questa pagina web abbastanza utile nel formulare questo.

Questo snippet legge 1 frame. Per leggere più di un fotogramma (ad es. 13), utilizzare

waveData = waveFile.readframes(13)
data = struct.unpack("<13h", waveData)
Question

Ho bisogno di analizzare il suono scritto in un file .wav. Per questo ho bisogno di trasformare questo file in un insieme di numeri (matrici, per esempio). Penso di aver bisogno di usare il pacchetto wave. Tuttavia, non so come funzioni esattamente. Ad esempio ho fatto quanto segue:

import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
    frame = w.readframes(i)
    print frame

Come risultato di questo codice mi aspettavo di vedere la pressione del suono come funzione del tempo. Al contrario, vedo molti simboli strani e misteriosi (che non sono numeri esadecimali). Qualcuno può, piacere, aiutarmi con quello?




IMHO, il modo più semplice per ottenere dati audio da un file audio in un array NumPy è PySoundFile :

import soundfile as sf
data, fs = sf.read('/usr/share/sounds/ekiga/voicemail.wav')

Questo supporta anche i file a 24 bit pronti all'uso.

Ci sono molte librerie di file audio disponibili, ho scritto una panoramica in cui è possibile vedere alcuni pro e contro. Dispone anche di una pagina che spiega come leggere un file wav a 24 bit con il modulo wave .




Se si desidera acquisire un blocco audio per blocco, alcune delle soluzioni fornite sono piuttosto orribili nel senso che implicano il caricamento dell'intero audio in memoria, causando molti errori di cache e il rallentamento del programma. python-wavefile fornisce alcuni costrutti pirateschi per l'elaborazione NumPy block-by-block utilizzando la gestione dei blocchi efficiente e trasparente tramite generatori. Altre sottigliezze pitoniche sono il gestore di contesto per i file, i metadati come proprietà ... e se si desidera l'intera interfaccia di file, perché si sta sviluppando un prototipo rapido e non si cura dell'efficacia, l'intera interfaccia di file è ancora lì.

Un semplice esempio di elaborazione sarebbe:

import sys
from wavefile import WaveReader, WaveWriter

with WaveReader(sys.argv[1]) as r :
    with WaveWriter(
            'output.wav',
            channels=r.channels,
            samplerate=r.samplerate,
            ) as w :

        # Just to set the metadata
        w.metadata.title = r.metadata.title + " II"
        w.metadata.artist = r.metadata.artist

        # This is the prodessing loop
        for data in r.read_iter(size=512) :
            data[1] *= .8     # lower volume on the second channel
            w.write(data)

L'esempio riutilizza lo stesso blocco per leggere l'intero file, anche nel caso dell'ultimo blocco che di solito è inferiore alla dimensione richiesta. In questo caso ottieni una porzione del blocco. Quindi fidati della lunghezza del blocco restituita invece di utilizzare una dimensione 512 hardcoded per qualsiasi ulteriore elaborazione.




Puoi anche usare la libreria di import wavio semplice e avere anche una conoscenza di base del suono.




se i suoi soli due file e la frequenza di campionamento sono significativamente alti, puoi semplicemente interlacciali.

from scipy.io import wavfile
rate1,dat1 = wavfile.read(File1)
rate2,dat2 = wavfile.read(File2)

if len(dat2) > len(dat1):#swap shortest
    temp = dat2
    dat2 = dat1
    dat1 = temp

output = dat1
for i in range(len(dat2)/2): output[i*2]=dat2[i*2]

wavfile.write(OUTPUT,rate,dat)



Related