Python:将单声道波形文件转换为立体声

时间:2017-04-01 21:16:31

标签: python wave transcoding

我希望在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")

1 个答案:

答案 0 :(得分:1)

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