python中的立体声到单波插值
我正在尝试打开一个立体声流并将其转换为单声道,使用python中的。 到目前为止,我能够从16位立体声little endian文件中编写单个(左或右)通道: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:
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似乎需要磁盘上的实际文件。