2012-03-29 17 views
4

コンピュータで、現在再生中のオーディオを聞くことができる小さなPythonプログラムを作成したいと思います。Pythonで現在再生中のオーディオを分析する

これはWindowsでのDirectShowでも可能ですが、Pythonからの使用方法はわかりません。しかし、DirectXを使用しないクロスプラットフォームの方法が理想的です。

+0

すべてのベストを見ることができますこれは、クロスプラットフォームな方法で可能であることを行っていない、そしてあなたがいずれかのPythonでそれを行うことができるでしょう想像するのは難しいです。 – kindall

答えて

6

一般に、サウンドカードから「何かを聞く」ためには、いくつかのオーディオツールキット/モジュールを使用する必要があります。通常は、レコードプロセス再生ルーチンを設定します。あなたのアプリケーションがハードリアルタイムのものではない場合(つまり、入力からいくつかのサンプルを逃すことができます)、PyAudioの「オーディオを数秒録音してから、ファイル "の例はtheir websiteです。
だからあなたのケースでは、あなたが希望:

  1. 録音バッファ
  2. プロセスそれ
  3. 終了条件が満たされていない場合は、バック(1)に移動します。

しかし、この場合には、
はその時に、あなたは何を記録されていないため、処理を行っている間は、入力からのサンプルを欠落していることになる(あなたは気づいているかもしれません)。
あなたはそのアプリケーションに依存している可能性があります。これはPyAudioにとって特に当てはまります。なぜなら、これはブロッキングモードしかサポートしないため、リアルタイム(ish)操作が必要な場合はスレッドを使用する必要があるからです。

リアルタイム仕様がより厳格な場合(つまり、入力からいくつかのサンプルを失うことはできません)、引き続き「レコード処理 - [再生]」ルーチンを使用しますが、今回はスレッドでそれを行い、LIFOスタック(Last In First OutまたはDeque)を介してメインプロセスと通信する必要があります。

それはこのような何かを行くだろう:

録音スレッド:

  1. 録音バッファ
  2. プッシュ(1)

からのDeque

  • 繰り返し上のデータメインプロセス:

    1. 両端キューにバッファを持っている場合、
      1. は両端キューからバッファを引い
      2. それは
    2. このように(1)

    から繰り返し、あなたの処理は上に行くことができますプロセス記録スレッドがバッファをいっぱいにして、それらをデキューに押し続ける間、それ自身のペースで。

    Pythonの場合の良い知らせは、Dequeはスレッドセーフであるため、メインプロセスとスレッドが同時にDequeにアクセスしようとすると、同期の問題は発生しません。

    もう一度、 アプリケーションによっては、ASIO protocolに基づくものなど、より高速なハードウェアに移行する必要があります。

    最終的には、
    また、1つのバッファではなくフレームで作業することを考慮するには、処理アルゴリズムを少し変更する必要があります。あるフレームから次のフレームへの操作の状態。詳細については、あなたが"overlap-add" method

  • +0

    非常に詳細な説明をありがとう!私はあなたのサウンドカードのステレオミックスを提案して有効にして、PyAudioを使い終わらせました(http://www.howtogeek.com/howto/39532/how-to-enable-stereo-mix-in-windows-7-to-record-オーディオ/)を押して現在のオーディオを聞きます。結果は次のとおりです:http://julianapena.com/2012/03/arduino-python-soundlight/ –

    関連する問題