Linux에서 명령 행 도구를 사용하여 마이크 레벨 모니터링


17

마이크가 특정 임계 값을 초과하는 소리를 들으면 0.5 초 이내에 알려주는 도구를 찾고 있습니다. 그런 다음 믹서와 같은 다른 명령 줄 도구로 마스터 채널을 음소거 할 계획입니다.

답변:


8

이 솔루션은 디스크에 반복적으로 쓰는 것을 피할 수 있으며 최악의 경우 원하는 0.5 초가 아닌 1 초가 걸리더라도 시도한 후에도 충분히 빠릅니다. 그래서 내가 사용하는 두 개의 스크립트는 다음과 같습니다.

./ 감지 :

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

음소거 해제


7
1/2 초 해상도를 지원하고 임시 파일이 필요없는 약간 더 우아한 솔루션 : 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
파이썬은 약간 과잉입니다, math-blog.com/2012/07/23/… result = $ (AUDIODEV = hw : 1 rec -n stat trim 0. 5 2> & 1 | grep "최대 진폭"| grep -o " [0-9] \. [0-9] * $ "); echo "$ result> 0.01"| bc
kevinf 2016 년

1
'최대 진폭'이 큰 소리의 유일한 지표는 아니라는 점을 명심하십시오. 고주파 (예 : 안경의 삐걱 거리는 소리) 소리는 사람의 귀에는 큰 소리로 인식 될 수 있지만 삭스의 '최대 진폭'은 가장 낮은 소리와 크게 다르지 않습니다. 따라서 경우에 따라 '거친 빈도'도 분석하는 것이 좋습니다.
ka3ak

2

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

끝난


0

pavumeter라는 도구가 있는데, 마이크 레벨, pavumeter의 Open capture interface,

그런 다음 pavucontrol을 사용하여 캡처 사운드 레벨을 조정하십시오. pavucontrol에서 입력 장치로 이동하여 마이크 감도를 조정하십시오.

편집 : R4v0의 bash 스크립트에서 done은 코드 내부에 있습니다.

Edit2 : 소음이있을 때마다 볼륨을 높이고 싶었습니다.

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

5
"명령 줄 도구"
deltaray

0

주변 소음 수준에 따라 볼륨을 높이기 위해 bash 스크립트를 수정했습니다.

minimum_volume, maximum_volume [값은 퍼센트]를 변경할 수 있습니다.

To_Do : 증분이 아직 테스트되지 않았습니다. sox와 bc가 설치되어 있어야합니다.

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

이것을 사용하여 1. 소음 수준을 듣고, 2. 오디오 파일 재생에서 '페이드', 3. x 분 후 시간 초과, 4. '페이드 아웃'및 오디오 중지, 5. 소음 수준이 다시 충족되면 해당 오디오 파일의 이전 지점? 페이드 아웃 기능의 페이드는 나에게 이력서 부분만큼 중요하지 않습니다. 구현하기가 쉬울까요? 가능한 경우 bash 및 표준 유틸리티를 사용하여 자동 화이트 노이즈 생성기를 만드는 방법을 알아 내려고합니다. 나는 거의 내 자신의 게시물을 만들었지 만 이것은 내가 찾고있는 솔루션의 일부로 보입니다.
BasicObject
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.