10

私は (可能であれば) 1 台のコンピューターで少なくとも 20 個のマイクの入力を監視するプログラムを作成するように依頼されました。

現在、Alsa を使用する Ubuntu システムで、Python (2.6) でプロトタイプを作成しています。これまでの私の試みは、かなりの数の質問を作成しました...

Ubuntu は必須ですが、Alsa は必須ではなく、python が理想的です。

ハードウェアの場合、1 つの提案は複数のサウンド カードです。もう 1 つは、一連の USB ハブとマイク アダプター (これらのようなもの) です (この場合、デバイスはすべて同一で、同じ USB バス上にあります)。

質問:

1 つのサウンド カードから複数のマイクを同時に録音するにはどうすればよいですか? (例: ライン入力とマイクの使用。2 つ以上の入力を使用する方法を知っている人にはボーナスです!)

USB セットアップで、サウンド カード (USB アダプタ) が USB ハブ (または USB ハブのチェーン) に接続されている位置を特定するにはどうすればよいですか。

解決策が USB 経由のマイクへの生のアクセスである場合、USB バス上のデバイスの位置は、それらが接続されている USB ハブのどのポートにのみ依存しますか、それともコンピューターの電源のオンとオフの間で変わる可能性がありますか?

最後に、生のアクセスを使用している場合、どのようにデータを取得するのが最善でしょうか (pyUSB の現在の経験はありません)、生からオーディオへの変換 (必要な場合) は何ですか?

編集:

モニターごとに、入力をディスクに記録し (理想的には、speex コーデックが理想的と思われる設定されたしきい値を超える)、ボリューム レベルをモニターし、グラフィック フィードバックを提供し、すべてのアクティブなマイクを循環する少なくとも 1 つの出力をセットアップするように求められました。

Python は長期的な要件ではありません。サウンド カードから PCM データを取得するためにこれまでに見つけた最も簡単な方法です (ただし、マイクのみ)。

私は、サウンドカードのポーリングとデータ処理を別々のスレッドで行うつもりです。これは、私があまり経験していない領域です。

USB オーディオ クラス ドライバーの実装に関する詳細情報はどこにありますか?

4

8 に答える 8

7

「モニター」の定義は、ここでは非常に大きな変数です。モニターとは、「ディスクに録音する」、「特定のしきい値を超える音量レベルを検出する」、または「周波数ドメインでより高いレベルの分析を実行する (つまり、従来の信号処理)」を意味します。これら 3 つは、CPU 使用率と Python の実現可能性に対して非常に異なる意味を持ちます。やりたいことによっては、Python が最適ではない場合があります。

Python を使用する場合は、次の点に注意してください。

  • Python の音声サポートは非​​常に弱い
  • Python ALSA バインディング (pyalsa) は、シーケンサー、ミキサー、およびハードウェア制御用であり、PCM サンプルの読み取りではありません (ただし、バインディングはデバイスの管理に役立つ場合があります)。
  • Python には、特定のマルチスレッド条件 (GIL — グローバル インタープリター ロックを参照) で問題があり、個別の Python プロセスを使用することで完全に回避できますが、これはすべての場合に望ましいわけではありません (マルチコア/プロセッサ システムで、20 個のオーディオ入力を監視する負荷を CPU 間で分割したい)。
  • オーディオ分析で予想されるような CPU とメモリを集中的に使用する操作は、Python の得意分野ではありません。そうは言っても、PCM データは struct.unpack() を介してアンパックでき、シグナル分析は NumPy と SciPy にあるルーチンで実行できます。

各ライン入力とマイクは立体的で、効果的にそれぞれ 2 つのマイク入力を提供する必要があります。これは、サウンド カードごとに 4 つのマイクです。わずか 20 入力と仮定すると、5 つの USB オーディオ アダプターを意味します。ところで、ライン入力を使用するには、必要以上に高価なマイクプリアンプが必要になります。その場合、20 入力に対して 10 個の USB オーディオ アダプターが必要になります。

