web-dev-qa-db-fra.com

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

Je cherche un outil qui me le dira, en moins d'une demi-seconde, si le microphone ramasse tout son au-dessus d'un certain seuil. (Je prévois de mettre ensuite sourdine la chaîne principale avec un autre outil de ligne de commande, comme Amixer.)

17
Christian Neverdal

Cette solution évitera d'écrire à plusieurs reprises sur le disque, et même si ce n'est que dans le pire des cas, prend une seconde au lieu de la désirée de moins d'une demi-seconde, je l'ai trouvé assez rapide après l'avoir essayé. Alors, voici 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 une chose plus graduelle, ajoutez quelque chose comme ceci:

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

pour la mutation et

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

pour la non-manifestation.

8
Christian Neverdal

Juste version sans python script et parle_period, qui définit le nombre de secondes Sonner au niveau Down_Sound_PERC, puis sur le niveau UP_SOUD_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é

2
R4v0

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

Ajustez ensuite le niveau de son de capture à l'aide de Pavucontrol, dans Pavucontrol, accédez aux périphériques d'entrée et ajustez la sensibilité du microphone.

Modifier: Dans le script Bash par R4V0, FAIT est à l'intérieur du code.

EDIT2: Je voulais soulever le volume chaque fois qu'il y a du bruit, je viens de modifier plus que d'être inférieur à et annulé le péroïd

    if (( $(echo "$nmb < 0.3" |bc -l) )); then
0
haytham-med haytham

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

Vous pouvez modifier Minimum_volume, MAXMAL_VOLume [Valeur est en pourcentage].

To_do: incrément non testé encore. 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
0