Je recherche un outil qui me dira, en moins d'une demi-seconde, si le microphone capte un son au-dessus d'un certain seuil. (Je prévois ensuite de couper le canal Master avec un autre outil de ligne de commande, comme amixer.)
Je recherche un outil qui me dira, en moins d'une demi-seconde, si le microphone capte un son au-dessus d'un certain seuil. (Je prévois ensuite de couper le canal Master avec un autre outil de ligne de commande, comme amixer.)
Réponses:
Cette solution évitera d'écrire à plusieurs reprises sur le disque, et même si cela prend le pire dans le pire des cas moins d'une demi-seconde, j'ai trouvé que c'était assez rapide après l'avoir essayé. Voici donc 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 quelque chose de plus progressif, ajoutez quelque chose comme ceci:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
pour couper le son et
for i in `seq 0 80`; do
amixer set Master $i
done
pour réactiver le son.
Juste une version sans script python et TALKING_PERIOD, qui définit combien de secondes sonneront au niveau DOWN_SOUND_PERC, puis passe au niveau 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
terminé
Il existe un outil appelé pavumètre qui vous permet de voir le niveau du microphone, interface de capture ouverte du pavumètre,
Réglez ensuite le niveau sonore de capture à l'aide de pavucontrol. Dans pavucontrol, accédez aux périphériques d'entrée et réglez la sensibilité du microphone.
Edit: Dans le script bash de R4v0, done se trouve dans le code.
Edit2: Je voulais augmenter le volume à chaque fois qu'il y a du bruit, donc je viens de modifier plus que d'être moins que et d'annuler peroid parlant
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, maximum_volume [la valeur est en pourcentage].
To_Do: incrément non encore testé. 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
while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done