来自 20 多个麦克风的输入

Posted

技术标签:

【中文标题】来自 20 多个麦克风的输入【英文标题】:Input from 20+ microphones 【发布时间】:2011-03-07 03:06:11 【问题描述】:

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

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

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

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

问题:

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

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

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

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

编辑:

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

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

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

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

【问题讨论】:

"Python 不是长期要求,只是迄今为止我发现的从声卡获取 PCM 数据的最简单方法" 真的吗?用什么? 【参考方案1】:

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

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

Python 的音频支持很弱 python ALSA 绑定 (pyalsa) 用于音序器、混音器和硬件控制,而不是读取 PCM 样本(尽管绑定可能有助于管理设备) Python 在某些多线程条件下存在问题(参见 GIL — 全局解释器锁),这可以通过使用单独的 Python 进程完全避免,但这在所有情况下都不是可取的(我假设您是在多核/处理器系统上运行,并希望将监控 20 个音频输入的负载分摊到 CPU)。 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 音频类驱动程序的更好部分)。

希望有帮助!

【讨论】:

这很有帮助。非常感谢! Udev 对我来说是新的,看起来是一个理想的解决方案。去研究制作 USB 音频驱动程序以防万一……【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

提示:将您的 20 个声音输入视为模拟输入,并使用模数转换器(例如 National Instruments 卡)对其进行捕捉。

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

这个Usb DAQ Device 支持 14 SE(单端)模拟输入,只有一个 USB 端口,14 位,48 KS/s。

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

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

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

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

【讨论】:

【参考方案8】:

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

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

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

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

【讨论】:

以上是关于来自 20 多个麦克风的输入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Delphi 中使用 TMediaPlayer 从麦克风输入中录制音频?

处理来自移动麦克风的音频输入而不将其保存到文件中

是否可以将来自电话麦克风的输入投射到接收器?

同步处理来自多个线程的数据

如何使用麦克风从麦克风/线路输入进行FFT

使用 AUGraphs 进行麦克风输入