無音だけが再生された場合の検出

無音だけが再生された場合の検出

マイコンピュータは、ネットワーク経由でオンまたはオフにできるオーディオアンプに接続されています。 10分間オーディオが再生されない場合は、自動的にオフになるように設定したいと思います。

/proc/asound/card*/pcm*/sub*/statusここでオーディオが出力されていることを示す単語があるかどうかを調べるよう提案するいくつかの同様の質問を見つけましたがRUNNING、多くのプログラムではノイズが発生しなくてもオーディオが実行されるようにするようです。ただ出力を静かにするだけです。 Firefoxの実行など、一部のPythonプログラムがこれを行うことがわかりましたapulse

/proc/asound/これは、スピーカーが恒久的であるため、音声が出ないタイミングを検出できないことを意味しますRUNNING

再生される唯一のオーディオ信号が無音の場合を検出する別の方法はありますか?hwデバイスが使用中のデバイスであっても、ALSA出力を記録または傍受する方法はありますか?

答え1

soxこれはalsa(alsaループバックモジュール)のみを使用してサイレントを検出する概念実証デモです。ループバックモジュールは、サウンドを再生して再録音できる出力デバイスを提供します。たとえば、mplayerサウンド出力にループバックを直接使用し、ループバックsoxで録音を実行し、無音を検出してから元のハードウェア出力デバイスに出力できます。

モジュールのロード

sudo modprobe snd-aloop

(利用可能なカーネルモジュールのリストにあります)。aplay -lこれで、2つのデバイスを含む新しいカードが一覧表示されます。デバイス0は再生に使用され、デバイス1は録音に使用されます。 8つの独立した「サブデバイス」チャンネルがあり、通常は省略できるため、数字0を使用するのが最も簡単です。 (aplayバッグで見つけましたalsa-utils

$ aplay -l
...
card 1: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
...
  Subdevice #7: subdevice #7
card 1: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
...
  Subdevice #7: subdevice #7

これで、パッケージの他のユーティリティを使用してループバックデバイス0(サブデバイス0)から連続ビープ音を生成できます。

speaker-test -t sine -D hw:Loopback

または、たとえば、mplayerオプションのあるデバイスを使用するように指示します。-ao alsa:device=hw=Loopback

soxデバイスの反対側を読み、実際のハードウェアに書き込むように実行するまで、音は聞こえません(カード0と仮定)。

sox -q  -t alsa hw:Loopback,1  -t alsa hw:0  silence 0 1 10.0 2%

(警告をたくさん見ました。サックス警告 alsa: アンダーラン)。スピーカーのテストを停止すると、sox10秒間サイレントしてからコマンドを停止します。ミュートするとmplayer音は鳴りませんが、これはデータレベルとは関係がないようです(から削除すると可視化できます-qsoxmplayerサイレントを検出するには、音のレベルを一時停止または減らす必要があります。soxまた、オーディオに1〜2秒の遅延が発生する可能性があります。カード0の代わりにループバックデバイスをプライマリデバイスに設定するようにalsaを設定できる必要があります。

より満足のいく解決策は、カーネルサウンドドライバがリアルタイムオーディオを処理できるようにし、soxそれを使用してサイレントを検出して出力を削除することです。可能であるように見えますが、alsaだけを使用すると、少し複雑で私が持っていない知識が必要ですが、両方のデバイス、元のサウンドsoxカード、およびそれを読むことができる仮想デバイスにサウンドをコピーする例を見つけることができます。

pulseaudioを使用したより簡単なソリューションの実装監視装置可能です。pactl load-module module-combine-sink調査にも使用できます。

関連情報