10

我被要求(如果可能的话)在一台计算机上编写一个程序来监控至少 20 个麦克风的输入。

目前我正在使用 Alsa 的 Ubuntu 系统上使用 python (2.6) 进行原型设计。到目前为止,我的尝试已经产生了很多问题......

Ubuntu 是必需的,Alsa 不是,python 是理想的。

对于硬件,一个建议是多个声卡。另一个是一系列 USB 集线器和麦克风适配器(如这些)(在这种情况下,这些设备都是相同的并且在同一 USB 总线上)

问题:

如何从单个声卡同时录制多个麦克风?(例如,使用线路输入和麦克风,任何知道我可以使用多于两个输入的人的奖励!)

在 USB 设置中,如何识别声卡(USB 适配器)插入 USB 集线器(或 USB 集线器链)的位置。

如果解决方案是通过 USB 对麦克风进行原始访问,那么设备在 USB 总线上的位置是否仅取决于它们插入的 USB 集线器上的哪个端口,或者它是否可以在打开和关闭计算机电源之间改变?

最后,如果使用原始访问,我如何最好地获取数据(目前没有使用 pyUSB 的经验)以及从原始 -> 音频需要什么转换(如果有的话)?

编辑:

通过监视器,我被要求将输入记录到磁盘(理想情况下高于设定的阈值,speex 编解码器看起来非常适合),监视音量,提供图形反馈并设置至少一个循环通过所有活动麦克风的输出。

Python 不是长期要求,只是迄今为止我发现的从声卡获取 PCM 数据的最简单方法(不过只有麦克风)

我打算让声卡的轮询和数据处理在不同的线程中进行,这是我没有太多经验的领域。

我在哪里可以找到有关实现 USB 音频类驱动程序的更多信息?

4

8 回答 8

7

“监视器”的定义在这里是一个很大的变量。监视器可能意味着“记录到磁盘”、“检测高于特定阈值的音量”或“在频域中执行更高级别的分析(即常规信号处理)”。这三者对 CPU 使用率和 Python 的可行性有着截然不同的影响。Python 可能不是最合适的,具体取决于您想要做什么。

如果您使用 Python,我会注意以下几点:

  • Python 的音频支持很弱
  • python ALSA 绑定(pyalsa)用于音序器、混音器和硬件控制,不读取 PCM 样本(尽管绑定可能有助于管理设备)
  • Python 在某些多线程条件下存在问题(参见 GIL — 全局解释器锁),这可以通过使用单独的 Python 进程完全避免,但这在所有情况下都不是可取的(我假设您正在运行多核/处理器系统,并希望在 CPU 之间分配监控 20 个音频输入的负载)。
  • 诸如音频分析中的 CPU 和内存密集型操作并不是 Python 的强项。话虽如此,PCM 数据可以通过 struct.unpack() 解包,并且可以使用 NumPy 和 SciPy 中的例程进行信号分析。

每个线路输入和麦克风应该是立体的,每个有效地提供两个麦克风输入,即每个声卡四个麦克风。假设只有 20 个输入,这意味着五个 USB 音频适配器。顺便说一句,要使用线路输入,您需要某种麦克风前置放大器,它可能比您想要的更昂贵。在这种情况下,您需要 10 个 USB 音频适配器用于 20 个输入。

我要提醒的是,大多数低端集线器可能无法处理 5-10 个音频适配器的流量。就此而言,我确信您有一个 USB 2.0 高速集线器(即使实际的音频设备是 USB 1.1 全速或更慢),以确保您有足够的上行带宽。如果您有选择,购买带有 4 个或 5 个外部 USB 端口的 PCI USB 适配器卡并不难。顺便说一句,您展示的 USB 设备只有立体声输出和麦克风输入(没有线路输入)。

顺便说一句,理想情况下,您会使用 USB 同步传输模式来获得低延迟和一致的交付,但我怀疑 ALSA 驱动程序是否支持它。

关于 USB 声卡的逻辑到物理映射,一组 udev 规则将允许您根据 USB 层次结构提供有用且一致的设备命名方案,或者,如果您愿意,序列号(如果设备有)或其他属性。在任何情况下,您都应该能够使用 udev 规则通过其身份或物理位置(根据您的选择)来稳定音频设备的映射。

我对 pyUSB 一无所知,但确实看到它支持同步传输模式。一目了然 pyUSB 将允许非常精确的控制,但我怀疑你会做更多你打算做的编码(你基本上需要在 Python 中实现 USB 音频类驱动程序的更好部分)。

希望有帮助!

于 2010-06-23T07:29:32.667 回答
4

对于硬件,一个建议是多个声卡。另一个是一系列的 USB 集线器和麦克风适配器(像这些)

这些也是多个声卡:每个都提供一个 USB 音频设备类接口,独立时钟,如果您尝试同步它们可能会导致问题。

