Monitorowanie poziomu mikrofonu za pomocą narzędzia wiersza poleceń w systemie Linux

17

Szukam narzędzia, które w mniej niż pół sekundy powie mi, czy mikrofon odbiera dźwięk powyżej pewnego progu. (Planuję następnie wyciszyć kanał główny innym narzędziem wiersza poleceń, takim jak amixer.)

Christian Neverdal
źródło

Odpowiedzi:

8

To rozwiązanie pozwoli uniknąć wielokrotnego zapisu na dysk i chociaż w najgorszym przypadku zajmuje sekundę zamiast pożądanego mniej niż pół sekundy, po wypróbowaniu okazało się, że jest wystarczająco szybkie. Oto dwa skrypty, których używam:

./wykryć:

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"

Mało elegancki, ale działa.

Uwaga: jeśli chcesz bardziej stopniowego, dodaj coś takiego:

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

do wyciszenia i

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

za wyciszenie.

Christian Neverdal
źródło
7
Nieco bardziej eleganckie rozwiązanie, które obsługuje półsekundową rozdzielczość i nie wymaga pliku tymczasowego: 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 jest nieco przesadny, wynik matematyczny.com/2012/07/23/… = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Maksymalna amplituda" | grep -o " [0–9] \. [0–9] * $ "); echo „$ wynik> 0,01” | bc
kevinf
1
Pamiętaj tylko, że „maksymalna amplituda” nie jest jedynym wskaźnikiem głośnego dźwięku. Dźwięk o wysokiej częstotliwości (np. Brzęk okularów) może być odbierany przez ludzkie uszy jako naprawdę głośny, ale „maksymalna amplituda” soxa nie będzie bardzo różna od najniższej. Dlatego w niektórych przypadkach sensowna byłaby również analiza „szorstkiej częstotliwości”.
ka3ak
2

Tylko wersja bez skryptu python i TALKING_PERIOD, która określa, ile sekund zabrzmi na poziomie DOWN_SOUND_PERC, a następnie przechodzi na poziom 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

gotowy

R4v0
źródło
0

Istnieje narzędzie o nazwie pavumeter, które pozwala zobaczyć poziom mikrofonu, otwarty interfejs przechwytywania pavumeter,

Następnie dostosuj poziom dźwięku przechwytywania za pomocą pavucontrol, W pavucontrol przejdź do urządzeń wejściowych i dostosuj czułość mikrofonu.

Edycja: W skrypcie bash autorstwa R4v0 zrobione jest wewnątrz kodu.

Edycja2: Chciałem zwiększyć głośność za każdym razem, gdy pojawia się hałas, więc właśnie edytowałem więcej niż byłem mniejszy i anulowałem rozmowę

    if (( $(echo "$nmb < 0.3" |bc -l) )); then
haytham-med haytham
źródło
5
„narzędzie wiersza poleceń”
deltaray,
0

Zmodyfikowałem skrypt bash, aby zwiększyć głośność zgodnie z poziomem hałasu otoczenia.

Możesz zmienić minimum_volume, maximum_volume [wartość wyrażona jest w procentach].

To_Do: przyrost jeszcze nie przetestowany.

#!/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
źródło
I ustaw koniec linii w edytorze kodu na unix.
haytham-med haytham
Czy mogę to wykorzystać do 1. nasłuchiwania poziomu hałasu, 2. „zanikania” podczas odtwarzania pliku audio, 3. przekroczenia limitu czasu po x minutach, 4. „zanikania” i zatrzymywania dźwięku, 5. jeśli ponownie osiągnięty poziom hałasu wznowi się od poprzedni punkt we wspomnianym pliku audio? Funkcja zwiększania / zmniejszania głośności nie jest dla mnie tak ważna jak funkcja wznawiania. Czy byłoby to łatwe do wdrożenia? Próbuję wymyślić, jak zrobić automatyczny generator białego szumu, używając bash i standardowych narzędzi, jeśli to możliwe. Prawie napisałem własny post, ale wydaje się, że jest to część rozwiązania, którego szukam.
BasicObject