ほとんどのローエンド ハブは、おそらく 5 ~ 10 個のオーディオ アダプターのトラフィックを処理できないことに注意してください。さらに言えば、十分なアップストリーム帯域幅があることを確認するために、USB 2.0 ハイスピード ハブ (実際のオーディオ デバイスが USB 1.1 フルスピードまたはそれより低速であっても) を持っているはずです。オプションがあれば、4 つまたは 5 つの外部 USB ポートを備えた PCI USB アダプタ カードを入手するのは難しくありません。ところで、あなたが示している USB デバイスには、ステレオ出力とマイク入力しかありません (ライン入力はありません)。

ところで、理想的には USB アイソクロナス転送モードを使用して低遅延と一貫した配信を実現しますが、ALSA ドライバーがそれをサポートしているとは思えません。

USB サウンド カードの論理から物理へのマッピングに関しては、一連の udev ルールを使用すると、USB 階層、または必要に応じてシリアル番号 (デバイスにシリアル番号がある場合) またはその他に基づいて、便利で一貫したデバイス命名スキームを指定できます。属性。いずれにせよ、udev ルールを使用して、ID または物理的な場所 (選択したとおり) によってオーディオ デバイスのマッピングを安定化できるはずです。

私はpyUSBについて何も知りませんが、アイソクロナス転送モードをサポートしていることがわかります。一見すると、pyUSB は非常に正確な制御を可能にしますが、あなたがやろうとしていたよりも多くのコーディングを行うことになると思います (基本的には、USB オーディオ クラス ドライバーの優れた部分を Python で実装する必要があります)。

それが役立つことを願っています!

于 2010-06-23T07:29:32.667 に答える
4

ハードウェアの場合、1つの提案は複数のサウンドカードです。もう1つは、一連のUSBハブとマイクアダプター(これらのような)です。

これらは複数のサウンドカードでもあります。それぞれが独立してクロックされるUSBオーディオデバイスクラスインターフェイスを備えているため、同期しようとすると問題が発生する可能性があります。

一度に20個くらい実行しようとしたことはありませんが、信頼性が非常に低いと感じています。これらのものは、その種の使用法のために設計されていない安価な消費者向けキットです。USB 2.0の帯域幅制限に悩まされることはないでしょうが、それよりずっと前に確実に動作しなくなると思います。リンクした特定のモデルの価値については、レビューが非常に貧弱です。

可能であれば、複数の入力を備えたハイエンドのサウンドカードを検討してください。たとえば、Delta-1010LTは手頃な価格で、ALSAによってサポートされているようです。外部ボックス(USB、Firewire、RMEのもの)には、さらに多くの8+入力の可能性があります。ESIは16入力ラックを作成しますが、ALSAのドライバーの状況は疑わしいようです。

オーディオ入力の複数のチャネルを一度に引き出すことができる単一の同期されたデバイスは、多くの個別のサウンドカードよりもはるかに簡単に処理できます。Pythonで直接サンプルをいじりたくないかもしれませんが、PySndObjのようなものを使用して、より高レベルの処理/分析ツールキットをPythonに接続することができます。

于 2010-06-23T11:11:55.033 に答える
1

個人的には、そもそもこれらすべての入力をサポートするデジタル ミキシング デスクのようなハードウェアが必要であることをお勧めします。そうでなければ、複数のマイクを簡単に機能させることができるとは思えません。そして、これらすべての入力を記録するコードを書き始める前に、PC がそのようなシナリオを処理できるかどうか、またはどのように処理できるかを確認することが、論理的な最初のステップです。

