Monitorando o nível do microfone com uma ferramenta de linha de comando no Linux

14

Estou procurando uma ferramenta que me diga, em menos de meio segundo, se o microfone está captando qualquer som acima de um certo limite. (Eu planejo então silenciar o canal Master com outra ferramenta de linha de comando, como o amixer.)

    
por Christian Neverdal 05.07.2011 / 22:14

3 respostas

8

Esta solução evitará escrever repetidamente em disco, e mesmo que no pior caso leve um segundo em vez do desejado em menos de meio segundo, descobri que ele é rápido o suficiente depois de experimentá-lo. Então, aqui estão os dois scripts que eu uso:

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

Pouco elegante, mas funciona.

Nota: Se você quiser algo mais gradual, adicione algo assim:

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

para silenciar e

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

para ativar o som.

    
por 06.07.2011 / 00:23
2

Existe uma ferramenta chamada pavimenteter que permite ver o nível do microfone, Abra a interface de captura do pavilhão,

Em seguida, ajuste o nível de som de captura usando o pavucontrol, No pavucontrol, acesse os dispositivos de entrada e ajuste a sensibilidade do microfone.

    
por 18.12.2015 / 09:11
0

Apenas a versão sem script python e TALKING_PERIOD, que configura quantos segundos o som estará no nível DOWN_SOUND_PERC e, em seguida, vai para o nível 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

concluído

    
por 12.05.2017 / 17:09