【问题标题】:How to create a surround effect using python by controlling the volume of speakers channels?如何通过控制扬声器通道的音量使用 python 创建环绕效果?
【发布时间】:2020-10-23 21:32:03
【问题描述】:

我买了一个声卡:Focusrite Scarlett 4i4 3rd Gen,有 4 个输出通道。我还有 4 个扬声器,我会将每个扬声器与声卡连接起来。我希望能够单独设置每个扬声器的音量,可能有一个 tkinter 界面(最终,但这不是重点)。

我已经看到我们可以有很多不同的库(我在这个项目中使用的是 Windows 10):似乎很有趣的是 sounddevice 和 soundcard。

我想选择声卡作为我的输出设备,并指定必须立即播放声音的通道。一个好的用法是在单声道中使用 .wav 文件以在 1、2、3 或 4 个扬声器中实现;或立体声中的 .wav 文件以相同的方式实现,但在 2 个扬声器中使用立体声的第一个通道,在其他 2 个扬声器中使用立体声的第二个通道。完美的用法是创建一个环绕 4.0 效果,制作一个正方形的扬声器并能够随着声音“转身”:你可以想象我放了一个火车的声音,这个声音好像在转身火车绕着你转。

sounddevice.AsioSettings() 似乎允许我们控制使用哪个输出来播放某些东西,对吧? (https://python-sounddevice.readthedocs.io/en/0.3.15/api/platform-specific-settings.html) 但是当我详细查看文档时,我还注意到 sounddevice.play() 允许我们指定 ma​​pping 参数,而我没有真的明白。 (https://python-sounddevice.readthedocs.io/en/0.3.15/api/convenience-functions.html#sounddevice.play) 我想在所有情况下我都必须安装 Asio,这不是问题(我希望!)。

由于我的目的是控制每个扬声器,我可以指定什么以及如何使用 souddevice 库或其他库来实现?另外,是否可以使用这些库或其他库(例如:pycaw)来控制每个扬声器的音量?

非常感谢!

爱乐恩

PS:如果没有使用 python 的解决方案,如果您有想法以另一种方式实现这一目标(例如能够做到这一点的软件),那将是一种乐趣。

【问题讨论】:

标签: python audio python-sounddevice surround soundcard


【解决方案1】:

AsioSettingsmapping 参数都用于静态选择通道。您不能使用其中任何一个来混合信号或更改它们的音量。

如果您想按升序使用声卡的前几个通道(例如通道 1、2、3 和 4),则根本不需要它们。例如,您可以简单地使用channels=4,它将选择前 4 个通道。更简单的是,如果使用sounddevice.play(),通道数将由给定的 NumPy 数组确定,而不必显式指定channels 参数。

如果您提前知道所需的运动(在您的示例中为火车),您可以预先计算 2 或 4 通道信号。然后您可以简单地使用sounddevice.play() 播放多通道信号(如果需要,使用AsioSettingsmapping 参数)。

如果您事先不知道运动(例如,如果它是实时计算的),您可以使用 sounddevice.OutputStream 并实现一个自定义的 callback 函数来对信号进行加权。

至于如何准确地将信号混合到输出通道中,这与sounddevicesoundcard 模块没有任何关系。您可能可以找到信号处理库来执行此操作,或者您可以自己实现它。对此的适当搜索词是“平移”。对于两个通道,您可以使用“立体声平移”,对于更多通道,还有其他方法,例如“矢量基础幅度平移 (VBAP)”、“Ambisonics 幅度平移”,...

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多