Linuxのコマンドラインツールでマイクレベルを監視する


17

マイクが特定のしきい値を超える音を拾っている場合、0.5秒以内に通知するツールを探しています。(その後、ミキサーなどの別のコマンドラインツールでマスターチャンネルをミュートする予定です。)

回答:


8

このソリューションは、ディスクへの繰り返し書き込みを回避します。最悪の場合、望ましい0.5秒未満の代わりに1秒かかりますが、試してみれば十分に高速であることがわかりました。そこで、私が使用する2つのスクリプトを以下に示します。

./detect:

while true; do
    arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>\
    &1 | grep "Maximum amplitude" | cut -d ':' -f 2 | ./check.py
    if [ $? -eq 0 ] ; then
         amixer set Master 0
    else
         amixer set Master 80
    fi
done

./check.py:

#!/usr/bin/env python
import sys

number = 0.0
thing="NO"

line = sys.stdin.readline()
thing = line.strip()
number = float(thing)

if number < 0.15:
    raise Exception,"Below threshold"

エレガントではありませんが、機能します。

注:より緩やかなものが必要な場合は、次のように追加します。

   for i in `seq 0 80 | tac`; do
      amixer set Master $i
   done

ミュートと

   for i in `seq 0 80`; do
      amixer set Master $i
   done

ミュートを解除します。


7
0.5秒の解像度をサポートし、一時ファイルを必要としない、もう少し洗練されたソリューション: while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done
nandhp

1
Pythonは少しやり過ぎです、math-blog.com / 2012/07/23 /… result = $(AUDIODEV = hw:1 rec -n stat trim 0 .5 2>&1 | grep "最大振幅" | grep -o " [0-9] \。[0-9] * $ "); echo "$ result> 0.01" | bc
ケビンフ

1
「最大振幅」だけが大きな音の指標ではないことに注意してください。高い周波数の音(メガネのチャリンという音など)は、人間の耳には本当に大きな音として知覚される場合がありますが、ソックスの「最大振幅」は最低音とそれほど変わりません。そのため、場合によっては「大まかな頻度」も分析するのが理にかなっています。
ka3ak

2

PythonスクリプトとTALKING_PERIODなしのバージョンで、DOWN_SOUND_PERCレベルで鳴る秒数を設定してから、UP_SOUND_PERCレベルに移行します。

#!/bin/bash

TALKING_PERIOD=16
UP_SOUND_PERC=65
DOWN_SOUND_PERC=45
counter=0
while true; do

echo "counter: " $counter

if [ "$counter" -eq 0 ]; then
    nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)

    echo "nmb: " $nmb

    if (( $(echo "$nmb > 0.3" |bc -l) )); then
        echo "ticho"
        amixer -D pulse sset Master 45%
        counter=$TALKING_PERIOD
    else
        echo "hlasno"
        amixer -D pulse sset Master 65%
    fi
fi

if [[ $counter -gt 0 ]]; then
        ((counter--))
fi

sleep 1

やった


0

マイクレベル、パブメーターのオープンキャプチャーインターフェースを表示できるパブメーターと呼ばれるツールがあります。

次に、pavucontrolを使用してキャプチャサウンドレベルを調整します。pavucontrolで入力デバイスに移動し、マイクの感度を調整します。

編集:R4v0によるbashスクリプトでは、完了はコード内です。

Edit2:ノイズが発生するたびに音量を上げたかったので、私はただ編集しすぎて、ペロイドの話をキャンセルしました

    if (( $(echo "$nmb < 0.3" |bc -l) )); then

5
「コマンドラインツール」
-deltaray

0

周囲のノイズレベルに応じて音量を上げるようにbashスクリプトを変更しました。

minimum_volume、maximum_volume [値はパーセント]を変更できます。

To_Do:インクリメントはまだテストされていません。soxとbcをインストールする必要があります。

#!/bin/bash

minimum_volume=20
maximum_volume=60
increment=10

counter=0
while true; do

# echo "counter: " $counter


nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)
echo "nmb: " $nmb

    if (( $(echo "$nmb <= 0.1" |bc -l) )); then
    amixer -D pulse sset Master $minimum_volume%
    else 
        if (( $(echo "$nmb <= 0.2" |bc -l) )); then
        amixer -D pulse sset Master $(($minimum_volume+ $increment))%
        else
            if (( $(echo "$nmb <= 0.3" |bc -l) )); then
            amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment))%
                else
                    if (( $(echo "$nmb <= 0.4" |bc -l) & maximum_volume>=40)); then
                    amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment))%
                    else
                        if (( $(echo "$nmb <= 0.5" |bc -l) & maximum_volume>=50)); then
                        amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment))%
                        else
                            if (( $(echo "$nmb <= 0.6" |bc -l) & maximum_volume>=60)); then
                            amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment))%  
                            else
                                if (( $(echo "$nmb <= 0.7" |bc -l) & maximum_volume>=70)); then
                                amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                else
                                    if (( $(echo "$nmb <= 0.8" |bc -l) & maximum_volume>=80)); then
                                    amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                    else
                                        if (( $(echo "$nmb <= 0.9" |bc -l) & maximum_volume>=90)); then
                                        amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                        else
                                            amixer -D pulse sset Master $(($maximum_volume+ $minimum_volume))%
                                        fi
                                    fi
                                fi
                            fi
                        fi
                    fi
                fi
            fi
        fi

sleep 1
done

そして、コードエディタで行末をunixに設定します。
ヘイサムmedヘイサム

これを使用して、1。ノイズレベルをリッスンする、2。オーディオファイルを再生する「フェード」、3。x分後にタイムアウトする、4。オーディオを「フェードアウトして停止する」、5。音声ファイルの前のポイントは?フェードインフェードアウト機能は、私にとって履歴書部分ほど重要ではありません。これは簡単に実装できますか?可能であれば、bashと標準ユーティリティを使用して自動化されたホワイトノイズジェネレーターを作成する方法を見つけようとしています。私はほとんど自分の投稿をしましたが、これは私が探している解決策の一部のようです。
-BasicObject
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.