Copiii mei (4 și 5) strigă mult atunci când joacă jocuri pe calculator. Am găsit un remediu eficient pentru asta. Când am auzit zgomote puternice, am ssh în jocul de calculator și de a face:
chvt 3; sleep 15; chvt 7
Aceasta va porni de pe ecran pentru 15 secunde pe Linux. Am'le-am spus că computerul nu't ca zgomote. Ei cred acest lucru și rugați-vă computerul pentru iertare. Ei au devenit mult mai liniștită, dar nu la nivelul la care aș fi fericit, și așa că am nevoie pentru a continua acest proces educațional. Cu toate acestea, nu sunt întotdeauna în jurul pentru a face acest lucru manual.
Este posibil pentru a automatiza acest lucru? Un microfon este atașat la cutie. Dacă nivelul de intensitate trece un prag atunci vreau să executați o comandă.
Folosesc sox` de la SoX să analizeze o scurtă mostră audio:
sox -t .wav "|arecord -d 2" -n stat
Cu -t .wav
ne vom specifica proces de tip wav, "|cronică -d 2"
execută cronică
program pentru două secunde, -n
, ieșirile de fișier null și cu stat
vom specifica vrem statisticilor.
Rezultatul acestei comenzi, pe sistemul meu cu un fundal de vorbire, este:
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read: 16000
Length (seconds): 2.000000
Scaled by: 2147483647.0
Maximum amplitude: 0.312500
Minimum amplitude: -0.421875
Midline amplitude: -0.054688
Mean norm: 0.046831
Mean amplitude: -0.000044
RMS amplitude: 0.068383
Maximum delta: 0.414063
Minimum delta: 0.000000
Mean delta: 0.021912
RMS delta: 0.036752
Rough frequency: 684
Volume adjustment: 2.370
Amplitudinea maximă poate fi apoi extras prin:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Am grep
pentru linia vrem, utilizarea tr
să tăiați spațiul de caractere și apoi cut
de :
caracter și să ia cea de-a doua parte, care ne dă `0.068383 în acest exemplu. Cum a sugerat de către comentarii, RMS este o măsură mai bună de energie decât amplitudine maximă.
În cele din urmă puteți utiliza bc
pe rezultat pentru a compara valori în virgulă mobilă de la linia de comandă:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Dacă vă construi o buclă (a se vedea Bash exemple) asta apeluri sleep timp de 1 minut, teste de volum, apoi repetă, puteți lăsați-l rulează în fundal. Ultimul pas este de a adăuga la scripturile de inițializare sau de servicii de fișiere (în funcție de sistemul dvs. de OPERARE / distro), astfel încât să nu trebuie nici măcar să-l lanseze manual.
Aici's cum se poate face cu Pur Date:
Metro este un metronom, și "100 de metrou" bate fiecare 100 ms.
Audio vine de la adc~, volumul se calculează prin env~. "pd dsp 0" se stinge DSP, atunci când a lovit, "pd dsp 1" activează. "shell" execută trecut de comandă într-o coajă, eu folosesc Linux xrandr API pentru a seta luminozitatea la X, trebuie să se adapteze pentru Wayland.
După cum puteți vedea, de grație și de blocare nevoie de mult mai mult spațiu decât audio cod nu.
Face o soluție cu inel tampon și/sau mediile mobile ar trebui să fie mult mai ușor decât a face cu sox`. Așa că am don't cred că's o idee rea de a utiliza Date Pure pentru acest lucru. Dar ecranul de decupare de sine și de blocare nu't se potrivesc cu datele paradigmă.
PD fișier este cel gist.github.com: ysangkok - kidsyell.pd.
Verifica "Cum de a detecta prezența de sunet/audio" de Thomer M. Gil.
Practic se înregistrează sunet la fiecare 5 secunde, decât controale pentru sunetul de amplitudine, folosind `sox, și decide dacă să declanșeze un script sau nu. Cred că te poți adapta cu ușurință la "ruby" script pentru copiii tăi! Sau puteți alege să hack pe Python script (folosind PyAudio) că a furnizat, de asemenea.
Puteți obține informații de la microfonul de a face ceva de genul:
arecord -d1 /dev/null -vvv
S-ar putea să se joace cu setările un pic, cum ar fi:
arecord -d1 -Dhw:0 -c2 -fS16_LE /dev/null -vvv
Din câte se pare, l's o chestiune simplă de parsarea de ieșire.
Aceasta este una dintre cele mai distractiv de întrebări pe care am'am vazut. Aș dori să mulțumesc tucuxi pentru un astfel de răspuns; că am stabilit ca un script bash
#!/bin/bash
threshold=0.001
# we should check that sox and arecord are installed
if [ $1 ]; then threshold=$1; fi
while [ 1 -gt 0 ]; do
if(( $(echo "$(sox -t .wav '|arecord -d 2' -n stat 2>&1|grep -e 'RMS.*amplitude'|tr -d ' '|cut -d ':' -f 2 ) > $threshold"|bc -l) ))
then
chvt 3; sleep 5; chvt 7;
fi
done
My 2 cents pentru C sau C++ soluție: poate nu cea mai eficientă abordare, dar pe Linux, puteți utiliza ALSA API (built-in audio bibliotecă de manipulare de Linux) și de a folosi unele numerice în tehnică (de exemplu, calcularea medie a sunetului la nivel de fiecare secundă) pentru a obține nivelul de zgomot.
Apoi, puteți verifica într-o buclă infinită, și dacă-l's mai mare decât un prag prestabilit, puteți utiliza X11 biblioteca pentru a porni de pe ecran pentru câteva secunde, sau alternativ (mai puțin elegant, dar funcționează) invoca chvt comandă folosind sistemul("chvt 3; somn 15; chvt 7 ");
.