Meus filhos (4 e 5) gritam muito quando jogam no computador. Eu encontrei uma cura eficaz para isso. Quando ouço barulhos altos, ssh no computador do jogo e faço:
chvt 3; sleep 15; chvt 7
Isso desligará a tela por 15 segundos no Linux. Eu disse a eles que o computador não gosta de barulhos altos. Eles acreditam totalmente nisso e pedem perdão ao computador. Eles ficaram muito mais calmos, mas não no nível em que eu seria feliz e, portanto, preciso continuar esse processo educacional. No entanto, nem sempre estou por perto para fazer isso manualmente.
É possível automatizar isso? Um microfone está conectado à caixa. Se o nível de volume ultrapassar algum limite, desejo executar um comando.
linux
audio
shell
parental-controls
Leonid Volnitsky
fonte
fonte
Respostas:
Use
sox
do SoX para analisar uma pequena amostra de áudio:Com
-t .wav
especificamos nós processamos o tipo wav,"|arecord -d 2"
executa oarecord
programa por dois segundos,-n
saídas para o arquivo nulo e comstat
nós especificamos que queremos estatísticas.A saída deste comando, no meu sistema com algum discurso em segundo plano, é:
A amplitude máxima pode então ser extraída através de:
Nós
grep
para a linha que queremos, usartr
para aparar os caracteres de espaço e, em seguida,cut
pelo:
caráter e tomar a segunda parte, que nos dá0.068383
neste exemplo. Conforme sugerido pelos comentários, o RMS é uma melhor medida de energia que a amplitude máxima.Você pode finalmente usar
bc
no resultado para comparar valores de ponto flutuante na linha de comando:Se você criar um loop (consulte os exemplos do Bash ) que chama suspensão por 1 minuto, testa o volume e depois repete, você pode deixá-lo em execução em segundo plano. O último passo é adicioná-lo aos scripts init ou aos arquivos de serviço (dependendo do sistema operacional / distribuição), de forma que você nem precise iniciá-lo manualmente.
fonte
sample[n]>sample[n-1]&&sample[n]>sample[n+1]
que eu usei isso como um mecanismo rudimentar para medir a energia de uma música e funciona muito bem. Basta procurar um número mágico no qual você esteja satisfeito com o nível de volume.Veja como isso pode ser feito com o Pure Data :
O metrô é um metrônomo e o "metrô 100" continua batendo a cada 100 ms.
O áudio é proveniente de adc ~, o volume é calculado por env ~. "pd dsp 0" desliga o DSP quando batido, "pd dsp 1" o liga. "shell" executa o comando passado em um shell, eu uso a API do Linux xrandr para definir o brilho como X, você precisa adaptar isso para Wayland.
Como você pode ver, o período de cortesia e o bloqueio ocupam muito mais espaço do que o código de áudio.
Fazer uma solução com buffers de anel e / ou médias móveis deve ser bem mais fácil do que fazê-lo
sox
. Portanto, não acho uma má idéia usar o Pure Data para isso. Mas a tela fica em branco e o bloqueio não se encaixa no paradigma do fluxo de dados.O arquivo PD está em gist.github.com: ysangkok - kidsyell.pd .
fonte
Marque "Como detectar a presença de som / áudio" por Thomer M. Gil .
Basicamente, ele grava o som a cada 5 segundos, em seguida, verifica a amplitude do som, usando
sox
e decide se aciona ou não um script. Eu acho que você pode facilmente adaptar oruby
script para seus filhos! Ou você pode optar por cortar o script Python (usando PyAudio) que ele também forneceu.fonte
Você pode obter informações do microfone fazendo algo como:
Pode ser necessário jogar um pouco com as configurações, como:
A partir daí, é uma simples questão de analisar a saída.
fonte
Essa é uma das perguntas mais divertidas que eu já vi. Eu gostaria de agradecer ao tucuxi por uma resposta tão boa; que defini como um script bash
fonte
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 API ALSA (biblioteca de manipulação de áudio integrada do Linux) e usar alguma técnica numérica (por exemplo, calcular o som médio cada segundo) para obter o nível de ruído.
Em seguida, você pode verificá-lo em um loop infinito e, se for maior que um limite predefinido, poderá usar a biblioteca X11 para desligar a tela por alguns segundos ou, alternativamente (menos elegante, mas funciona), invocar o
chvt
comandosystem("chvt 3; sleep 15; chvt 7 ");
.fonte
chvt
. O ArchWiki tem bons exemplos.