Monitoraggio del livello del microfono con uno strumento da riga di comando in Linux


17

Sto cercando uno strumento che mi dirà, in meno di mezzo secondo, se il microfono sta rilevando un suono al di sopra di una certa soglia. (Ho in programma di silenziare il canale principale con un altro strumento da riga di comando, come amixer.)

Risposte:


8

Questa soluzione eviterà di scrivere ripetutamente su disco e, anche se nella peggiore delle ipotesi impiega un secondo invece del desiderato meno di mezzo secondo, l'ho trovato abbastanza veloce dopo averlo provato. Quindi, ecco i due script che 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"

Difficilmente elegante, ma funziona.

Nota: se si desidera una cosa più graduale, aggiungere qualcosa del genere:

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

per silenziamento e

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

per riattivare l'audio.


7
Una soluzione leggermente più elegante, che supporta la risoluzione di mezzo secondo e non richiede un file temporaneo: 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 è un po 'eccessivo, math-blog.com/2012/07/23/… risultato = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Ampiezza massima" | grep -o " [0-9] \ [0-9] * $. "); echo "$ risultato> 0,01" | bc
kevinf,

1
Tieni presente che "Ampiezza massima" non è l'unico indicatore di un suono forte. Un suono ad alta frequenza (ad esempio il tintinnio degli occhiali) può essere percepito come molto forte dalle orecchie umane, ma la "massima ampiezza" dei sox non sarà molto diversa da quella più bassa. Quindi in alcuni casi sarebbe logico analizzare anche la "frequenza approssimativa".
ka3ak,

2

Solo la versione senza script Python e TALKING_PERIOD, che imposta il numero di secondi che verranno riprodotti a livello DOWN_SOUND_PERC, quindi passa al livello 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

fatto


0

Esiste uno strumento chiamato pavumeter che ti consente di vedere il livello del microfono, Apri l'interfaccia di acquisizione del pavumeter,

Quindi regola il livello del suono di acquisizione utilizzando pavucontrol, In pavucontrol, vai ai dispositivi di input e regola la sensibilità del microfono.

Modifica: nello script bash di R4v0, done è all'interno del codice.

Edit2: Volevo aumentare il volume ogni volta che c'è rumore, quindi ho appena modificato più di essere inferiore e cancellato parlando perido

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

5
"strumento da riga di comando"
deltaray,

0

Ho modificato lo script bash per aumentare il volume in base al livello di rumore circostante.

Puoi modificare minimum_volume, maximum_volume [il valore è in percentuale].

To_Do: incremento non ancora testato. sox e bc devono essere installati.

#!/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

E imposta end-of-line nell'editor di codice su unix.
haytham-med haytham,

Potrei usare questo per 1. ascoltare un livello di rumore, 2. "dissolvenza" durante la riproduzione di un file audio, 3. timeout dopo x minuti, 4. "dissolvenza" e arresto dell'audio, 5. se il livello di rumore incontrato riprende nuovamente da punto precedente in detto file audio? La funzionalità di dissolvenza in dissolvenza non è importante quanto la parte di ripresa per me. Sarebbe facile da implementare? Sto cercando di capire come realizzare un generatore di rumore bianco automatizzato usando bash e utility standard, se possibile. Ho quasi creato il mio post, ma questo sembra in parte alla soluzione che sto cercando.
BasicObject
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.