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


1550

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

chvt 3;  sleep 15;  chvt 7 

Điều 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 tha thứ. Họ trở nên im 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 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 ở đây để làm điều này bằng tay.

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


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

1
@SuiciDoga Này; họ không biết chuyện gì đang xảy ra!
wizzwizz4

Chúc mừng cho một giải pháp kỹ thuật. Nhưng tôi nghĩ, điều quan trọng là luôn luôn nói sự thật với trẻ em.
peterh

Câu trả lời:


646

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

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

Với -t .wavchú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, -nxuất ra tệp null và với statchú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ố lời nói 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 grepcho dòng chúng tôi muốn, sử dụng trđể cắt bớt các ký tự khoảng trắng và sau cutđó theo :ký tự và lấy phần thứ hai cho chúng tôi 0.068383trong ví dụ này. Theo đề xuất của các bình luận, RMS là thước đo năng lượng tốt hơn biên độ cực đại.

Cuối cùng, bạn có thể sử dụng bckế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 ) gọi chế độ ngủ trong 1 phút, kiểm tra âm lượng và sau đó lặp lại, bạn có thể để nó chạy ở chế độ nề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 / bản phân phối của bạn), sao cho bạn thậm chí không phải khởi chạy thủ công.


282
Tôi sẽ không khuyến khích lấy biên độ tối đa. Thật không tốt cho những đứa trẻ khi màn hình của chúng bị trống chỉ vì ai đó vỗ tay hoặc một cái gì đó tương tự. Trung bình có vẻ phù hợp hơn.
orlp

34
Chỉ cần làm rõ, "trung bình" bạn có nghĩa là Biên độ RMS phải không? Biên độ trung bình sẽ gần bằng 0 nếu tiếng ồn có độ lớn nhất quán trong 2 giây (các nửa dương và âm sẽ triệt tiêu lẫn nhau).
Lu-ca

6
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 cộng giá trị của tất cả các đỉnh lại với nhau. Bạn thậm chí sẽ không phải trung bình nếu bạn không muốn. Đỉnh cao là bất kỳ điểm nào mà sample[n]>sample[n-1]&&sample[n]>sample[n+1]tôi đã sử dụng điều này 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

3
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ói đến một đứa trẻ la hét, để tham khảo.
Alvin Wong

3
Đối với việc sử dụng được mô tả (bắt đầu tự động + chạy cứ sau vài phút), công việc định kỳ là công cụ phù hợp để sử dụng. Đơn giản hơn nhiều để thiết lập và mạnh mẽ hơn so với sử dụng init script + bash loop + ngủ.
m000

131

Đây là cách nó có thể được thực hiện với Pure Data :

Phòng chống la hét bằng cách sử dụng dữ liệu thuần túy

Metro là một máy đếm nhịp và "metro 100" 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 đập, "pd dsp 1" bật nó lên. "shell" thực thi lệnh đã truyền trong shell, tôi sử dụng API Linux xrandr để đặt độ sáng thành X, bạn cần điều chỉnh lệnh 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 mã âm thanh.

Tạo một giải pháp với bộ đệm vòng và / hoặc đường trung bình di chuyển sẽ dễ dàng hơn so với thực hiện với sox. Vì vậy, tôi không nghĩ rằng đó là một ý tưởng tồi để sử dụng Pure Data cho việc này. Nhưng màn hình tự làm trống 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 .


11
rất đẹp! Bạn có thể làm cho điều này trở nên 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 những đứa trẻ vượt quá 20 dB trên đường cơ sở, nó sẽ kích hoạt. Sau đó, nó sẽ tự động điều chỉnh mức âm thanh xung quanh.
Hans-Christoph Steiner

1
Vâng, điều đó có ý nghĩa @ Hans-ChristophSteiner. Nhưng theo một cách nào đó, mức độ tiếng ồn xung quanh có thực sự đòi hỏi trẻ phải hét to hơn không, vì chúng sẽ chiếm một tỷ lệ nhỏ hơn trong 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 hồng hoặc bị bỏ qua.
Janus Troelsen

4
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ẽ khiến nó trở nên nhạy cảm hơn, vì nó sẽ 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

@iccth thờ: Tôi đã sử dụng pd-Extended để tạo ra nó, nhưng tôi không biết liệu tôi có sử dụng bất kỳ cấu trúc cụ thể mở rộng pd nào không.
Janus Troelsen

103

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 cứ sau 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ĩ rằng bạn có thể dễ dàng điều chỉnh rubykịch bản cho con của bạn! Hoặc bạn có thể chọn hack đi tập lệnh Python (sử dụng PyAudio) mà anh ấy đã cung cấp.


5
Điều gì về những vụ nổ dưới 5 giây mà tránh bị phát hiện?
RhysW

53

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, việc phân tích đầu ra là một vấn đề đơn giản.


44

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

7
Nếu bạn bắt đầu chạy bằng cách thêm một dòng vào /etc/rc4.d/S99rc.local và sau đó thay đổi mic đầu vào từ không xác định thành 100%, bạn cũng có thể bị ném sang tty3 (bạn có thể nhảy trở 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 quá_loud sau đó Ctrl + Alt + F1 và đăng nhập vào đó.)
Alexx Roche

41

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 (thư viện xử lý âm thanh tích hợp của Linux) và sử dụng một số kỹ thuật số (ví dụ: tính toán âm thanh trung bình cấp 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 ngưỡng cài đặt sẵn, 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) sẽ gọi chvtlệnh bằng cách sử dụng system("chvt 3; sleep 15; chvt 7 ");.


2
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ó các ví dụ hay.
AD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.