マイクが特定のしきい値を超える音を拾っている場合、0.5秒未満で通知するツールを探しています。 (その後、ミキサーなどの別のコマンドラインツールでマスターチャネルをミュートする予定です。)
このソリューションは、ディスクへの繰り返し書き込みを回避します。最悪の場合、希望する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
ミュート解除。
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
できた
マイクのレベルを確認できるpavumeterというツールがあります。pavumeterのキャプチャインターフェイスを開きます。
次に、pavucontrolを使用してキャプチャサウンドレベルを調整します。pavucontrolで、入力デバイスに移動し、マイクの感度を調整します。
編集:R4v0によるbashスクリプトでは、doneはコード内にあります。
Edit2:ノイズが発生するたびに音量を上げたかったので、以下になるように編集し、会話のペリロイドをキャンセルしました
if (( $(echo "$nmb < 0.3" |bc -l) )); then
周囲の騒音レベルに応じて音量を上げるように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