如何通过控制扬声器通道的音量使用 python 创建环绕效果?
How to create a surround effect using python by controlling the volume of speakers channels?
我买了声卡:Focusrite Scarlett 4i4 3rd Gen,有4个输出通道。我也有 4 个扬声器,我将 link 每个扬声器都带有声卡。我希望能够单独设置每个扬声器的音量,也许有一个 tkinter 接口(最终,但这不是重点)。
我看到我们可以有很多不同的库(我在这个项目中使用 windows 10):似乎有趣的是 sounddevice 和 soundcard。
我想 select 将声卡作为我的输出设备,并指定现在必须播放声音的通道。一个好的用法是在单声道中有一个 .wav 文件以在 1、2、3 或 4 个扬声器中实现;或立体声中的 .wav 文件以相同的方式实现,但立体声的第一个通道在 2 个扬声器中,立体声的第二个通道在另外两个扬声器中。最完美的用法是创建一个环绕声 4.0 效果,制作一个正方形的扬声器并能够随着声音“转身”:你可以想象我放一个火车的声音,这个声音好像在转火车正绕着你转。
sounddevice.AsioSettings() 似乎让我们可以控制使用哪个输出来播放某些东西,对吧? (https://python-sounddevice.readthedocs.io/en/0.3.15/api/platform-specific-settings.html) But when I see the doc in details, I also note that sounddevice.play() allows us to specify the mapping argument, which I don't really understand. (https://python-sounddevice.readthedocs.io/en/0.3.15/api/convenience-functions.html#sounddevice.play) 我想在所有情况下我都必须安装 Asio,这不是问题(我希望!)。
由于我的目的是控制每个扬声器,我可以指定什么以及如何使用 souddevice 库或其他库来实现?另外,是否可以使用那些库或其他库(例如:pycaw)来控制每个扬声器的音量?
非常感谢!
伊律恩
PS:如果 python 不存在解决方案,如果您有想法以其他方式实现此目标(例如能够做到这一点的软件),那将是一种荣幸。
AsioSettings
和 mapping
参数都用于静态 selecting 频道。您不能使用它们来混合信号或改变它们的音量。
如果您想按升序使用声卡的前几个通道(例如通道 1、2、3 和 4),则根本不需要它们。例如,您可以简单地使用 channels=4
,这将 select 前 4 个频道。更简单的是,如果你使用 sounddevice.play()
,通道数将由给定的 NumPy 数组决定,你不必显式指定 channels
参数。
如果您事先知道所需的运动(在您的例子中是火车),您可以预先计算 2 或 4 通道信号。然后您可以简单地使用 sounddevice.play()
播放多声道信号(如果需要,使用 AsioSettings
或 mapping
参数)。
如果您事先不知道运动(例如,如果它是实时计算的),您可以使用 sounddevice.OutputStream
并实现一个自定义 callback
函数,该函数对信号。
至于如何将信号混合到输出通道中,这与sounddevice
或soundcard
模块没有任何关系。您或许可以找到信号处理库来执行此操作,或者您可以自己实现它。合适的搜索词是“平移”。对于两个通道,您可以使用“立体声声像”,对于更多通道,还有其他方法,例如“矢量基幅声像 (VBAP)”、“Ambisonics 声像声像”,...
我买了声卡:Focusrite Scarlett 4i4 3rd Gen,有4个输出通道。我也有 4 个扬声器,我将 link 每个扬声器都带有声卡。我希望能够单独设置每个扬声器的音量,也许有一个 tkinter 接口(最终,但这不是重点)。
我看到我们可以有很多不同的库(我在这个项目中使用 windows 10):似乎有趣的是 sounddevice 和 soundcard。
我想 select 将声卡作为我的输出设备,并指定现在必须播放声音的通道。一个好的用法是在单声道中有一个 .wav 文件以在 1、2、3 或 4 个扬声器中实现;或立体声中的 .wav 文件以相同的方式实现,但立体声的第一个通道在 2 个扬声器中,立体声的第二个通道在另外两个扬声器中。最完美的用法是创建一个环绕声 4.0 效果,制作一个正方形的扬声器并能够随着声音“转身”:你可以想象我放一个火车的声音,这个声音好像在转火车正绕着你转。
sounddevice.AsioSettings() 似乎让我们可以控制使用哪个输出来播放某些东西,对吧? (https://python-sounddevice.readthedocs.io/en/0.3.15/api/platform-specific-settings.html) But when I see the doc in details, I also note that sounddevice.play() allows us to specify the mapping argument, which I don't really understand. (https://python-sounddevice.readthedocs.io/en/0.3.15/api/convenience-functions.html#sounddevice.play) 我想在所有情况下我都必须安装 Asio,这不是问题(我希望!)。
由于我的目的是控制每个扬声器,我可以指定什么以及如何使用 souddevice 库或其他库来实现?另外,是否可以使用那些库或其他库(例如:pycaw)来控制每个扬声器的音量?
非常感谢!
伊律恩
PS:如果 python 不存在解决方案,如果您有想法以其他方式实现此目标(例如能够做到这一点的软件),那将是一种荣幸。
AsioSettings
和 mapping
参数都用于静态 selecting 频道。您不能使用它们来混合信号或改变它们的音量。
如果您想按升序使用声卡的前几个通道(例如通道 1、2、3 和 4),则根本不需要它们。例如,您可以简单地使用 channels=4
,这将 select 前 4 个频道。更简单的是,如果你使用 sounddevice.play()
,通道数将由给定的 NumPy 数组决定,你不必显式指定 channels
参数。
如果您事先知道所需的运动(在您的例子中是火车),您可以预先计算 2 或 4 通道信号。然后您可以简单地使用 sounddevice.play()
播放多声道信号(如果需要,使用 AsioSettings
或 mapping
参数)。
如果您事先不知道运动(例如,如果它是实时计算的),您可以使用 sounddevice.OutputStream
并实现一个自定义 callback
函数,该函数对信号。
至于如何将信号混合到输出通道中,这与sounddevice
或soundcard
模块没有任何关系。您或许可以找到信号处理库来执行此操作,或者您可以自己实现它。合适的搜索词是“平移”。对于两个通道,您可以使用“立体声声像”,对于更多通道,还有其他方法,例如“矢量基幅声像 (VBAP)”、“Ambisonics 声像声像”,...