Моніторинг рівня мікрофона за допомогою інструмента командного рядка в 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/… результат = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Максимальна амплітуда" | grep -o " [0-9] \. [0-9] * $ "); відлуння "$ результат> 0,01" | bc
kevinf

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

зроблено


0

Існує інструмент під назвою pavumeter, який дозволяє бачити рівень мікрофона, відкритий інтерфейс захоплення павуметра,

Потім відрегулюйте рівень звуку захоплення за допомогою pavucontrol, У pavucontrol перейдіть до пристроїв введення та налаштуйте чутливість мікрофона.

Редагувати: У сценарії bash від R4v0, зроблено всередині коду.

Edit2: Я хотів збільшувати гучність кожного разу, коли лунає шум, тому я просто редагував більше, ніж був меншим, і скасовував розмову з пероїдом

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

5
"інструмент командного рядка"
deltaray

0

Я змінив скрипт bash для збільшення гучності відповідно до навколишнього рівня шуму.

Ви можете змінити мінімальний об'єм, максимальний об'єм [значення у відсотках].

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.
haytham-med

Чи можу я використати це для 1. прослуховування рівня шуму, 2. 'згасання' у відтворенні аудіофайлу, 3. тайм-аут через х хвилин, 4. 'згасання' та припинення звуку, 5. якщо рівень шуму знову буде відновлено з попередній пункт у згаданому аудіофайлі? Зниження функціональності зникає не так важливо, як для мене частина резюме. Це було б легко здійснити? Я намагаюся розібратися, як зробити автоматизований генератор білого шуму, використовуючи bash та стандартні утиліти, якщо це можливо. Я майже заробив власну посаду, але це здається частиною шляху до рішення, яке я шукаю.
BasicObject
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.