Anak-anak saya (4 dan 5) sering berteriak ketika bermain game di komputer. Saya menemukan obat yang efektif untuk ini. Ketika saya mendengar suara keras, saya ssh ke komputer game dan melakukan:
chvt 3; sleep 15; chvt 7
Ini akan mematikan layar selama 15 detik di Linux. Saya sudah memberi tahu mereka bahwa komputer tidak suka suara keras. Mereka benar-benar percaya ini dan meminta maaf kepada komputer. Mereka menjadi jauh lebih tenang, tetapi tidak pada tingkat yang membuat saya bahagia, jadi saya perlu melanjutkan proses pendidikan ini. Namun, saya tidak selalu ada untuk melakukan ini secara manual.
Apakah mungkin untuk mengotomatisasi ini? Mikrofon terpasang ke kotak. Jika tingkat kenyaringan melewati beberapa ambang batas maka saya ingin menjalankan perintah.
linux
audio
shell
parental-controls
Leonid Volnitsky
sumber
sumber
Jawaban:
Gunakan
sox
dari SoX untuk menganalisis sampel audio pendek:Dengan
-t .wav
kami tentukan, kami memproses jenis wav,"|arecord -d 2"
menjalankanarecord
program selama dua detik,-n
mengeluarkan ke file nol dan denganstat
kami menentukan kami ingin statistik.Output dari perintah ini, pada sistem saya dengan beberapa pidato latar belakang, adalah:
Amplitudo maksimum kemudian dapat diekstraksi melalui:
Kami
grep
untuk baris yang kami inginkan, gunakantr
untuk memangkas karakter spasi dan kemudiancut
oleh:
karakter dan mengambil bagian kedua yang memberi kita0.068383
dalam contoh ini. Seperti yang disarankan oleh komentar, RMS adalah ukuran energi yang lebih baik daripada amplitudo maksimum.Anda akhirnya dapat menggunakan
bc
pada hasil untuk membandingkan nilai floating-point dari baris perintah:Jika Anda membuat lingkaran (lihat contoh Bash ) yang memanggil sleep selama 1 menit, menguji volume, dan kemudian mengulanginya, Anda bisa membiarkannya tetap berjalan di latar belakang. Langkah terakhir adalah menambahkannya ke skrip init atau file layanan (tergantung pada OS / distro Anda), sehingga Anda bahkan tidak harus menjalankannya secara manual.
sumber
sample[n]>sample[n-1]&&sample[n]>sample[n+1]
saya menggunakan ini sebagai mekanisme yang belum sempurna untuk mengukur energi lagu dan itu bekerja dengan cukup baik. Cukup cari nomor ajaib yang membuat Anda senang dengan level volume.Inilah cara melakukannya dengan Pure Data :
Metro adalah metronom, dan "metro 100" terus menggedor setiap 100 ms.
Audio berasal dari adc ~, volume dihitung oleh env ~. "pd dsp 0" mematikan DSP ketika menggedor, "pd dsp 1" menyalakannya. "shell" mengeksekusi perintah yang lewat di shell, saya menggunakan Linux xrandr API untuk mengatur kecerahan ke X, Anda perlu mengadaptasi ini untuk Wayland.
Seperti yang Anda lihat, masa tenggang dan penguncian memakan lebih banyak ruang daripada kode audio.
Membuat solusi dengan buffer cincin dan / atau rata-rata bergerak harus lebih mudah daripada melakukannya
sox
. Jadi saya pikir itu bukan ide buruk untuk menggunakan Data Murni untuk ini. Tetapi layar mengosongkan dirinya sendiri dan penguncian tidak sesuai dengan paradigma aliran data.File PD ada di gist.github.com: ysangkok - kidsyell.pd .
sumber
Centang "Cara mendeteksi keberadaan suara / audio" oleh Thomer M. Gil .
Pada dasarnya ia merekam suara setiap 5 detik, daripada memeriksa amplitudo suara, menggunakan
sox
, dan memutuskan apakah memicu skrip atau tidak. Saya pikir Anda dapat dengan mudah menyesuaikanruby
naskah untuk anak-anak Anda! Atau Anda dapat memilih untuk meretas skrip Python (menggunakan PyAudio) yang telah ia sediakan juga.sumber
Anda dapat memperoleh informasi dari mikrofon dengan melakukan sesuatu seperti:
Anda mungkin harus bermain dengan pengaturan sedikit, seperti:
Dari sana, keluar, itu masalah sederhana untuk mengurai output.
sumber
Ini adalah salah satu pertanyaan yang lebih menyenangkan yang pernah saya lihat. Saya ingin berterima kasih kepada tucuxi untuk jawaban yang begitu bagus; yang telah saya tetapkan sebagai skrip bash
sumber
2 sen saya untuk solusi C atau C ++: mungkin bukan pendekatan yang paling efektif, tetapi di Linux, Anda dapat menggunakan ALSA API (built-in library penanganan audio Linux) dan menggunakan beberapa teknik numerik (misalnya, menghitung suara rata-rata) level setiap detik) untuk mendapatkan level noise.
Kemudian Anda bisa memeriksanya dalam infinite loop, dan jika itu lebih besar dari pra-treshold, Anda dapat menggunakan pustaka X11 untuk mematikan layar selama beberapa detik, atau sebagai alternatif (kurang elegan, tetapi berfungsi)
chvt
gunakan perintah dengan menggunakansystem("chvt 3; sleep 15; chvt 7 ");
.sumber
chvt
. ArchWiki memiliki contoh yang bagus.