首页 文章

从20个麦克风输入

提问于
浏览
10

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

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

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

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

Questions:

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

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

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

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

Edit:

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

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

我打算将声卡和数据处理的轮询发生在不同的线程中,这是我没有多少经验的领域 .

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

8 回答

  • 4

    “监视器”的定义在这里是一个非常大的变量 . 监视器可能意味着“记录到磁盘”,“检测高于特定阈值的音量级别”或“在频域中执行更高级别的分析(即传统信号处理)” . 这三者对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

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

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

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

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

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

  • 0

    我'd personally suggest you need some hardware like a digital mixing desk which will support all those inputs in the first place. I really doubt you'很容易得到多个麦克风工作否则 . 在开始编写任何代码来记录所有这些输入之前,检查PC是否能够以及如何处理这种情况是合乎逻辑的第一步 .

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

  • 7

    如果你不介意延迟,那么USB上的音频很好,但我很怀疑它可以在20个 Channels 上工作,特别是在20个设备上 .

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

  • 0

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

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

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

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

  • 0

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

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

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

  • 0

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

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

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

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

  • 0

    有趣的是告诉你最终的结果 . 我想知道是否有一些简单的过程可以捕获并且一个 aplay 进程可以完成这项工作 .

    例如,您启动20个捕获 arecord 进程并将其stdout传输到 tee ,然后将其写入文件和管道 . 也开始20个 cat 流程将管道泵送到 /dev/null . 您需要跟踪所有这些过程的PID . 当你想监视一些输入时,只需杀死相应的cat进程并开始从管道中输入 aplay (可能再次使用 cat 进程) .

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

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

相关问题