2010-06-23 38 views
10

我曾問過(如果可能的話)在單臺計算機上編寫一個程序來監視至少20個麥克風的輸入。來自20多個麥克風的輸入

目前,我在使用Alsa的Ubuntu系統上進行python(2.6)原型開發。我迄今爲止的嘗試創造了不少問題...

Ubuntu是一個需求,Alsa不是,而python是理想選擇。

對於硬件,一個建議是多聲卡。另一種是一系列的USB集線器和麥克風適配器(如these)(在這種情況下,設備都將是相同的,相同的USB總線上)

問題:

我怎麼能同時錄製多個麥克風從一個單一的聲卡? (例如,使用線路輸入以及麥克風,任何知道我可以使用多於兩個輸入的人的獎金)

在USB設置中,如何識別聲卡(USB適配器)在哪個位置插入 到USB集線器(或USB集線器鏈)。

如果解決方案是通過USB對麥克風進行原始訪問,則USB總線上的設備位置僅取決於它們插入的USB集線器上的哪個端口,或者可以在打開和關閉計算機之間切換?

最後,如果使用原始訪問,我如何才能最好地獲取數據(目前沒有pyUSB的經驗)以及從原始 - >音頻需要什麼樣的轉換(如果有)?

編輯:

通過監視器,我已經要求記錄輸入到硬盤上(最好超過設定閾值時,該Speex編解碼器看起來非常適合),監聽音量水平,提供圖形反饋,並設置至少有一個輸出循環通過所有有源麥克風。

Python是不是一個長期的需求,只是到目前爲止,我已經找到擺脫聲卡PCM數據(僅麥克風然而)

我打算擁有的輪詢最簡單的方法聲卡和數據處理發生在不同的線程中,這是我沒有太多經驗的地方。

我在哪裏可以找到更多關於實現USB音頻類驅動程序的信息?

+0

「Python不是一個長期的要求,只是我迄今發現的從聲卡獲取PCM數據的最簡單的方法」真的嗎?用什麼? – endolith 2010-07-22 20:58:48

回答

7

「監視器」的定義在這裏是一個非常大的變量。監視器可以意味着「記錄到磁盤」,「檢測高於特定閾值的音量水平」或「在頻域中執行更高水平的分析(即常規信號處理)」。這三者對CPU使用率和Python的可行性有着非常不同的含義。取決於你想做什麼,Python可能不是最合適的。

如果你與Python走了,我會注意以下幾點:

  • Python的音頻支持是非常弱
  • 蟒蛇ALSA綁定(pyalsa)是音序器,混頻器和硬件控制,不讀PCM樣本(儘管綁定可能對管理設備有幫助)
  • Python在某些多線程條件下(參考GIL--全局解釋器鎖)有問題,它可以通過獨立的Python進程完全避免,但這是在任何情況下都不可取(我假設你正在運行多核/進程ssor系統,並且希望將負責監控20個音頻輸入的CPU)。
  • CPU和內存激烈的操作,如人們所期望的音頻分析不是Python的強項。話雖如此,PCM數據可以通過struct.unpack()解包,信號分析可以在NumPy和SciPy中找到的例程完成。

每個線路輸入和麥克風應該是立體的,有效地提供兩個麥克風輸入,每個聲卡有四個麥克風。假設只有20個輸入,即5個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音頻類驅動程序的更好的部分)。

希望有幫助!

+0

這非常有幫助。非常感謝! Udev對我來說是新的,看起來是一個理想的解決方案。正在研究製作USB音頻驅動程序以防萬一... – 2010-06-23 11:06:13

+0

http://alsa.opensrc.org/Usb-audio表明支持同步 – akostadinov 2013-09-05 19:30:35

0

如果您不介意延遲,可以通過USB進行音頻播放,但我非常懷疑它可以使用20個通道,尤其是在20個設備上。

獲得一些大的火線接口(8通道+),可能來自Presonus。找到Linux音響系統支持的東西,你不想自己處理任何總線。如果可以,請使用DAW應用程序來獲取音頻。如果需要處理,編寫插件可能比從頭開始更容易。我不知道有一個好的庫可以在Python中進行多軌錄音。

1

我個人建議你需要一些硬件,比如數字調音臺,它將首先支持所有這些輸入。我真的懷疑你會很容易地得到多個話筒工作,否則。在開始編寫任何代碼到記錄所有這些輸入之前,檢查PC/PC如何處理這種情況是合乎邏輯的第一步。

而且我也不想在這裏推薦Python。一方面,這聽起來像是一個性能可能非常關鍵的情況,另一個關於* nix的情況我不想做任何低級的事情,除了C/C++(在Windows上我可能會說C++或C#)。

3

對於硬件,一個建議是多聲卡。另一種是一系列的USB集線器和麥克風適配器(這樣的)

的那些也多聲卡:每個人提出了一個USB音頻設備類型接口,獨立的時鐘,這可能會導致你的問題,如果你是試圖同步它們。

我從來沒有試圖一次運行20個這樣的東西,但我的感覺是它將會非常不可靠。這些東西是廉價的消費者套件,不是爲這種用途而設計的;儘管你不會對USB 2.0的帶寬限制感到困擾,但我認爲在這之前他們會停止可靠的工作。對於你鏈接到的特定模型的評價是非常差的。

如果可以,請考慮使用多輸入端的高端聲卡。例如Delta-1010LT價格合理,顯然是由ALSA支持的。外接盒(USB,Firewire,RME的東西)還有更多的8+輸入功能。 ESI製造一個16輸入機架,但ALSA的駕駛員情況看起來令人懷疑。

一個單一的同步設備,您可以一次從中拉出多個音頻輸入通道,比許多單獨的聲卡更容易處理。您仍然可能不想直接在Python中處理樣本,但是您可以使用類似PySndObj的東西將更高級別的處理/分析工具包連接到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 Express/Logic Pro或Pro Tools解決方案。花幾塊錢,讓它工作正確。

免費的軟件,將工作做好是喜歡的東西:無畏(所有平臺)時,GarageBand(MAC)的Ardour(在Linux,Mac)等

我們獲得20個單聲道音頻輸入到系統中,你應該考慮用20個輸入(或更多)獲得某些東西,而不是將所有20個話筒放入混音板並記錄一個通道的混音。

0

很有意思告訴你最終結果如何。我想知道是否有像20 arecord進程捕獲和一個aplay進程可以完成這項工作。

例如,您啓動20捕獲arecord進程並將它們的標準輸出傳輸到tee,然後寫入文件和管道。也可以啓動20 cat過程以將管道泵送到/dev/null。您需要跟蹤所有這些進程的PID。 當你想監測一些輸入時,只需要殺死相應的cat進程並開始從管道輸入aplay(也許再次使用cat進程)。

現在你只需要一個前端來控制所有這些過程。現在,您可能希望讓程序直觀地顯示每個輸入的圖形,以便對活動頻道進行概述。但基本上這也可以通過簡單的程序來完成,您可以通過tee進程提供的工作來完成這項工作。

btw使用tee您可以直接將原始數據饋送到speex編碼器以直接以最終格式存儲在光盤上。使用原始數據進行監控。