Pertanyaan Bagaimana cara membuat mesin "layar kosong" untuk jangka waktu tertentu (sebagai penalti) jika tingkat kebisingan tertentu tercapai?


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

chvt 3;  sleep 15;  chvt 7 

Ini akan mematikan layar selama 15 detik di Linux. Saya sudah memberi tahu mereka bahwa komputer tidak suka berisik. Mereka benar-benar percaya ini dan meminta komputer untuk pengampunan. Mereka menjadi lebih tenang, tetapi tidak sampai ke tingkat yang membuat saya bahagia, jadi saya harus melanjutkan proses pendidikan ini. Namun, saya tidak selalu melakukan ini secara manual.

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


1527
2018-02-01 17:14


asal


Sampai mereka belajar menekan CTRL + ALT + F7 - Suici Doga


Jawaban:


Menggunakan sox dari SoX untuk menganalisis sampel audio singkat:

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

Dengan -t .wav kami tentukan kami memproses tipe wav, "|arecord -d 2" mengeksekusi arecord   program selama dua detik, -n output ke file null dan dengan stat kami menetapkan bahwa kami menginginkan statistik.

Output dari perintah ini, pada sistem saya dengan beberapa pidato latar belakang, 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 diekstrak melalui:

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

Kita grep untuk garis yang kita inginkan, gunakan tr untuk memangkas karakter spasi dan kemudian cut itu oleh : karakter dan ambil bagian kedua yang memberi kita 0.068383 dalam contoh ini. Seperti yang disarankan oleh komentar, RMS adalah ukuran energi yang lebih baik daripada amplitudo maksimum.

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

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

Jika Anda membangun loop (lihat Contoh Bash) panggilan itu tidur selama 1 menit, uji volume, lalu ulangi, Anda dapat membiarkannya berjalan di latar belakang. Langkah terakhir adalah menambahkannya ke skrip init atau file layanan (tergantung pada OS / distro Anda), sehingga Anda bahkan tidak perlu meluncurkannya secara manual.


637
2018-02-01 17:36



Saya akan merekomendasikan mengambil amplitudo maksimum. Ini tidak baik untuk anak-anak ketika layar mereka menjadi kosong hanya karena seseorang bertepuk tangan atau sesuatu yang serupa. Rata-rata tampaknya lebih tepat. - orlp
Hanya klarifikasi, dengan "rata-rata" yang Anda maksud RMS Amplitude kan? Amplitudo rata-rata akan mendekati 0 jika suara bising yang konsisten selama 2 detik (bagian positif dan negatif akan membatalkan satu sama lain). - Luke
Detektor "energi" sederhana untuk serangkaian sampel adalah dengan menambahkan nilai semua puncak bersama-sama. Anda tidak harus bahkan rata-rata jika Anda tidak mau. Puncaknya adalah sembarang titik di mana sample[n]>sample[n-1]&&sample[n]>sample[n+1] Saya telah menggunakan ini sebagai mekanisme dasar untuk mengukur energi dari sebuah lagu dan itu bekerja cukup baik. Hanya mencari nomor ajaib di mana Anda senang dengan level volume. - Kaslai
Saya ingin melihat contoh output dari perintah pertama Anda ketika itu benar-benar datang ke anak yang berteriak, untuk referensi. - Alvin Wong
Untuk penggunaan yang diuraikan (mulai secara otomatis + dijalankan setiap beberapa menit), tugas cron adalah alat yang tepat untuk digunakan. Lebih mudah untuk setup dan lebih kuat daripada menggunakan skrip init + bash loop + sleep. - m000


Beginilah cara melakukannya Data Murni:

Kid yell prevention using Pure Data

Metro adalah metronom, dan "metro 100" terus membenturkan setiap 100 mdtk.

Audio berasal dari adc ~, volume dihitung oleh env ~. "pd dsp 0" mematikan DSP ketika dibanting, "pd dsp 1" menyalakannya. "shell" mengeksekusi perintah yang dilewatkan dalam shell, saya menggunakan Linux xrandr API untuk mengatur kecerahan ke X, Anda perlu menyesuaikan ini untuk Wayland.

Seperti yang Anda lihat, tenggang waktu dan penguncian membutuhkan lebih banyak ruang daripada kode audio.

