我正在尝试使用python中的wave module打开立体声流并将其转换为单声道。
到目前为止,我已经能够从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()
我从中得到的是来源的“手摇脚乱”版本。
我尝试了不同的组合(我可能误解了整个字节序),但到目前为止还没有运气。
最佳答案
您愿意使用外部库吗?
如果是,您可以使用pydub很少的几行轻松完成此操作,如下所示,
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")
关于python - 在Python中立体声到单波插值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43056088/