Mes enfants (4 et 5 ans) hurlent beaucoup en jouant à des jeux sur l'ordinateur. J'ai trouvé un traitement efficace pour cela. Quand j'entends des bruits forts, je ssh dans l'ordinateur de jeu et je fais:
chvt 3; sleep 15; chvt 7
Cela éteindra l'écran pendant 15 secondes sous Linux. Je leur ai dit que l'ordinateur n'aime pas les bruits forts. Ils y croient totalement et demandent pardon à l'ordinateur. Ils sont devenus beaucoup plus calmes, mais pas au niveau où je serais heureux, et je dois donc poursuivre ce processus éducatif. Cependant, je ne suis pas toujours là pour le faire manuellement.
Est-il possible d'automatiser cela? Un microphone est attaché à la boîte. Si le niveau de volume dépasse un certain seuil, je souhaite exécuter une commande.
linux
audio
shell
parental-controls
Leonid Volnitsky
la source
la source
Réponses:
Utilisez
sox
de SoX pour analyser un échantillon audio court:Avec
-t .wav
nous spécifions nous traitons le type wav,"|arecord -d 2"
exécutons learecord
programme pendant deux secondes, les-n
sorties dans le fichier null et avecstat
nous spécifions nous voulons des statistiques.La sortie de cette commande, sur mon système avec un discours d’arrière-plan, est la suivante:
L’amplitude maximale peut alors être extraite via:
Nous,
grep
pour la ligne que nous voulons, utilisonstr
pour supprimer les caractères de l'espace, puiscut
par le:
personnage et prenons la deuxième partie qui nous donne0.068383
dans cet exemple. Comme suggéré par les commentaires, RMS est une meilleure mesure de l'énergie que l'amplitude maximale.Vous pouvez enfin utiliser
bc
le résultat pour comparer des valeurs à virgule flottante à partir de la ligne de commande:Si vous créez une boucle (voir Exemples Bash ) qui appelle la veille pendant 1 minute, teste le volume, puis se répète, vous pouvez la laisser fonctionner en arrière-plan. La dernière étape consiste à l’ajouter aux scripts d’initialisation ou aux fichiers de service (selon votre système d’exploitation / distribution), de sorte que vous n’ayez même pas besoin de le lancer manuellement.
la source
sample[n]>sample[n-1]&&sample[n]>sample[n+1]
j'ai utilisé cela comme un mécanisme rudimentaire pour mesurer l'énergie d'une chanson et cela fonctionne assez bien. Il suffit de rechercher un nombre magique auquel vous êtes satisfait du niveau de volume.Voici comment cela peut être fait avec Pure Data :
Metro est un métronome et "metro 100" n'arrête pas de frapper toutes les 100 ms.
Le son vient de adc ~, le volume est calculé par env ~. "pd dsp 0" désactive le DSP lorsqu'il est activé, "pd dsp 1" l'allume. "shell" exécute la commande passée dans un shell, j'utilise l'API xrandr de Linux pour définir la luminosité sur X. Vous devez l'adapter à Wayland.
Comme vous pouvez le constater, le délai de grâce et le verrouillage prennent beaucoup plus de place que le code audio.
Faire une solution avec des anneaux tampons et / ou des moyennes mobiles devrait être bien plus facile que de le faire avec
sox
. Donc, je ne pense pas que ce soit une mauvaise idée d'utiliser Pure Data pour cela. Mais le masquage d'écran et le verrouillage ne cadrent pas avec le paradigme du flux de données.Le fichier PD se trouve sur gist.github.com: ysangkok - kidsyell.pd .
la source
Cochez "Comment détecter la présence de son / audio" de Thomer M. Gil .
Fondamentalement, il enregistre le son toutes les 5 secondes, puis vérifie son amplitude en utilisant
sox
et décide si un script doit être déclenché ou non. Je pense que vous pouvez facilement adapter leruby
script à vos enfants! Ou vous pouvez choisir de pirater le script Python (en utilisant PyAudio) qu'il a également fourni.la source
Vous pouvez obtenir des informations à partir du microphone en procédant comme suit:
Vous pourriez avoir à jouer avec les paramètres un peu, tels que:
À partir de là, il suffit d'analyser la sortie.
la source
C'est l'une des questions les plus amusantes que j'ai vues. Je tiens à remercier Tucuxi pour cette réponse satisfaisante. que j'ai défini comme script bash
la source
Mes deux cents pour la solution C ou C ++: peut-être pas l'approche la plus efficace, mais sous Linux, vous pouvez utiliser l' API ALSA (bibliothèque de traitement audio intégrée de Linux) et utiliser une technique numérique (par exemple, calculer le son moyen niveler chaque seconde) pour obtenir le niveau de bruit.
Ensuite, vous pouvez le vérifier dans une boucle infinie et, s'il est supérieur à un seuil prédéfini, vous pouvez utiliser la bibliothèque X11 pour éteindre l'écran pendant quelques secondes, ou bien (moins élégant, mais cela fonctionne) invoquer la
chvt
commande à l'aide desystem("chvt 3; sleep 15; chvt 7 ");
.la source
chvt
. ArchWiki a de beaux exemples.