سؤال كيف أقوم بصنع جهاز "شاشة فارغة" لفترة من الوقت (كعقوبة) في حالة الوصول إلى مستويات معينة من الضوضاء؟


أطفالي (4 و 5) يصرخون كثيرا عند اللعب على الكمبيوتر. لقد وجدت علاجًا فعالًا لهذا. عندما أسمع أصواتًا صاخبة ، أقوم بإدخالها إلى كمبيوتر اللعبة وقم بما يلي:

chvt 3;  sleep 15;  chvt 7 

سيؤدي هذا إلى إيقاف تشغيل الشاشة لمدة 15 ثانية على نظام التشغيل Linux. أخبرتهم أن الكمبيوتر لا يحب الضوضاء العالية انهم يعتقدون تماما هذا وتوسل الكمبيوتر لغفرانه. لقد أصبحوا أكثر هدوءًا ، لكن ليس إلى المستوى الذي سأكون سعيدًا به ، ولذا أحتاج إلى مواصلة هذه العملية التعليمية. ومع ذلك ، فأنا لست دائمًا على وشك القيام بذلك يدويًا.

هل من الممكن أتمتة هذا؟ يتم إرفاق ميكروفون بالمربع. إذا كان مستوى الجهارة يمر بعض العتبة ، فأنا أريد تشغيل أمر.


1534
2018-02-01 17:14


الأصل


حتى يتعلمون الضغط على CTRL + ALT + F7 - Suici Doga
تضمين التغريدة لا يعرفون ما يحدث! - wizzwizz4


الأجوبة:


استعمال sox من عند SOX لتحليل عينة صوتية قصيرة:

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

مع -t .wav نحدد أننا نقوم بمعالجة نوع wav ، "|arecord -d 2" ينفذ arecord   برنامج لمدة ثانيتين ، -n مخرجات إلى ملف فارغ ومع stat نحدد أننا نريد إحصائيات.

إخراج هذا الأمر ، على نظامي مع بعض الكلام في الخلفية ، هو:

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

يمكن بعد ذلك استخراج السعة القصوى عبر:

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

نحن grep للخط الذي نريده ، استخدمه tr لخفض أحرف الفضاء ثم cut من قبل : شخصية واتخاذ الجزء الثاني الذي يعطينا 0.068383 في هذا المثال. كما اقترح من قبل التعليقات ، RMS هو مقياس أفضل للطاقة من السعة القصوى.

يمكنك استخدام أخيرا bc على النتيجة لمقارنة قيم الفاصلة العائمة من سطر الأوامر:

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

إذا كنت بناء حلقة (انظر باش أمثلة) تلك المكالمات ينام لمدة دقيقة واحدة ، يختبر حجم الصوت ، ثم يكرر ، يمكنك تركه قيد التشغيل في الخلفية. الخطوة الأخيرة هي إضافته إلى البرامج النصية التمهيدية أو ملفات الخدمة (حسب نظام التشغيل / التوزيعة) ، بحيث لا تحتاج إلى تشغيلها يدويًا.


640
2018-02-01 17:36



أود أن أوصيكم بأخذ أقصى السعة. ليس من اللطيف على الأطفال عندما تكون شاشتهم فارغة ، فقط لأن شخصًا ما يصفق أو يشبهه. المتوسط ​​يبدو أكثر ملاءمة. - orlp
مجرد توضيح ، من خلال "المتوسط" تعني حق RMS السعة؟ يكون متوسط ​​السعة عند مستوى قريب من الصفر إذا كانت الضوضاء ذات ارتفاع عالٍ ثابت خلال ثانيتين (الشطران الموجب والسالب سوف يلغي كل منهما الآخر). - Luke
الكاشف "الطاقة" بسيط لسلسلة من العينات هو مجرد إضافة قيمة جميع القمم معا. لن تضطر إلى حتى متوسط ​​ذلك إذا كنت لا تريد ذلك. الذروة هي فقط أي نقطة فيها sample[n]>sample[n-1]&&sample[n]>sample[n+1] لقد استخدمت هذا كآلية بدائية لقياس طاقة الأغنية وأنها تعمل بشكل جيد. ما عليك سوى البحث عن رقم سحري تكون سعيدًا بمستوى الصوت فيه. - Kaslai
أود أن أرى عينة من إخراج الأمر الأول عندما يتعلق الأمر بصبي صغير ، كمرجع. - Alvin Wong
بالنسبة للاستخدام الموصوف (بدء التشغيل التلقائي + كل بضع دقائق) فإن مهمة cron هي الأداة المناسبة للاستخدام. أكثر بساطة للإعداد وأكثر قوة من استخدام برنامج نصي init + bash loop + sleep. - m000


وإليك كيف يمكن القيام به بيانات نقية:

Kid yell prevention using Pure Data

مترو هو المسرع ، و "المترو 100" يبقي ضجيجا كل 100 مللي ثانية.

الصوت قادم من adc ~ ، يتم حساب وحدة التخزين بواسطة env ~. "pd dsp 0" يقوم بإيقاف تشغيل DSP عند خرقه ، "pd dsp 1" يقوم بتشغيله. "shell" ينفذ الأمر الذي تم تمريره في shell ، أستخدم واجهة برمجة التطبيقات Linux xrandr لتعيين السطوع على X ، تحتاج إلى تكييف هذا مع Wayland.

