Diese Lösung vermeidet das wiederholte Schreiben auf die Festplatte, und obwohl es im schlimmsten Fall eine Sekunde statt der gewünschten weniger als einer halben Sekunde dauert, fand ich es nach dem Versuch schnell genug. Also, hier sind die beiden Skripte, die ich verwende:
./erkennen:
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"
Kaum elegant, aber es funktioniert.
Hinweis:Wenn Sie eine schrittweisere Sache wünschen, fügen Sie so etwas hinzu:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
zum Stummschalten und
for i in `seq 0 80`; do
amixer set Master $i
done
zum Aufheben der Stummschaltung.
Nur Version ohne Python-Skript und TALKING_PERIOD, die festlegt, wie viele Sekunden auf DOWN_SOUND_PERC-Pegel klingen, und geht dann auf UP_SOUND_PERC-Pegel.
#!/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
erledigt