ตรวจสอบระดับไมโครโฟนด้วยเครื่องมือบรรทัดคำสั่งใน Linux


17

ฉันกำลังมองหาเครื่องมือที่จะบอกฉันภายในเวลาไม่ถึงครึ่งวินาทีหากไมโครโฟนกำลังรับเสียงใด ๆ ที่สูงกว่าระดับที่กำหนดไว้ (ฉันวางแผนที่จะปิดเสียงช่อง Master ด้วยเครื่องมือบรรทัดคำสั่งอื่นเช่น amixer)

คำตอบ:


8

วิธีนี้จะหลีกเลี่ยงการเขียนซ้ำ ๆ ลงบนดิสก์และแม้ว่าในกรณีที่เลวร้ายที่สุดใช้เวลาหนึ่งวินาทีแทนที่จะต้องการน้อยกว่าครึ่งวินาทีฉันก็พบว่ามันเร็วพอหลังจากลองแล้ว ดังนั้นนี่คือสองสคริปต์ที่ฉันใช้:

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

แทบจะไม่หรูหรา แต่ก็ใช้งานได้

หมายเหตุ: หากคุณต้องการสิ่งที่ค่อยเป็นค่อยไปยิ่งขึ้นเพิ่มสิ่งนี้:

   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
โซลูชันที่สวยงามกว่าเล็กน้อยซึ่งรองรับความละเอียดครึ่งวินาทีและไม่จำเป็นต้องใช้ไฟล์ชั่วคราว: 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 ค่อนข้าง overkill, math-blog.com/2012/07/23/… ผล = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "แอมพลิจูดสูงสุด" | grep -o " [0-9] \ [0-9] * $. "); echo "$ result> 0.01" | bc
kevinf

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

จากนั้นปรับระดับเสียงการจับภาพโดยใช้ pavucontrol ใน pavucontrol ไปที่อุปกรณ์อินพุตและปรับความไวของไมโครโฟน

แก้ไข: ในสคริปต์ทุบตีโดย R4v0 เสร็จแล้วจะอยู่ในรหัส

แก้ไข 2: ฉันต้องการเพิ่มระดับเสียงในแต่ละครั้งที่มีเสียงรบกวนดังนั้นฉันเพิ่งแก้ไขมากกว่าจะน้อยกว่าและยกเลิกการพูดถึง peroid

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

5
"เครื่องมือบรรทัดคำสั่ง"
deltaray

0

ฉันแก้ไขสคริปต์ทุบตีเพื่อเพิ่มระดับเสียงตามระดับเสียงโดยรอบ

คุณสามารถเปลี่ยน 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

และตั้งค่า end-of-line ในโปรแกรมแก้ไขรหัสของคุณเป็น unix
haytham-med haytham

ฉันขอใช้สิ่งนี้กับ 1. ฟังระดับเสียง 2. 'เฟด' ในการเล่นไฟล์เสียง 3. หมดเวลาหลังจาก x นาที 4. 'จาง' และหยุดเสียง 5. หากระดับเสียงดังขึ้นอีกครั้งจาก ประเด็นก่อนหน้าในไฟล์เสียงดังกล่าว? ฟังก์ชั่นการเฟดจางหายไม่สำคัญเท่ากับส่วนเรซูเม่สำหรับฉัน สิ่งนี้จะง่ายต่อการติดตั้งหรือไม่ ฉันกำลังพยายามหาวิธีสร้างเครื่องกำเนิดเสียงสีขาวอัตโนมัติโดยใช้ bash และยูทิลิตี้มาตรฐานถ้าเป็นไปได้ ฉันเกือบจะสร้างโพสต์ของตัวเองแล้ว แต่นี่ดูเหมือนเป็นส่วนหนึ่งในการแก้ปัญหาที่ฉันกำลังมองหา
BasicObject
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.