Os meus filhos (4 e 5) gritam muito quando jogam jogos no computador. Eu encontrei uma cura eficaz para isso. Quando ouço barulhos altos, meto-me no computador do jogo e faço:
chvt 3; sleep 15; chvt 7
Isto irá desligar o ecrã durante 15 segundos no Linux. I'já lhes disse que o computador não'não gosta de ruídos altos. Eles acreditam totalmente nisto e imploram ao computador por perdão. Eles se tornaram muito mais silenciosos, mas não ao nível que eu ficaria feliz, e então eu preciso continuar este processo educacional. Contudo, nem sempre estou por perto para fazer isto manualmente.
É possível automatizar isto? Um microfone está preso à caixa. Se o nível de ruído passar algum limite, então quero executar um comando.
Verifique "How to detect the presence of sound/audio" de Thomer M. Gil.
Basicamente, ele grava o som a cada 5 segundos, do que verifica a amplitude do som, utilizando o sox
, e decide se aciona ou não um script. Eu acho que você pode facilmente adaptar o script ruby
para seus filhos! Ou você pode escolher hackear o script Python (utilizando o PyAudio) que ele também forneceu.
Você pode obter informações do microfone fazendo algo como:
arecord -d1 /dev/null -vvv
Talvez você tenha que brincar um pouco com as configurações, como por exemplo:
arecord -d1 -Dhw:0 -c2 -fS16_LE /dev/null -vvv
A partir daí, é uma simples questão de analisar a produção.
Meus 2 centavos para a solução C ou C++: talvez não seja a abordagem mais eficaz, mas no Linux, você pode usar a ALSA API (biblioteca de tratamento de áudio integrada do Linux) e usar alguma técnica numérica (por exemplo, calcular o nível sonoro médio a cada segundo) para obter o nível de ruído.
Então você pode verificá-lo em um loop infinito, e se for maior que um treshold predefinido, você pode utilizar a biblioteca X11 para desligar a tela por alguns segundos, ou alternativamente (menos elegante, mas funciona) invocar o comando chvt' utilizando
system("chvt 3; sleep 15; chvt 7 ");`.