Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的立体声到单波插值_Python_Python 2.7_Wave - Fatal编程技术网

python中的立体声到单波插值

python中的立体声到单波插值,python,python-2.7,wave,Python,Python 2.7,Wave,我正在尝试打开一个立体声流并将其转换为单声道,使用python中的。 到目前为止,我能够从16位立体声little endian文件中编写单个(左或右)通道: LEFT, RIGHT = 0, 1 def mono_single(cont, chan=LEFT): a = iter(cont) mono_cont = '' if chan: a.next(); a.next() while True: try:

我正在尝试打开一个立体声流并将其转换为单声道,使用python中的。 到目前为止,我能够从16位立体声little endian文件中编写单个(左或右)通道:

LEFT, RIGHT = 0, 1
def mono_single(cont, chan=LEFT):
    a = iter(cont)
    mono_cont = ''
    if chan:
        a.next(); a.next()
    while True:
        try:                          
            mono_cont += a.next() + a.next()
            a.next(); a.next()
        except StopIteration:
            return mono_cont

stereo = wave.open('stereofile.wav', 'rb')
mono = wave.open('monofile.wav', 'wb')
mono.setparams(stereo.getparams())
mono.setnchannels(1)
mono.writeframes(mono_single(stereo.readframes(stereo.getnframes())))
mono.close()
这正如预期的那样有效。当我尝试将两个立体声通道混音到一个单声道时,问题就出现了。 我认为在左和右之间进行简单的平均就足够了,这就是我迄今为止所尝试的:

def mono_mix(cont):
    a = iter(cont)
    mono_cont = ''
    while True:
        try:
            left = ord(a.next()) + (ord(a.next()) << 8)
            right = ord(a.next()) + (ord(a.next()) << 8)
            value = (left + right) / 2
            mono_cont += chr(value & 255) + chr(value >> 8)
        except StopIteration:
            return mono_cont

stereo = wave.open('stereofile.wav', 'rb')
mono = wave.open('monofile.wav', 'wb')
mono.setparams(stereo.getparams())
mono.setnchannels(1)
mono.writeframes(mono_mix(stereo.readframes(stereo.getnframes())))
mono.close()
def mono_mix(续):
a=国际热核实验堆(续)
单声道控制=“”
尽管如此:
尝试:
左=ord(a.next())+(ord(a.next())8)
除停止迭代外:
返回单声道控制
立体声=wave.open('stereofile.wav','rb')
mono=wave.open('monofile.wav','wb')
mono.setparams(stereo.getparams())
单声道设置通道(1)
mono.writeframes(mono\u mix(stereo.readframes(stereo.getnframes()))
mono.close()
我从中得到的是来源的“破解”版本。
我尝试了不同的组合(我可能误解了endianness的全部内容),但到目前为止运气不佳。

您愿意使用外部库吗?
如果是,您可以通过以下几行轻松完成此操作:

from pydub import AudioSegment
mysound = AudioSegment.from_wav("/input_path/infile.wav")
mysound = mysound.set_channels(1)
mysound.export("/output_path/outfile.wav", format="wav")

您是否愿意使用外部库?
如果是,您可以通过以下几行轻松完成此操作:

from pydub import AudioSegment
mysound = AudioSegment.from_wav("/input_path/infile.wav")
mysound = mysound.set_channels(1)
mysound.export("/output_path/outfile.wav", format="wav")

结果证明我不知道audioop内置模块(多亏了的)。另外,我在转换立体声格式写入(我应该使用struct)两方面都错了

这使一切变得绝对容易:

stereo = wave.open('stereofile.wav', 'rb')
mono = wave.open('monofile.wav', 'wb')
mono.setparams(stereo.getparams())
mono.setnchannels(1)
mono.writeframes(audioop.tomono(stereo.readframes(float('inf')), stereo.getsampwidth(), 1, 1))
mono.close()

然后,您可以通过修改最新的两个参数来选择一个频道(左为
1,0
,右为
0,1
),甚至使用
1.414
来实现等功率而不是等振幅结果就像我不知道audioop内置模块一样(多亏了的。另外,我在转换立体声格式写入(我应该使用struct)两方面都错了。)

这使一切变得绝对容易:

stereo = wave.open('stereofile.wav', 'rb')
mono = wave.open('monofile.wav', 'wb')
mono.setparams(stereo.getparams())
mono.setnchannels(1)
mono.writeframes(audioop.tomono(stereo.readframes(float('inf')), stereo.getsampwidth(), 1, 1))
mono.close()

然后,您可以通过修改最新的两个参数来选择一个频道(左侧为
1,0
,右侧为
0,1
)或者甚至使用
1.414
来实现等功率而不是等振幅

谢谢,我没有意识到pydub能够做到这一点。事实上,它看起来像是在使用audioop模块,我不知道这一点,所以我想我只需要检查它的代码并编写我自己的函数(我宁愿避免使用pydub,因为我只在这种情况下需要它)。谢谢,我没有意识到pydub能够做到这一点。事实上,它看起来使用的是audioop模块,我不知道,所以我想我只需要检查它的代码并编写我自己的函数(我宁愿避免使用pydub,因为我只在这种情况下需要它).Genius。非常感谢。在这里可以使用tempfile吗?我需要将立体声转换为单声道,因为谷歌STT API不接受立体声。我宁愿不写入磁盘。使用wave.open似乎需要磁盘上的实际文件。Genius。非常感谢。在这里可以使用tempfile吗?我需要将立体声转换为单声道,作为谷歌STT API不接受立体声。我宁愿不写入磁盘。使用wave.open似乎需要磁盘上的实际文件。