Bagaimana cara membuat mesin "layar kosong" untuk jangka waktu (sebagai hukuman) jika tingkat kebisingan mencapai?

Anak-anak saya (4 dan 5) banyak teriak ketika bermain game di komputer. Saya menemukan obat yang efektif untuk ini. Ketika saya mendengar suara keras, saya ssh ke permainan komputer dan lakukan:

chvt 3;  sleep 15;  chvt 7 

Hal ini akan mematikan layar selama 15 detik pada Linux. I've mengatakan kepada mereka bahwa komputer doesn't seperti suara keras. Mereka benar-benar percaya akan hal ini dan meminta komputer untuk pengampunan. Mereka menjadi jauh lebih tenang, tapi tidak ke tingkat yang saya akan senang, dan jadi saya perlu untuk melanjutkan proses pendidikan ini. Namun, saya tidak selalu sekitar untuk melakukan hal ini secara manual.

Apakah mungkin untuk mengotomatisasi ini? Mikrofon terpasang ke kotak. Jika tingkat kenyaringan melewati beberapa ambang batas maka saya ingin menjalankan sebuah perintah.

Mengomentari pertanyaan (3)

Gunakan sox dari SoX untuk menganalisis pendek audio sample:

sox -t .wav "|arecord -d 2" -n stat

Dengan -t .wav yang kami tentukan kami proses wav jenis, "|catatan -d 2" mengeksekusi catatan program selama dua detik, -n output ke null file dan dengan stat kita tentukan kita mau statistik.

Output dari perintah ini, pada sistem saya dengan beberapa latar belakang pidato, adalah:

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

Amplitudo maksimum kemudian dapat diekstraksi melalui:

grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2

Kami grep untuk baris yang kita inginkan, gunakan tr untuk memangkas berbagai ruang karakter dan kemudian cut dengan karakter : dan mengambil bagian kedua yang memberi kita 0.068383 dalam contoh ini. Seperti yang disarankan oleh komentar, RMS adalah ukuran yang lebih baik dari energi dari amplitudo maksimum.

Anda dapat menggunakan bc pada hasil untuk membandingkan floating-point nilai-nilai dari baris perintah:

if (( $(echo "$value > $threshold" | bc -l) )) ; # ... 

Jika anda membangun sebuah loop (lihat Bash contoh) yang menyebut tidur selama 1 menit, tes volume, dan kemudian mengulangi, anda dapat meninggalkan itu berjalan di latar belakang. Langkah terakhir adalah menambahkan untuk init script atau layanan file (tergantung pada OS / distro), seperti yang anda bahkan tidak harus menjalankannya secara manual.

Komentar (9)

Berikut ini's bagaimana hal itu bisa dilakukan dengan Pure Data:

Metro adalah metronom, dan "metro 100" terus memukul-mukul setiap 100 ms.

Audio adalah berasal dari adc~, volume dihitung dengan env~. "pd dsp 0" ternyata dari DSP ketika memukul, "pd dsp 1" ternyata. "shell" mengeksekusi berlalu perintah di shell, saya menggunakan Linux xrandr API untuk mengatur kecerahan ke X, anda perlu untuk beradaptasi ini untuk Wayland.

Seperti yang anda lihat, tenggang waktu dan penguncian memakan lebih banyak ruang dari kode audio tidak.

Membuat larutan dengan ring buffer dan/atau rata-rata bergerak harus menjadi cara yang lebih mudah daripada melakukannya dengan sox. Jadi saya don't pikir itu's merupakan ide yang buruk untuk menggunakan Data Murni untuk ini. Tapi layar blanking itu sendiri dan mengunci doesn't cocok dengan dataflow paradigma.

PD file di gist.github.com: ysangkok - kidsyell.pd.

Komentar (8)

Check "Bagaimana untuk mendeteksi adanya suara/audio" oleh Thomer M. Gil.

Pada dasarnya catatan suara setiap 5 detik, dari pemeriksaan untuk suara amplitudo, menggunakan sox, dan memutuskan jika pemicu script atau tidak. Saya pikir anda dapat dengan mudah beradaptasi ruby script untuk anak-anak anda! Atau anda bisa memilih untuk hack pada Python script (menggunakan PyAudio) bahwa ia telah memberikan juga.

Komentar (1)

Anda bisa mendapatkan informasi dari mikrofon dengan melakukan sesuatu seperti:

arecord -d1 /dev/null -vvv

Anda mungkin harus bermain dengan pengaturan yang sedikit, seperti:

arecord -d1 -Dhw:0 -c2 -fS16_LE /dev/null -vvv

Dari sana, it's masalah sederhana parsing output.

Komentar (0)

Ini adalah salah satu pertanyaan lebih menyenangkan bahwa saya've terlihat. Saya ingin mengucapkan terima kasih tucuxi untuk itu, akan kita jawab; bahwa saya telah ditetapkan sebagai sebuah bash script

#!/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
Komentar (1)

Saya 2 sen untuk C atau C++ solusi: mungkin bukan pendekatan yang paling efektif, tetapi pada Linux, anda dapat menggunakan ALSA API (built-in audio penanganan perpustakaan Linux) dan menggunakan beberapa numerik teknik (misalnya, menghitung rata-rata tingkat suara masing-masing kedua) untuk mendapatkan tingkat kebisingan.

Kemudian anda dapat memeriksa dalam loop tak terbatas, dan jika itu's lebih besar dari yang telah ditetapkan treshold, anda dapat menggunakan X11 perpustakaan untuk mematikan layar selama beberapa detik, atau alternatif (kurang elegan, tetapi bekerja) memanggil chvt perintah menggunakan system("chvt 3; tidur 15; chvt 7 ");.

Komentar (1)