Câu hỏi Làm thế nào để làm cho một máy "màn hình trống" trong một khoảng thời gian (như một hình phạt) nếu đạt được mức độ ồn nhất định?


Con tôi (4 và 5) hét lên rất nhiều khi chơi game trên máy tính. Tôi đã tìm ra cách chữa trị hiệu quả cho việc này. Khi tôi nghe thấy tiếng động lớn, tôi nhảy vào máy tính trò chơi và làm:

chvt 3;  sleep 15;  chvt 7 

Thao tác này sẽ tắt màn hình trong 15 giây trên Linux. Tôi đã nói với họ rằng máy tính không thích tiếng ồn lớn. Họ hoàn toàn tin điều này và cầu xin máy tính cho sự tha thứ. Họ trở nên yên lặng hơn nhiều, nhưng không đến mức tôi sẽ hạnh phúc, và vì vậy tôi cần phải tiếp tục quá trình giáo dục này. Tuy nhiên, tôi không phải lúc nào cũng làm việc này theo cách thủ công.

Có thể tự động hóa điều này không? Micrô được gắn vào hộp. Nếu mức độ ồn ào vượt qua ngưỡng nào đó thì tôi muốn chạy lệnh.


1527
2018-02-01 17:14


gốc


Cho đến khi họ học cách nhấn CTRL + ALT + F7 - Suici Doga


Các câu trả lời:


Sử dụng sox từ SoX để phân tích mẫu âm thanh ngắn:

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

Với -t .wav chúng tôi chỉ định chúng tôi xử lý loại wav, "|arecord -d 2" thực thi arecord   chương trình trong hai giây, -n đầu ra cho tệp rỗng và với stat chúng tôi chỉ định chúng tôi muốn thống kê.

Đầu ra của lệnh này, trên hệ thống của tôi với một số bài phát biểu nền, là:

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

Biên độ tối đa sau đó có thể được trích xuất thông qua:

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

Chúng tôi grep cho dòng chúng ta muốn, sử dụng tr để cắt bỏ các ký tự khoảng trắng và sau đó cut nó bởi : nhân vật và lấy phần thứ hai mang lại cho chúng ta 0.068383 trong ví dụ này. Theo đề xuất của nhận xét, RMS là một thước đo năng lượng tốt hơn biên độ tối đa.

Bạn cuối cùng có thể sử dụng bc trên kết quả để so sánh các giá trị dấu phẩy động từ dòng lệnh:

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

Nếu bạn xây dựng một vòng lặp (xem Ví dụ Bash) cuộc gọi đó ngủ trong 1 phút, kiểm tra âm lượng và sau đó lặp lại, bạn có thể để nó chạy ẩn. Bước cuối cùng là thêm nó vào tập lệnh init hoặc tệp dịch vụ (tùy thuộc vào hệ điều hành / distro của bạn), chẳng hạn như bạn thậm chí không phải khởi chạy nó theo cách thủ công.


637
2018-02-01 17:36



Tôi sẽ không khuyến khích lấy biên độ tối đa. Nó không tốt đẹp cho những đứa trẻ khi màn hình của họ đi trống chỉ vì một người nào đó vỗ tay hoặc một cái gì đó tương tự. Trung bình có vẻ thích hợp hơn. - orlp
Chỉ cần làm rõ, bằng "trung bình" bạn có nghĩa là RMS Amplitude phải không? Biên độ trung bình sẽ gần bằng 0 nếu tiếng ồn có độ ồn nhất quán trong 2 giây (nửa âm và dương sẽ hủy lẫn nhau). - Luke
Một máy dò "năng lượng" đơn giản cho một loạt các mẫu là chỉ cần thêm giá trị của tất cả các đỉnh cùng nhau. Bạn sẽ không phải trung bình nếu bạn không muốn. Đỉnh là bất kỳ điểm nào sample[n]>sample[n-1]&&sample[n]>sample[n+1] Tôi đã sử dụng nó như một cơ chế thô sơ để đo năng lượng của một bài hát và nó hoạt động khá tốt. Chỉ cần tìm kiếm một số ma thuật mà bạn hài lòng với mức âm lượng. - Kaslai
Tôi muốn xem một đầu ra mẫu của lệnh đầu tiên của bạn khi nó thực sự đến với một đứa trẻ la hét, để tham khảo. - Alvin Wong
Đối với việc sử dụng mô tả (bắt đầu tự động + chạy mỗi vài phút) một công việc cron là công cụ thích hợp để sử dụng. Đơn giản hơn rất nhiều để thiết lập và mạnh mẽ hơn so với sử dụng init script + bash loop + sleep. - m000


Đây là cách nó có thể được thực hiện với Dữ liệu thuần túy:

Kid yell prevention using Pure Data

tàu điện là một nhịp, và "tàu điện ngầm 100" tiếp tục đập mỗi 100 ms.

Âm thanh đến từ adc ~, âm lượng được tính bằng env ~. "pd dsp 0" tắt DSP khi va đầu, "pd dsp 1" bật tính năng này. "shell" thực hiện lệnh được truyền trong một trình bao, tôi sử dụng API xrandr Linux để thiết lập độ sáng thành X, bạn cần phải điều chỉnh điều này cho Wayland.

