gpt4 book ai didi

python - 使用声音设备同时在两个不同 channel 上播放两个输入,每个输出

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:25 25 4
gpt4 key购买 nike

我有两个不同的 wav 文件,它们都是单声道的,我想要做的是使用声音设备将这两个文件结合起来,并将第一个 wav 映射到第一个 channel ,将第二个 wav 映射到第二个 channel ,并同时播放两个文件。

weight = 1.4
data, fs = [soundfile.read("tone.wav"),soundfile.read("sound.wav")]
sounddevice.play(data * weight, fs, loop=True, mapping=[1,2])

我尝试了一种非常愚蠢的方法,但没有成功,而且我无法找到一种方法来完成我正在尝试的事情。

最佳答案

您应该将两个数组(通过读取两个文件获得)合并为一个具有两列的数组。当您播放两列阵列时,第一列将在第一个输出 channel 上播放,第二列将在第二个 channel 上播放(通常分别为左和右)。

如果您的两个单声道文件恰好具有完全相同的帧数,您只需使用

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)

关于python - 使用声音设备同时在两个不同 channel 上播放两个输入,每个输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47919850/

25 4 0
文章推荐: c# - 如何从 list 中获取对象的成员?