2017-04-01 35 views
1

我正在尋找在Python中將波形文件從單聲道轉換爲立體聲。最後應該有兩個相同的左右聲道單聲道信息。我的代碼不起作用。我只有輸入信息的左聲道,右聲道是空的。有什麼建議麼?Python:將單波文件轉換爲立體聲

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") 

回答

0

使用numpy因爲這是衆所周知的獵象槍射擊一隻蒼蠅,除非,也許,如果您有性能問題。

array很容易推理和使用。我不是在我的音頻電腦上,但是使用陣列的程序的翻譯應該是這樣的:

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

非常感謝您的訣竅! – bunkus

相關問題