Như bạn có thể thấy, thời gian gia hạn và khóa chiếm nhiều không gian hơn so với mã âm thanh.

Làm cho một giải pháp với bộ đệm vòng và / hoặc trung bình di chuyển nên dễ dàng hơn so với thực hiện nó với sox. Vì vậy, tôi không nghĩ rằng đó là một ý tưởng tồi để sử dụng dữ liệu thuần túy cho việc này. Nhưng màn hình trống chính nó và khóa không phù hợp với mô hình dataflow.

Tệp PD có tại gist.github.com: ysangkok - kidsyell.pd.


126
2018-02-05 16:20



rất đẹp! Bạn có thể làm điều này khá nhạy khi sử dụng kỹ thuật này: theo dõi mức âm thanh trung bình trong một phút, sau đó sử dụng nó làm đường cơ sở, để khi trẻ vượt quá 20 dB so với đường cơ sở, nó sẽ kích hoạt. Sau đó, nó sẽ tự động điều chỉnh theo mức âm thanh môi trường xung quanh. - Hans-Christoph Steiner
Vâng, điều đó có ý nghĩa @ Hans-ChristophSteiner. Nhưng theo một cách nào đó, liệu mức độ tiếng ồn xung quanh có thực sự đòi hỏi những đứa trẻ phải la lớn hơn không, vì chúng sẽ tạo ra một tỷ lệ nhỏ hơn của tiếng ồn tổng thể? Điều đó tất nhiên sẽ chỉ áp dụng nếu tiếng ồn hiện có là màu trắng hoặc màu hồng hoặc bị bỏ qua. - Janus Troelsen
nếu nó yên tĩnh hơn bình thường, như một buổi sáng cuối tuần, thì nó sẽ làm cho nó nhạy cảm hơn, vì nó luôn luôn cao hơn 20 dB so với mức môi trường xung quanh - Hans-Christoph Steiner
Đây là PD mở rộng? - nullpotent
@iccthedral: Tôi đã sử dụng pd-extended để làm cho nó, nhưng tôi không biết nếu tôi sử dụng bất kỳ cấu trúc cụ thể mở rộng pd. - Janus Troelsen


Kiểm tra "Cách phát hiện sự hiện diện của âm thanh / âm thanh" của Thomer M. Gil.

Về cơ bản nó ghi lại âm thanh mỗi 5 giây, hơn là kiểm tra biên độ âm thanh, sử dụng soxvà quyết định xem có kích hoạt tập lệnh hay không. Tôi nghĩ bạn có thể dễ dàng điều chỉnh ruby kịch bản cho trẻ em của bạn! Hoặc bạn có thể chọn để hack đi trên kịch bản Python (sử dụng PyAudio) mà ông đã cung cấp là tốt.


100
2018-02-01 17:32



Còn những vụ nổ đó chưa đầy 5 giây để tránh bị phát hiện thì sao? - RhysW


Bạn có thể lấy thông tin từ micrô bằng cách thực hiện một số việc như:

arecord -d1 /dev/null -vvv

Bạn có thể phải chơi với các cài đặt một chút, chẳng hạn như:

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

Từ đó trở đi, đó là một vấn đề đơn giản khi phân tích cú pháp đầu ra.


52
2018-02-01 17:28





Đây là một trong những câu hỏi thú vị hơn mà tôi đã nhìn thấy. Tôi muốn cảm ơn tucuxi  cho một câu trả lời tốt; mà tôi đã đặt làm tập lệnh 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



Nếu bạn bắt đầu hoạt động này bằng cách thêm một dòng vào /etc/rc4.d/S99rc.local và sau đó thay đổi micrô đầu vào từ chưa được sửa đổi thành 100% bạn cũng có thể bị ném sang tty3 (bạn có thể lùi lại trước khi ngủ với Ctrl + Alt + F7) và nếu bàn phím của bạn quá to để mở một thiết bị đầu cuối, hãy chạy sudo killall too_loud rồi nhấn Ctrl + Alt + F1 và đăng nhập ở đó.) - Alexx Roche


2 xu của tôi cho giải pháp C hoặc C ++: có thể không phải là cách tiếp cận hiệu quả nhất, nhưng trên Linux, bạn có thể sử dụng API ALSA (được xây dựng trong thư viện xử lý âm thanh của Linux) và sử dụng một số kỹ thuật số (ví dụ, tính toán mức âm thanh trung bình mỗi giây) để có được mức độ tiếng ồn.

Sau đó, bạn có thể kiểm tra nó trong một vòng lặp vô hạn, và nếu nó lớn hơn một ngưỡng đặt trước, bạn có thể sử dụng Thư viện X11 để tắt màn hình trong vài giây, hoặc cách khác (ít thanh lịch hơn, nhưng nó hoạt động) gọi chvt lệnh sử dụng system("chvt 3; sleep 15; chvt 7 ");.


41
2018-02-01 17:32



Nếu sử dụng lệnh tôi sẽ xem xét một cái gì đó khác nhau sau đó chvt. ArchWiki có những ví dụ hay. - A.D.