Überwachen des Mikrofonpegels mit einem Befehlszeilentool unter Linux

17

Ich bin auf der Suche nach einem Tool, das mir in weniger als einer halben Sekunde anzeigt, ob das Mikrofon über einem bestimmten Schwellenwert Geräusche aufnimmt. (Ich plane dann, den Master-Kanal mit einem anderen Kommandozeilen-Tool wie amixer stumm zu schalten.)

Christian Neverdal
quelle

Antworten:

8

Diese Lösung vermeidet das wiederholte Schreiben auf die Festplatte, und obwohl es im schlimmsten Fall eine Sekunde statt der gewünschten weniger als eine halbe Sekunde dauert, stellte ich fest, dass es schnell genug ist, nachdem ich es ausprobiert hatte. Also, hier sind die zwei Skripte, die ich benutze:

./detect:

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"

Kaum elegant, aber es funktioniert.

Hinweis: Wenn Sie etwas allmählicher möchten, fügen Sie Folgendes hinzu:

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

für Muting und

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

zum Aufheben der Stummschaltung.

Christian Neverdal
quelle
7
Eine etwas elegantere Lösung, die eine Auflösung von einer halben Sekunde unterstützt und keine temporäre Datei erfordert: 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 ist ein bisschen übertrieben, math-blog.com/2012/07/23/… result = $ (AUDIODEV = hw: 1 rec -n stat trim 0,5 2> & 1 | grep "Maximale Amplitude" | grep -o " [0-9] \. [0-9] * $ "); echo "$ result> 0.01" | bc
kevinf
1
Denken Sie daran, dass die maximale Amplitude nicht der einzige Indikator für einen lauten Ton ist. Ein Geräusch mit einer hohen Frequenz (z. B. ein Klirren der Brille) kann von menschlichen Ohren als sehr laut empfunden werden, aber die maximale Amplitude des Sox unterscheidet sich nicht wesentlich von der niedrigsten. In einigen Fällen ist es daher sinnvoll, auch die „raue Frequenz“ zu analysieren.
Ka3ak
2

Nur die Version ohne Python-Skript und TALKING_PERIOD, die festlegt, wie viele Sekunden auf der Ebene DOWN_SOUND_PERC ertönen, wechselt dann zur Ebene 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

erledigt

R4v0
quelle
0

Es gibt ein Tool namens Pavumeter, mit dem Sie den Mikrofonpegel anzeigen können.

Stellen Sie dann den Aufnahmegeräuschpegel mit pavucontrol ein. Wechseln Sie in pavucontrol zu Eingabegeräten und stellen Sie die Mikrofonempfindlichkeit ein.

Bearbeiten: Im Bash-Skript von R4v0 ist done im Code.

Edit2: Ich wollte die Lautstärke jedes Mal erhöhen, wenn es Geräusche gibt, also habe ich nur mehr bearbeitet, als weniger zu sein, und das Gespräch peroid abgebrochen

    if (( $(echo "$nmb < 0.3" |bc -l) )); then
Haytham-med Haytham
quelle
5
"Kommandozeilen-Tool"
Deltaray
0

Ich habe das Bash-Skript modifiziert, um die Lautstärke entsprechend dem Umgebungsgeräuschpegel zu erhöhen.

Sie können minimum_volume, maximum_volume [Wert ist in Prozent] ändern.

To_Do: Inkrement noch nicht getestet. sox und bc müssen installiert sein.

#!/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
quelle
Und setzen Sie das Zeilenende in Ihrem Code-Editor auf Unix.
Haytham-Med Haytham
Könnte ich dies verwenden, um 1. auf einen Geräuschpegel zu warten, 2. eine Audiodatei 'einzublenden', 3. eine Zeitüberschreitung nach x Minuten, 4. Audio auszublenden und zu stoppen, 5. wenn der Geräuschpegel erneut erreicht wird, von fortzufahren vorheriger Punkt in der Audiodatei? Die Fade-In-Fade-Out-Funktion ist für mich nicht so wichtig wie der Resume-Teil. Wäre dies einfach zu implementieren? Ich versuche herauszufinden, wie ein automatisierter Generator für weißes Rauschen mit Bash und Standarddienstprogrammen erstellt werden kann, wenn dies möglich ist. Ich hätte fast meinen eigenen Beitrag gemacht, aber dies scheint ein Teil der Lösung zu sein, die ich suche.
BasicObject