Je cherche un outil qui me le dira, en moins d'une demi-seconde, si le microphone ramasse tout son au-dessus d'un certain seuil. (Je prévois de mettre ensuite sourdine la chaîne principale avec un autre outil de ligne de commande, comme Amixer.)
Cette solution évitera d'écrire à plusieurs reprises sur le disque, et même si ce n'est que dans le pire des cas, prend une seconde au lieu de la désirée de moins d'une demi-seconde, je l'ai trouvé assez rapide après l'avoir essayé. Alors, voici les deux scripts que j'utilise:
./détecter:
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"
À peine élégant, mais ça marche.
Remarque: Si vous voulez une chose plus graduelle, ajoutez quelque chose comme ceci:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
pour la mutation et
for i in `seq 0 80`; do
amixer set Master $i
done
pour la non-manifestation.
Juste version sans python script et parle_period, qui définit le nombre de secondes Sonner au niveau Down_Sound_PERC, puis sur le niveau UP_SOUD_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
terminé
Il existe un outil appelé pavumètre qui vous permet de voir le niveau de microphone, une interface de capture ouverte du pavumètre,
Ajustez ensuite le niveau de son de capture à l'aide de Pavucontrol, dans Pavucontrol, accédez aux périphériques d'entrée et ajustez la sensibilité du microphone.
Modifier: Dans le script Bash par R4V0, FAIT est à l'intérieur du code.
EDIT2: Je voulais soulever le volume chaque fois qu'il y a du bruit, je viens de modifier plus que d'être inférieur à et annulé le péroïd
if (( $(echo "$nmb < 0.3" |bc -l) )); then
J'ai modifié le script Bash pour augmenter le volume en fonction du niveau de bruit environnant.
Vous pouvez modifier Minimum_volume, MAXMAL_VOLume [Valeur est en pourcentage].
To_do: incrément non testé encore. SOX et BC doivent être installés.
#!/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