Membuat solusi dengan penyangga cincin dan / atau rata-rata bergerak seharusnya jauh lebih mudah daripada melakukannya sox. Jadi saya tidak berpikir itu adalah ide yang buruk untuk menggunakan Data Murni untuk ini. Tapi layarnya kosong dan pengunciannya tidak sesuai dengan paradigma aliran data.

File PD ada di gist.github.com: ysangkok - kidsyell.pd.


126
2018-02-05 16:20



sangat bagus! Anda dapat membuat ini menjadi sangat responsif menggunakan teknik ini: lacak tingkat suara rata-rata lebih dari satu menit, kemudian gunakan itu sebagai baseline, sehingga ketika anak-anak pergi lebih dari 20 dB di atas baseline, itu memicu. Maka secara otomatis akan menyesuaikan ke tingkat suara sekitar. - Hans-Christoph Steiner
Ya, itu masuk akal @ Hans-ChristophSteiner. Tetapi dengan cara, bukankah tingkat kebisingan lingkungan sebenarnya mengharuskan anak-anak untuk berteriak lebih keras, karena mereka akan membuat proporsi yang lebih kecil dari keseluruhan kebisingan? Itu tentu saja hanya berlaku jika suara yang ada berwarna putih atau merah muda atau diabaikan. - Janus Troelsen
jika itu lebih tenang dari biasanya, seperti pagi akhir pekan, maka itu akan membuatnya lebih sensitif, karena akan selalu 20 dB di atas level ambien - Hans-Christoph Steiner
Ini adalah PD yang diperpanjang? - nullpotent
@iccthedral: Saya menggunakan pd-extended untuk membuatnya, tapi saya tidak tahu apakah saya menggunakan konstruk khusus pd-extended. - Janus Troelsen


Memeriksa "Bagaimana mendeteksi keberadaan suara / audio" oleh Thomer M. Gil.

Pada dasarnya ini merekam suara setiap 5 detik, daripada memeriksa amplitudo suara, menggunakan sox, dan memutuskan apakah memicu skrip atau tidak. Saya pikir Anda dapat dengan mudah menyesuaikan ruby naskah untuk anak-anakmu! Atau Anda dapat memilih untuk meretas skrip Python (menggunakan PyAudio) yang telah ia sediakan juga.


100
2018-02-01 17:32



Bagaimana dengan ledakan yang kurang dari 5 detik yang menghindari deteksi? - RhysW


Anda dapat memperoleh informasi dari mikrofon dengan melakukan sesuatu seperti:

arecord -d1 /dev/null -vvv

Anda mungkin harus bermain dengan pengaturan sedikit, seperti:

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

Mulai dari sana, ini adalah soal sederhana untuk mengurai output.


52
2018-02-01 17:28





Ini adalah salah satu pertanyaan yang lebih menyenangkan yang pernah saya lihat. Saya ingin berterima kasih tucuxi  untuk jawaban yang begitu bagus; yang telah saya tetapkan sebagai skrip 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

43
2018-02-08 14:10



Jika Anda mulai menjalankan ini dengan menambahkan sebuah baris ke /etc/rc4.d/S99rc.local dan kemudian mengubah mic input dari unamplified hingga 100% Anda juga dapat berakhir dibuang ke tty3 (Anda dapat melompat kembali sebelum tidur dengan Ctrl + Alt + F7), dan jika keyboard Anda terlalu keras untuk membuka terminal, jalankan sudo killall too_loud lalu Ctrl + Alt + F1 dan masuk ke sana.) - Alexx Roche


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

Kemudian Anda dapat memeriksanya dalam lingkaran tak terbatas, dan jika lebih besar dari ambang batas yang telah disetel, Anda dapat menggunakan Perpustakaan X11 untuk mematikan layar selama beberapa detik, atau alternatif (kurang elegan, tetapi berhasil) memanggil chvt perintah menggunakan system("chvt 3; sleep 15; chvt 7 ");.


41
2018-02-01 17:32



Jika menggunakan perintah, saya akan mempertimbangkan sesuatu yang berbeda chvt. ArchWiki memiliki contoh yang bagus. - A.D.