我被问到(如果可能的话)在一台计算机上编写监控至少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音频类驱动程序的更多信息?
答案 0 :(得分:7)
“监视器”的定义在这里是一个非常大的变量。监视器可能意味着“记录到磁盘”,“检测高于特定阈值的音量级别”或“在频域中执行更高级别的分析(即传统信号处理)”。这三者对CPU使用率和Python的可行性有着非常不同的含义。根据你想做的事情,Python可能不是最合适的。
如果你选择Python,我会注意以下几点:
每个线路输入和麦克风应该是立体的,每个有效地提供两个麦克风输入,即每个声卡四个麦克风。假设只有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编码器,以最终格式直接存储在光盘上。使用原始数据进行监控时。