我有两个不同的wav文件都是单声道的,我想要做的是将声音设备和第一个wav映射到第一个通道并将第二个wav映射到第二个通道并同时播放两者。
weight = 1.4
data, fs = [soundfile.read("tone.wav"),soundfile.read("sound.wav")]
sounddevice.play(data * weight, fs, loop=True, mapping=[1,2])
我尝试过一种非常愚蠢的方法,但是我无法找到办法去做我正在尝试的事情。
答案 0 :(得分:1)
您应该将两个数组(通过读取这两个文件获得)组合成一个包含两列的数组。 当您播放两列数组时,第一列将在第一个输出通道上播放,第二列将在第二个通道上播放(通常分别为左侧和右侧)。
如果您的两个单声道文件碰巧具有完全相同的帧数,则只需使用
即可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)