Sto cercando uno strumento che mi dirà, in meno di mezzo secondo, se il microfono sta rilevando un suono al di sopra di una certa soglia. (Ho in programma di silenziare il canale principale con un altro strumento da riga di comando, come amixer.)
Sto cercando uno strumento che mi dirà, in meno di mezzo secondo, se il microfono sta rilevando un suono al di sopra di una certa soglia. (Ho in programma di silenziare il canale principale con un altro strumento da riga di comando, come amixer.)
Risposte:
Questa soluzione eviterà di scrivere ripetutamente su disco e, anche se nella peggiore delle ipotesi impiega un secondo invece del desiderato meno di mezzo secondo, l'ho trovato abbastanza veloce dopo averlo provato. Quindi, ecco i due script che uso:
./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"
Difficilmente elegante, ma funziona.
Nota: se si desidera una cosa più graduale, aggiungere qualcosa del genere:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
per silenziamento e
for i in `seq 0 80`; do
amixer set Master $i
done
per riattivare l'audio.
Solo la versione senza script Python e TALKING_PERIOD, che imposta il numero di secondi che verranno riprodotti a livello DOWN_SOUND_PERC, quindi passa al livello 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
fatto
Esiste uno strumento chiamato pavumeter che ti consente di vedere il livello del microfono, Apri l'interfaccia di acquisizione del pavumeter,
Quindi regola il livello del suono di acquisizione utilizzando pavucontrol, In pavucontrol, vai ai dispositivi di input e regola la sensibilità del microfono.
Modifica: nello script bash di R4v0, done è all'interno del codice.
Edit2: Volevo aumentare il volume ogni volta che c'è rumore, quindi ho appena modificato più di essere inferiore e cancellato parlando perido
if (( $(echo "$nmb < 0.3" |bc -l) )); then
Ho modificato lo script bash per aumentare il volume in base al livello di rumore circostante.
Puoi modificare minimum_volume, maximum_volume [il valore è in percentuale].
To_Do: incremento non ancora testato. sox e bc devono essere installati.
#!/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