كما ترى ، فإن فترة السماح والأقفال تأخذ مساحة أكبر من مساحة رمز الصوت.

يجب أن يكون إجراء الحل مع المخازن المؤقتة الحلزونية و / أو المتوسطات المتحركة أسهل بكثير من القيام بها sox. لذلك لا أعتقد أنها فكرة سيئة لاستخدام بيانات نقية لهذا الغرض. ولكن لا تتماشى الشاشة التي تم مسح نفسها والقفل مع نموذج تدفق البيانات.

ملف PD في gist.github.com: ysangkok - kidsyell.pd.


128
2018-02-05 16:20



لطيف جدا! يمكنك جعل ذلك مستجيبًا تمامًا باستخدام هذه التقنية: تتبع مستوى الصوت المتوسط ​​خلال دقيقة واحدة ، ثم استخدم ذلك كخط أساس ، بحيث عندما يتجاوز الأطفال 20 ديسيبل فوق خط الأساس ، يتم تشغيله. ثم سيتم ضبطه تلقائيًا على مستوى الصوت المحيط. - Hans-Christoph Steiner
نعم ، هذا من المنطقي @ Hans-ChristophSteiner. ولكن بطريقة ما ، ألن يكون مستوى الضوضاء المحيطة يتطلب من الأطفال أن يصرخوا بصوت أعلى ، حيث أنهم سيشكلون نسبة أصغر من الضوضاء الكلية؟ وهذا بالطبع لا ينطبق إلا إذا كان الضجيج الحالي أبيض أو وردي أو تم تجاهله بطريقة أخرى. - Janus Troelsen
إذا كان أكثر هدوءًا من المعتاد ، مثل صباح يوم عطلة نهاية الأسبوع ، فإن ذلك سيجعله أكثر حساسية ، لأنه سيكون دائمًا 20 ديسبل فوق المستوى المحيط - Hans-Christoph Steiner
هذا هو تمديد PD؟ - nullpotent
iccthedral: لقد استخدمت pd-extended لنجعله ، ولكن لا أعرف ما إذا كنت قد استخدمت أي بنيات محددة ممددة pd. - Janus Troelsen


التحقق من "كيف للكشف عن وجود الصوت / الصوت" من قبل تومر م. جيل.

أساسا يسجل الصوت كل 5 ثوان ، من الشيكات لسعة الصوت ، وذلك باستخدام sox، ويقرر ما إذا كان تشغيل برنامج نصي أم لا. أعتقد أنه يمكنك بسهولة تكييف ruby النصي لأطفالك! أو يمكنك اختيار التخلص من نص Python النصي (باستخدام PyAudio) الذي قدمه أيضًا.


101
2018-02-01 17:32



ماذا عن تلك الانفجارات التي تقل مدتها عن 5 ثوانٍ والتي تتجنب الكشف عنها؟ - RhysW


يمكنك الحصول على معلومات من الميكروفون من خلال إجراء ما يلي:

arecord -d1 /dev/null -vvv

قد يتعين عليك اللعب باستخدام الإعدادات قليلاً ، مثل:

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

من الآن فصاعدًا ، إنها مسألة بسيطة في تحليل الناتج.


52
2018-02-01 17:28





هذا هو واحد من أكثر الأسئلة متعة التي رأيتها. اود ان اشكر tucuxi  لمثل هذه الاجابة الجميلة. التي قمت بتعيينها كبرنامج نصي 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



إذا قمت بتشغيل هذا التشغيل عن طريق إضافة سطر إلى /etc/rc4.d/S99rc.local ومن ثم تغيير ميكروفون الإدخال من غير معدل إلى 100٪ ، فيمكن أن ينتهي بك الأمر أيضًا إلى tty3 (يمكنك الرجوع إلى الخلف قبل النوم مع Ctrl + Alt + F7) ، وإذا كانت لوحة المفاتيح لديك مرتفعة للغاية لفتح محطة ، لتشغيل sudo killall too_loud ثم Ctrl + Alt + F1 وتسجيل الدخول هناك.) - Alexx Roche


بلدي 2 سنت للحل C أو C ++: ربما ليس النهج الأكثر فعالية ، ولكن على لينكس ، يمكنك استخدام ALSA API (مدمجة في مكتبة معالجة الصوت في Linux) واستخدم بعض التقنيات الرقمية (على سبيل المثال ، حساب متوسط ​​مستوى الصوت كل ثانية) للحصول على مستوى الضوضاء.

ثم يمكنك التحقق من ذلك في حلقة لا نهائية ، وإذا كان أكبر من مسافة محددة مسبقًا ، فيمكنك استخدام مكتبة X11 لإيقاف الشاشة لبضع ثوان ، أو بدلا من ذلك (أقل أنيقة ، لكنه يعمل) استدعاء chvt الأمر باستخدام system("chvt 3; sleep 15; chvt 7 ");.


41
2018-02-01 17:32



إذا كنت تستخدم الأمر ، فأعتبر شيئًا مختلفًا chvt. ArchWiki لديه أمثلة لطيفة. - A.D.