Контроль уровня микрофона с помощью инструмента командной строки в Linux

17

Я ищу инструмент, который сообщит мне, менее чем за полсекунды, слышит ли микрофон какой-либо звук выше определенного порога. (Затем я планирую отключить мастер-канал с помощью другого инструмента командной строки, например amixer.)

Кристиан Невердаль
источник

Ответы:

8

Это решение позволит избежать многократной записи на диск, и, хотя в худшем случае оно занимает секунду вместо желаемой менее чем полсекунды, я обнаружил, что она достаточно быстра после ее попытки. Итак, вот два сценария, которые я использую:

./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"

Вряд ли элегантно, но это работает.

Примечание: если вы хотите более постепенную вещь, добавьте что-то вроде этого:

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

для заглушения и

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

для включения звука

Кристиан Невердаль
источник
7
Немного более элегантное решение, которое поддерживает разрешение в полсекунды и не требует временного файла: 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 немного переборщил , math-blog.com/2012/07/23/… result = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Максимальная амплитуда" | grep -o " [0-9] \ [0-9] * $ "). echo "$ result> 0.01" | до н.э.
Кевинф
1
Просто помните, что «Максимальная амплитуда» не единственный показатель громкого звука. Звук с высокой частотой (например, звон очков) может восприниматься человеческими ушами как очень громкий, но сокс «Максимальная амплитуда» не будет сильно отличаться от самой низкой. Поэтому в некоторых случаях имеет смысл также анализировать «грубую частоту».
ka3ak
2

Просто версия без скрипта Python и TALKING_PERIOD, которая устанавливает, сколько секунд будет звучать на уровне DOWN_SOUND_PERC, затем переходит на уровень 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

сделано

R4v0
источник
0

Существует инструмент под названием pavumeter, который позволяет видеть уровень микрофона, интерфейс Open Capture pavumeter,

Затем отрегулируйте уровень звука захвата с помощью pavucontrol. В pavucontrol перейдите к устройствам ввода и настройте чувствительность микрофона.

Редактировать: в bash-скрипте R4v0 сделано внутри кода.

Edit2: я хотел увеличивать громкость каждый раз, когда есть шум, поэтому я просто отредактировал больше, чем быть меньше, и отменил говорить peroid

    if (( $(echo "$nmb < 0.3" |bc -l) )); then
Хайтам-Мед Хайтам
источник
5
«инструмент командной строки»
deltaray
0

Я изменил скрипт bash, чтобы увеличить громкость в соответствии с уровнем окружающего шума.

Вы можете изменить Minimum_volume, Maximum_volume [значение в процентах].

To_Do: приращение еще не проверено. sox и bc должны быть установлены.

#!/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
Хайтам-Мед Хайтам
источник
И установите конец строки в редакторе кода на unix.
Хайтам-мед Хайтам
Могу ли я использовать это для: 1. прослушивания уровня шума, 2. «затухания» при воспроизведении аудиофайла, 3. тайм-аута после x минут, 4. «затухания» и остановки звука, 5. если снова достигнут уровень шума, возобновить с предыдущий пункт в указанном аудиофайле? Функция постепенного исчезновения не так важна, как часть резюме для меня. Будет ли это легко осуществить? Я пытаюсь понять, как сделать автоматический генератор белого шума, используя bash и стандартные утилиты, если это возможно. Я почти сделал свой собственный пост, но это, кажется, часть пути к решению, которое я ищу.
BasicObject