Linux'ta bir komut satırı aracıyla mikrofon seviyesini izleme


17

Mikrofonun belirli bir eşiğin üzerinde herhangi bir ses alıp almadığını yarım saniyeden daha kısa sürede söyleyecek bir araç arıyorum. (Daha sonra Ana kanalı amixer gibi başka bir komut satırı aracıyla susturmayı planlıyorum.)

Yanıtlar:


8

Bu çözüm tekrar tekrar diske yazmaktan kaçınacaktır ve en kötü durumda yarım saniyeden daha az istenen yerine bir saniye sürse de, denedikten sonra yeterince hızlı buldum. İşte, kullandığım iki komut dosyası:

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

Çok zarif, ama işe yarıyor.

Not: Daha kademeli bir şey istiyorsanız, şöyle bir şey ekleyin:

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

susturmak için ve

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

yoksaymak için.


7
Yarım saniye çözünürlüğü destekleyen ve geçici bir dosya gerektirmeyen biraz daha zarif bir çözüm: 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 biraz abartılıyor , math-blog.com/2012/07/23/… sonuç = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Maksimum genlik" | grep -o " [0-9] \ [0-9] * $. "); echo "$ sonuç> 0.01" | bc
kevinf

1
Sadece 'Maksimum genlik' in yüksek bir sesin tek göstergesi olmadığını unutmayın. Yüksek frekanslı bir ses (örn. Gözlüklerin kırpılması) insan kulakları tarafından gerçekten yüksek olarak algılanabilir, ancak '' Maksimum genlik '' sox en düşük olandan çok farklı olmayacaktır. Bu nedenle bazı durumlarda 'Kaba frekans'ı da analiz etmek mantıklı olacaktır.
ka3ak

2

Python betiği ve TALKING_PERIOD içermeyen sürüm, DOWN_SOUND_PERC düzeyinde kaç saniye sesin çıkacağını ayarlayan UP_SOUND_PERC seviyesine gider.

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

tamam


0

Mikrofon seviyesini görmenizi sağlayan pavumeter adlı bir araç var, Pavumeter'in açık yakalama arayüzü,

Ardından pavucontrol'ü kullanarak yakalama ses seviyesini ayarlayın, Pavucontrol'de giriş cihazlarına gidin ve mikrofon hassasiyetini ayarlayın.

Düzenleme: R4v0 tarafından bash betiğinde, kod içinde yapılır.

Edit2: Her gürültü olduğunda ses seviyesini yükseltmek istedim, bu yüzden daha az olmaktan daha fazla düzenledim ve konuşma peroidini iptal ettim

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

5
"komut satırı aracı"
deltaray

0

Ses seviyesini çevredeki gürültü seviyesine göre artırmak için bash betiğini değiştirdim.

Minimum_volume, maximum_volume [değer yüzde olarak] değerini değiştirebilirsiniz.

To_Do: artış henüz test edilmedi. sox ve bc'nin kurulması gerekir.

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

Kod düzenleyicinizdeki satır sonu unix olarak ayarlayın.
haytham-med haytham

Bunu bir gürültü seviyesini dinlemek için kullanabilir miyim 2. bir ses dosyası oynatırken 'solmaya', 3. x dakika sonra zaman aşımına, 4. 'solmaya' ve sesi durdurmaya, 5. gürültü seviyesi tekrar karşılandıysa ses dosyasındaki bir önceki nokta? Soldurma işlevselliği, benim için devam kısmı kadar önemli değil. Bunu uygulamak kolay olur mu? Mümkünse bash ve standart yardımcı programları kullanarak otomatik beyaz gürültü üreteci yapmayı anlamaya çalışıyorum. Neredeyse kendi görevimi yaptım ama bu aradığım çözümün bir parçası gibi görünüyor.
BasicObject
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.