Surveillance du niveau du microphone avec un outil de ligne de commande sous Linux

17

Je recherche un outil qui me dira, en moins d'une demi-seconde, si le microphone capte un son au-dessus d'un certain seuil. (Je prévois ensuite de couper le canal Master avec un autre outil de ligne de commande, comme amixer.)

Christian Neverdal
la source

Réponses:

8

Cette solution évitera d'écrire à plusieurs reprises sur le disque, et même si cela prend le pire dans le pire des cas moins d'une demi-seconde, j'ai trouvé que c'était assez rapide après l'avoir essayé. Voici donc les deux scripts que j'utilise:

./détecter:

while true; do
    arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>\
    &1 | grep "Maximum amplitude" | cut -d ':' -f 2 | ./check.py
    if [ $? -eq 0 ] ; then
         amixer set Master 0
    else
         amixer set Master 80
    fi
done

./check.py:

#!/usr/bin/env python
import sys

number = 0.0
thing="NO"

line = sys.stdin.readline()
thing = line.strip()
number = float(thing)

if number < 0.15:
    raise Exception,"Below threshold"

À peine élégant, mais ça marche.

Remarque: Si vous voulez quelque chose de plus progressif, ajoutez quelque chose comme ceci:

   for i in `seq 0 80 | tac`; do
      amixer set Master $i
   done

pour couper le son et

   for i in `seq 0 80`; do
      amixer set Master $i
   done

pour réactiver le son.

Christian Neverdal
la source
7
Une solution légèrement plus élégante, qui prend en charge une résolution d'une demi-seconde et ne nécessite pas de fichier temporaire: while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done
nandhp
1
Python est un peu exagéré, math-blog.com/2012/07/23/… resultat = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Amplitude maximum" | grep -o " [0-9] \. [0-9] * $ "); echo "$ result> 0.01" | bc
kevinf
1
N'oubliez pas que «l'amplitude maximale» n'est pas le seul indicateur d'un son fort. Un son à haute fréquence (par exemple, le tintement de lunettes) peut être perçu comme très fort par les oreilles humaines, mais l'amplitude maximale de sox ne sera pas très différente de la plus basse. Dans certains cas, il serait donc logique d'analyser également la «fréquence approximative».
ka3ak
2

Juste une version sans script python et TALKING_PERIOD, qui définit combien de secondes sonneront au niveau DOWN_SOUND_PERC, puis passe au niveau UP_SOUND_PERC.

#!/bin/bash

TALKING_PERIOD=16
UP_SOUND_PERC=65
DOWN_SOUND_PERC=45
counter=0
while true; do

echo "counter: " $counter

if [ "$counter" -eq 0 ]; then
    nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)

    echo "nmb: " $nmb

    if (( $(echo "$nmb > 0.3" |bc -l) )); then
        echo "ticho"
        amixer -D pulse sset Master 45%
        counter=$TALKING_PERIOD
    else
        echo "hlasno"
        amixer -D pulse sset Master 65%
    fi
fi

if [[ $counter -gt 0 ]]; then
        ((counter--))
fi

sleep 1

terminé

R4v0
la source
0

Il existe un outil appelé pavumètre qui vous permet de voir le niveau du microphone, interface de capture ouverte du pavumètre,

Réglez ensuite le niveau sonore de capture à l'aide de pavucontrol. Dans pavucontrol, accédez aux périphériques d'entrée et réglez la sensibilité du microphone.

Edit: Dans le script bash de R4v0, done se trouve dans le code.

Edit2: Je voulais augmenter le volume à chaque fois qu'il y a du bruit, donc je viens de modifier plus que d'être moins que et d'annuler peroid parlant

    if (( $(echo "$nmb < 0.3" |bc -l) )); then
haytham-med haytham
la source
5
"outil de ligne de commande"
deltaray
0

J'ai modifié le script bash pour augmenter le volume en fonction du niveau de bruit environnant.

Vous pouvez modifier minimum_volume, maximum_volume [la valeur est en pourcentage].

To_Do: incrément non encore testé. sox et bc doivent être installés.

#!/bin/bash

minimum_volume=20
maximum_volume=60
increment=10

counter=0
while true; do

# echo "counter: " $counter


nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)
echo "nmb: " $nmb

    if (( $(echo "$nmb <= 0.1" |bc -l) )); then
    amixer -D pulse sset Master $minimum_volume%
    else 
        if (( $(echo "$nmb <= 0.2" |bc -l) )); then
        amixer -D pulse sset Master $(($minimum_volume+ $increment))%
        else
            if (( $(echo "$nmb <= 0.3" |bc -l) )); then
            amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment))%
                else
                    if (( $(echo "$nmb <= 0.4" |bc -l) & maximum_volume>=40)); then
                    amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment))%
                    else
                        if (( $(echo "$nmb <= 0.5" |bc -l) & maximum_volume>=50)); then
                        amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment))%
                        else
                            if (( $(echo "$nmb <= 0.6" |bc -l) & maximum_volume>=60)); then
                            amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment))%  
                            else
                                if (( $(echo "$nmb <= 0.7" |bc -l) & maximum_volume>=70)); then
                                amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                else
                                    if (( $(echo "$nmb <= 0.8" |bc -l) & maximum_volume>=80)); then
                                    amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                    else
                                        if (( $(echo "$nmb <= 0.9" |bc -l) & maximum_volume>=90)); then
                                        amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                        else
                                            amixer -D pulse sset Master $(($maximum_volume+ $minimum_volume))%
                                        fi
                                    fi
                                fi
                            fi
                        fi
                    fi
                fi
            fi
        fi

sleep 1
done
haytham-med haytham
la source
Et définissez fin de ligne dans votre éditeur de code sur unix.
haytham-med haytham
Puis-je l'utiliser pour 1. écouter un niveau de bruit, 2. «fondu» dans la lecture d'un fichier audio, 3. délai d'attente après x minutes, 4. «fondu» en sortie et arrêt de l'audio, 5. si le niveau de bruit atteint recommence à partir de point précédent dans ledit fichier audio? La fonctionnalité de fondu d'entrée en sortie n'est pas aussi importante que la partie de reprise pour moi. Serait-ce facile à mettre en œuvre? J'essaie de comprendre comment faire un générateur de bruit blanc automatisé en utilisant bash et les utilitaires standard si possible. J'ai presque fait mon propre post, mais cela semble en partie à la solution que je recherche.
BasicObject