从20多个麦克风输入

时间:2010-06-23 02:41:21

标签: python audio usb microphone libusb

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

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

Ubuntu是一个要求,Alsa不是,而python是理想的。

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

问题:

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

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

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

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

修改

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

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

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

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

8 个答案:

答案 0 :(得分:7)

“监视器”的定义在这里是一个非常大的变量。监视器可能意味着“记录到磁盘”,“检测高于特定阈值的音量级别”或“在频域中执行更高级别的分析(即传统信号处理)”。这三者对CPU使用率和Python的可行性有着非常不同的含义。根据你想做的事情,Python可能不是最合适的。

如果你选择Python,我会注意以下几点:

  • Python的音频支持非常弱
  • python ALSA绑定(pyalsa)用于音序器,混音器和硬件控制,不读取PCM样本(虽然绑定可能有助于管理设备)
  • Python在某些多线程条件下(参见GIL - 全局解释器锁)存在问题,可以通过单独的Python进程完全避免,但这在所有情况下都不可取(我假设你是在多核/处理器系统上运行,并希望分担监控CPU上20个音频输入的负载。)
  • 在音频分析中,人们期望的CPU和内存密集型操作不是Python的强项。话虽如此,可以通过struct.unpack()解压缩PCM数据,并且可以使用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音频类驱动程序的更好部分)。

希望有所帮助!

答案 1 :(得分:4)

  

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

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

我从未试图同时运行过20个这样的东西,但我的感觉是它会非常不可靠。这些东西是廉价的消费者套件,不是为那种用途而设计的;虽然你不会为它们带来麻烦USB 2.0的带宽限制,但我认为它们会在此之前很久就停止工作。对于你所链接的特定模型而言,它的价值非常差。

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

单个同步设备可以一次性拉出多个音频输入通道,比许多单独的声卡更容易应对。您可能仍然不希望直接在Python中使用示例,但您可以使用类似PySndObj的内容将更高级别的处理/分析工具包连接到Python。

答案 2 :(得分:1)

我个人建议您需要一些硬件,如数字调音台,它将首先支持所有这些输入。我真的怀疑你会轻易得到多个麦克风工作。在开始将任何代码写入记录所有这些输入之前,检查PC是否能够处理这种情况是合理的第一步。

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

答案 3 :(得分:0)

如果你不介意延迟,那么USB上的音频很好,但我非常怀疑它可以用于20个频道,特别是在20个设备上。

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

这似乎已经晚了几个月,但也许其他人可以从中受益。至于识别多个USB设备并相互区分,这通常很容易......

许多最便宜的USB设备都没有唯一的序列号,甚至还有一些相当昂贵的序列号(例如Zoom 4595 Aircard)。如果是这种情况,那么没有什么好方法......无论哪个设法在前面的线路上都是/ dev / n0,下一个/ dev / n1,等等。

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

答案 6 :(得分:0)

今天存在的软件将免费或廉价地执行此操作。挑战在于获得投入。

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

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

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

答案 7 :(得分:0)

有趣的是告诉你最终的结果。我想知道像20 arecord进程捕获和一个aplay进程这样简单的事情是否可以完成这项任务。

例如,您启动20个捕获arecord进程并将其stdout传递给tee,然后将其写入文件和管道。同时启动20个cat进程以将管道泵送到/dev/null。您需要跟踪所有这些过程的PID。 如果要监视某些输入,则只需终止相应的cat进程并开始从管道中提取aplay(可能再次使用cat进程)。

现在您只需要一个前端来控制所有这些进程。现在,您可能希望使程序直观地显示每个输入的图形,以便概述活动通道。但基本上也可以通过简单的程序来完成这项工作,这项工作由您已经工作的tee进程提供。

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