Я ищу инструмент, который сообщит мне, менее чем за полсекунды, слышит ли микрофон какой-либо звук выше определенного порога. (Затем я планирую отключить мастер-канал с помощью другого инструмента командной строки, например amixer.)
3 ответа
Это решение позволит избежать многократной записи на диск, и, хотя в худшем случае оно занимает секунду вместо желаемой менее чем полсекунды, я обнаружил, что она достаточно быстра после ее попытки. Итак, вот два сценария, которые я использую:
./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
для включения звука
Существует инструмент под названием pavumeter, который позволяет видеть уровень микрофона, интерфейс Open Capture pavumeter,
Затем отрегулируйте уровень звука захвата с помощью pavucontrol. В pavucontrol перейдите к устройствам ввода и настройте чувствительность микрофона.
Просто версия без скрипта 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
сделанный
