2017-04-01 2 views
1

Ich suche eine Wave-Datei von Mono zu Stereo in Python zu konvertieren. Am Ende soll es zwei identische Kanäle rechts und links den Monokanal Information. Mein Code funktioniert nicht. Ich bekomme nur den linken Kanal mit den Eingangsinformationen, der rechte Kanal ist leer. Irgendwelche Vorschläge?Python: Konvertieren Mono-Wave-Datei auf Stereo

import struct, wave 
import numpy as np 

def make_stereo(file1, output): 
    def everyOther (v, offset=0): 
     return [v[i] for i in range(offset, len(v), 2)] 
    ifile = wave.open(file1) 
    print ifile.getparams() 
    # (1, 2, 44100, 2013900, 'NONE', 'not compressed') 
    (nchannels, sampwidth, framerate, nframes, comptype, compname) = ifile.getparams() 
    frames = ifile.readframes(nframes * nchannels) 
    ifile.close() 
    out = struct.unpack_from("%dh" % nframes * nchannels, frames) 
    # Convert 2 channels to numpy arrays 
    if nchannels == 2: 
     left = np.array(list(everyOther(out, 0))) 
     right = np.array(list(everyOther(out, 1))) 
    else: 
     left = np.array(out) 
     right = left 
    ofile = wave.open(output, 'w') 
    ofile.setparams((2, sampwidth, framerate, nframes, comptype, compname)) 
    ofile.writeframes(left.tostring()) 
    # ofile.writeframes(right.tostring()) 
    ofile.close() 

make_stereo("Input.wav", "Output.wav") 

Antwort

0

Mit numpy hierfür ist die sprichwörtliche Elefant Pistole eine Fliege zu schießen, außer vielleicht, wenn Sie Performance-Probleme haben.

array ist leicht, über die Vernunft und die Arbeit mit. Ich bin nicht an meinem Audio-Computer, aber eine Übersetzung von Ihrem Programm, um Array zu verwenden sollte in etwa so aussehen:

import wave, array 

def make_stereo(file1, output): 
    ifile = wave.open(file1) 
    print ifile.getparams() 
    # (1, 2, 44100, 2013900, 'NONE', 'not compressed') 
    (nchannels, sampwidth, framerate, nframes, comptype, compname) = ifile.getparams() 
    assert comptype == 'NONE' # Compressed not supported yet 
    array_type = {1:'B', 2: 'h', 4: 'l'}[sampwidth] 
    left_channel = array.array(array_type, ifile.readframes(nframes))[::nchannels] 
    ifile.close() 

    stereo = 2 * left_channel 
    stereo[0::2] = stereo[1::2] = left_channel 

    ofile = wave.open(output, 'w') 
    ofile.setparams((2, sampwidth, framerate, nframes, comptype, compname)) 
    ofile.writeframes(stereo.tostring()) 
    ofile.close() 

make_stereo("Input.wav", "Output.wav") 
+0

Vielen Dank, dass der Trick! – bunkus