Memantau tingkat mikrofon dengan alat baris perintah di Linux

17

Saya mencari alat yang akan memberi tahu saya, dalam waktu kurang dari setengah detik, jika mikrofon mengambil suara di atas ambang tertentu. (Saya berencana untuk membisukan saluran Master dengan alat baris perintah lain, seperti amixer.)

Christian Neverdal
sumber

Jawaban:

8

Solusi ini akan menghindari penulisan berulang kali ke disk, dan meskipun dalam kasus terburuk membutuhkan satu detik daripada yang diinginkan kurang dari setengah detik, saya merasa cukup cepat setelah mencobanya. Jadi, inilah dua skrip yang saya gunakan:

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

Agak elegan, tapi berhasil.

Catatan: Jika Anda menginginkan hal yang lebih bertahap, tambahkan sesuatu seperti ini:

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

untuk mematikan dan

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

untuk mengaktifkan suara.

Christian Neverdal
sumber
7
Solusi yang sedikit lebih elegan, yang mendukung resolusi setengah detik dan tidak memerlukan file sementara: 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 sedikit berlebihan, math-blog.com/2012/07/23/... result = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Amplitudo maksimum" | grep -o " [0-9] \. [0-9] * $ "); echo "$ result> 0,01" | bc
kevinf
1
Hanya perlu diingat bahwa 'Amplitudo maksimum' bukan satu-satunya indikator dari suara yang keras. Suara dengan frekuensi tinggi (misalnya denting kacamata) dapat dianggap sangat keras oleh telinga manusia tetapi sox '' Amplitudo maksimum 'tidak akan jauh berbeda dari yang terendah. Jadi dalam beberapa kasus akan masuk akal untuk menganalisis 'frekuensi kasar' juga.
ka3ak
2

Hanya versi tanpa skrip python dan TALKING_PERIOD, yang menetapkan berapa detik suara akan terdengar di tingkat DOWN_SOUND_PERC, kemudian naik ke tingkat 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

selesai

R4v0
sumber
0

Ada alat yang disebut pavumeter yang memungkinkan Anda melihat level mikrofon, Open capture interface of pavumeter,

Kemudian sesuaikan tingkat pengambilan suara menggunakan pavucontrol, Dalam pavucontrol, buka perangkat input, dan sesuaikan sensitivitas mikrofon.

Sunting: Di skrip bash oleh R4v0, yang dilakukan adalah kode di dalamnya.

Sunting2: Saya ingin menaikkan volume setiap kali ada suara, jadi saya hanya mengedit lebih dari menjadi kurang dari dan membatalkan berbicara peroid

    if (( $(echo "$nmb < 0.3" |bc -l) )); then
haytham-med haytham
sumber
5
"alat baris perintah"
deltaray
0

Saya memodifikasi skrip bash untuk menambah volume sesuai dengan tingkat kebisingan di sekitarnya.

Anda dapat mengubah minimum_volume, maksimum_volume [nilai dalam persen].

To_Do: increment belum diuji. sox dan bc perlu diinstal.

#!/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
haytham-med haytham
sumber
Dan atur end-of-line di editor kode Anda untuk unix.
haytham-med haytham
Bisakah saya menggunakan ini untuk 1. mendengarkan tingkat kebisingan, 2. 'memudar' dalam memainkan file audio, 3. batas waktu setelah x menit, 4. 'memudar' dan menghentikan audio, 5. jika tingkat kebisingan bertemu lagi melanjutkan dari titik sebelumnya dalam file audio tersebut? Fungsi fade in fade out tidak sepenting bagian resume bagi saya. Apakah ini mudah diimplementasikan? Saya mencoba mencari cara untuk membuat generator white noise otomatis menggunakan bash dan utilitas standar jika memungkinkan. Saya hampir membuat posting sendiri tetapi ini tampaknya bagian dari solusi yang saya cari.
BasicObject