我从来没有尝试过同时运行 20 个这样的东西,但我的感觉是它会非常不可靠。这些东西是不是为这种用途而设计的廉价消费套件;尽管您不会因为它们而困扰 USB 2.0 的带宽限制,但我认为它们会在此之前很久就停止可靠地工作。对于您链接到的特定模型的价值,评论极差。

如果可以,请考虑具有多个输入的高端声卡。例如,Delta-1010LT价格合理,显然得到了 ALSA 的支持。外部盒子(USB、Firewire、RME 的东西)还有更多 8+ 输入的可能性;ESI 制造了一个 16 输入机架,但 ALSA 的驱动器情况看起来令人怀疑。

一个同步的设备,您可以一次从中提取多个音频输入通道,这将比许多单独的声卡更容易处理。您可能仍然不想直接在 Python 中摆弄样本,但您可以使用PySndObj 之类的东西将更高级别的处理/分析工具包连接到 Python 。

于 2010-06-23T11:11:55.033 回答
1

我个人建议您需要一些硬件,例如数字混音台,它首先支持所有这些输入。我真的怀疑你会很容易让多个麦克风正常工作。在您开始编写任何代码来记录所有这些输入之前,检查 PC 是否/如何处理这种情况是合乎逻辑的第一步。

而且我也会犹豫在这里推荐 Python。一方面,这听起来像是性能可能很关键的情况,另一方面,在 *nix 上我不想做任何低级的事情,除了 C/C++(在 Windows 上我可能会说 C++ 或 C#)。

于 2010-06-23T08:00:18.223 回答
0

如果您不介意延迟,USB 上的音频很好,但我严重怀疑它可以与 20 个通道一起使用,尤其是在 20 个设备上。

获得一些大型 Firewire 接口(8 通道+),可能来自 Presonus。找一些Linux音响系统支持的东西,你不想自己处理任何总线。如果可以,请使用 DAW 应用程序来获取音频。如果需要处理,编写插件可能比从头开始更容易。我不知道在 Python 中进行多轨录音的好库。

于 2010-06-23T07:51:48.323 回答
0

提示:将您的 20 个声音输入视为模拟输入,并使用模数转换器捕获它,例如 National Instruments 卡。

我什至听说过使用 NatInst 硬件的专业声音映射。而且(至少对于 Windows,我不知道对于 Linux)软件支持非常好。

USB DAQ 设备支持 14 个 SE(单端)模拟输入,只有一个 14 位、48 KS/s 的 USB 端口。

是的,至少 Labview 有一个 Linux 版本。

于 2010-06-23T11:31:35.803 回答
0

这似乎晚了几个月,但也许其他人可以从中受益。至于识别多个 USB 设备并将一个与另一个区分开来,这相当容易......通常。

许多最便宜的 USB 设备都没有唯一的序列号,甚至一些相当昂贵的设备(例如 Zoom 4595 Aircard)。如果是这种情况,那就没有好办法了……无论哪一个设法挤到队伍的最前面,都是 /dev/n0,下一个是 /dev/n1,以此类推。

但是如果它们确实有唯一的序列号,那么您可以编写 udev 规则,指定某个序列号应该是 /dev/n4。Udev 规则不适合弱者,我花了数周时间才掌握它,但可以使这些事情成为可能。

于 2010-08-20T16:51:34.470 回答
0

今天有软件可以免费或便宜地做到这一点。挑战在于获得输入。

如果这是针对企业并且他们的业务依赖于它,我建议使用 Logic Express / Logic Pro 或 Pro Tools 解决方案。花几块钱,让它正常工作。

运行良好的免费软件有:Audacity(所有平台)、Garageband(Mac)、Ardor(Linux、Mac)等。

现在要将 20 个单声道音频输入到系统中,您应该考虑使用具有 20 个输入(或更多)的东西,而不是将所有 20 个麦克风运行到混音板上并记录一个通道的混音。

于 2010-08-20T17:29:35.673 回答
0

有趣的是告诉你最终得到了什么。我想知道像 20 个arecord进程捕获和一个aplay进程这样简单的东西是否可以完成这项工作。

例如,您启动 20 个捕获arecord进程并将它们的标准输出通过管道传输到tee该标准输出,然后将其写入文件和管道。还启动 20 个cat进程以将管道泵送到/dev/null. 您需要跟踪所有这些进程的 PID。当您想监视某些输入时,只需终止相应的 cat 进程并开始aplay从管道馈送(可能再次使用cat进程)。

现在您只需要一个前端来控制所有这些过程。现在您可能想让您的程序直观地显示每个输入的图表,以便概览活动通道。但基本上,这也可以通过简单的程序来实现,该程序由tee您已经开始工作的流程提供支持。

顺便说一句,tee您可以将原始数据直接提供给 speex 编码器,以最终格式直接存储在磁盘上。在使用原始数据进行监控时。

于 2013-09-05T19:23:44.317 回答