また、ここで Python を推奨することも躊躇します。これは、パフォーマンスが重要な場合のように聞こえますが、*nix では、C/C++ を除いて低レベルのことはしたくありません (Windows では、おそらく C++ または C# と言うでしょう)。

于 2010-06-23T08:00:18.223 に答える
0

ヒント:20のサウンド入力をアナログ入力と考え、NationalInstrumentsカードなどのアナログ-デジタルコンバーターを使用してキャプチャします。

NatInstハードウェアを使用したプロのサウンドマッピングについて聞いたこともあります。そして(少なくともWindowsの場合、Linuxの場合はわかりませんが)ソフトウェアサポートは優れています。

このUsbDAQデバイスは、14ビット、48 KS /sで1つのUSBポートのみを備えた14SE(シングルエンド)アナログ入力をサポートします。

はい、少なくともLabviewにはLinuxバージョンがあります。

于 2010-06-23T11:31:35.803 に答える
0

遅延を気にしないのであれば、USB 経由のオーディオは問題ありませんが、特に 20 台のデバイスで 20 チャンネルで動作するかどうかは真剣に疑問です。

おそらくPresonusから、いくつかの大きなFirewireインターフェース(8チャンネル以上)を入手してください。Linux サウンド システムでサポートされているものを見つけてください。自分でバスを処理したくありません。可能であれば、DAW アプリケーションを使用してオーディオを取得します。処理が必要な場合は、ゼロから始めるよりもプラグインを作成する方がおそらく簡単です。Python でマルチトラック録音を行うための適切なライブラリを知りません。

于 2010-06-23T07:51:48.323 に答える
0

今日、無料または安価でこれを行うソフトウェアが存在します。課題は、入力を取得することです。

これがビジネス向けで、そのビジネスがそれに依存している場合は、Logic Express / Logic Pro または Pro Tools ソリューションをお勧めします。数ドルを費やして、正しく機能させてください。

うまく機能するフリー ソフトウェアは、Audacity (すべてのプラットフォーム)、Garageband (Mac)、Ardour (Linux、Mac) などです。

システムに 20 個のモノラル オーディオ入力を取得するには、20 個のマイクすべてをミキシング ボードに接続して 1 つのチャンネルのミックスダウンを録音するのではなく、20 個 (またはそれ以上) の入力を持つものを使用することを検討する必要があります。

于 2010-08-20T17:29:35.673 に答える
0

これは数か月遅れているようですが、他の誰かが恩恵を受ける可能性があります. 複数の USB デバイスを識別し、それぞれを区別することは、かなり簡単です... 通常は。

最も安価な USB デバイスの多くは、一意のシリアル番号を持っていません。かなり高価なもの (たとえば、Zoom 4595 Aircard) でさえありません。この場合、良い方法はありません...最前線まで戦うことができた方は、/dev/n0、次の/dev/n1などになります。

しかし、固有のシリアルがある場合は、特定のシリアル番号が /dev/n4 であることを指定する udev ルールを作成できます。Udev ルールは弱者向けではありません。マスターするのに数週間かかりましたが、これらのことを可能にすることができます。

于 2010-08-20T16:51:34.470 に答える
0

あなたが最終的に何をしたかを伝えるのは興味深い. arecord20プロセスのキャプチャと1プロセスのような単純なものaplayが仕事をすることができるかどうか疑問に思っています。

たとえば、20 個のキャプチャarecordプロセスを開始し、それらの stdout をパイプしteeて、ファイルとパイプに書き込みます。catにパイプを送り込む20 のプロセスも開始し/dev/nullます。これらすべてのプロセスの PID を追跡する必要があります。入力の一部を監視したい場合は、対応する cat プロセスを強制終了aplayし、パイプからフィードを開始します (おそらくcatプロセスを再度使用します)。

これで、これらすべてのプロセスを制御するためのフロントエンドのみが必要になります。ここで、プログラムで各入力のグラフを視覚的に表示して、アクティブなチャネルを概観できるようにしたいと思うでしょう。teeしかし、基本的には、すでに動作しているプロセスによって供給されるそのジョブを実行する単純なプログラムによっても達成できます。

ところでtee、生データを Speex エンコーダーに直接フィードして、最終的なフォーマットで直接ディスクに保存することができます。監視のために生データを使用している間。

于 2013-09-05T19:23:44.317 に答える