您应该将两个数组(通过读取两个文件获得)组合成一个包含两列的数组。当您播放双列数组时,第一列将在第一个输出通道上播放,第二列将在第二个通道上播放(通常分别为左和右)。
如果您的两个单声道文件恰好具有完全相同的帧数,您可以简单地使用
import numpy as np
data_stereo = np.column_stack([data_left, data_right])
然而,通常,这两个文件将具有不同的长度。在这种情况下,您必须决定是要剪切较长的一个还是用零填充较短的一个(或两者兼而有之)。
您可以为此使用soundfile.read(),它具有frames
用于选择从文件中读取多少帧的参数,以及fill_value
用于选择应使用哪个值来填充结果数组的参数,以防文件包含的帧少于frames
论据要求。
你可以尝试这样的事情:
import numpy as np
import soundfile as sf
import sounddevice as sd
weight = 1.4
length = 100000
data_left, fs_left = sf.read('tone.wav', frames=length, fill_value=0)
data_right, fs_right = sf.read('sound.wav', frames=length, fill_value=0)
assert fs_left == fs_right
assert data_left.ndim == data_right.ndim == 1
data_stereo = np.column_stack([data_left, data_right])
sd.play(data_stereo * weight, fs_left, loop=True)
sd.wait()
如果您事先不知道长度,您可以只读取一个完整文件,然后调整第二个文件的长度,例如:
data_left, fs_left = sf.read('tone.wav')
data_right, fs_right = sf.read('sound.wav', frames=len(data_left), fill_value=0)