लिनक्स में कमांड लाइन टूल के साथ माइक्रोफोन स्तर की निगरानी करना


17

मैं एक ऐसे उपकरण की तलाश में हूं जो मुझे बताएगा, आधे से भी कम समय में, अगर माइक्रोफोन एक निश्चित सीमा से ऊपर किसी भी ध्वनि को उठा रहा है। (मैं तब एमिक्सर की तरह एक और कमांड लाइन टूल के साथ मास्टर चैनल को म्यूट करने की योजना बना रहा हूं।)

जवाबों:


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
पाइथन थोड़ा ओवरकिल है, math-blog.com/2012/07/23/… परिणाम = $ (AUDIODEV = hw: 1 rec -n स्टेटिम ट्रिम 0 .5 2> & 1 | grep "अधिकतम आयाम"। grep -o " [0-9] \ [0-9] * $ ")।; गूंज "$ परिणाम> 0.01" | bc
kevinf

1
बस ध्यान रखें कि 'अधिकतम आयाम' केवल तेज ध्वनि का संकेतक नहीं है। उच्च आवृत्ति वाली एक ध्वनि (जैसे कि चश्मा का झुरमुट) को वास्तव में मानव कानों द्वारा जोर से देखा जा सकता है, लेकिन '' अधिकतम आयाम '' सबसे कम वाले से बहुत अलग नहीं होगा। इसलिए कुछ मामलों में 'रफ फ्रीक्वेंसी' के साथ-साथ विश्लेषण करना भी समझदारी होगी।
ka3ak

2

अजगर स्क्रिप्ट और 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 द्वारा बैश स्क्रिप्ट में, कोड के अंदर किया गया है।

Edit2: मैं हर बार आवाज़ उठाने के लिए वॉल्यूम बढ़ाना चाहता था, इसलिए मैंने अभी से अधिक संपादित किया और कम से कम होने की बात कर रहा था

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

5
"कमांड लाइन उपकरण"
डेल्टरटे

0

मैंने आसपास के शोर स्तर के अनुसार वॉल्यूम बढ़ाने के लिए बैश स्क्रिप्ट को संशोधित किया।

आप न्यूनतम_वोल्यूम बदल सकते हैं, अधिकतम_वोल्यूम [मूल्य प्रतिशत में है]।

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

और यूनिक्स के लिए अपने कोड संपादक में एंड-ऑफ-लाइन सेट करें।
हैथम-मेड हैथम

क्या मैं इसका उपयोग 1. शोर स्तर के लिए सुनने के लिए कर सकता हूं, 2. ऑडियो फ़ाइल चलाने में 'फीका', 3. एक्स मिनट के बाद का समय, 4. 'फीका' आउट और ऑडियो बंद करो, 5. यदि शोर का स्तर फिर से शुरू हुआ पिछले बिंदु में कहा ऑडियो फ़ाइल? कार्यक्षमता में फीका पड़ना मेरे लिए फिर से शुरू करने वाले हिस्से जितना महत्वपूर्ण नहीं है। क्या इसे लागू करना आसान होगा? मैं यह पता लगाने की कोशिश कर रहा हूं कि यदि संभव हो तो बैश और मानक उपयोगिताओं का उपयोग करके एक स्वचालित सफेद शोर जनरेटर कैसे बनाया जाए। मैंने लगभग अपना खुद का पद बना लिया है, लेकिन मैं जिस समाधान की तलाश कर रहा हूं, उसका यह आंशिक तरीका है।
बेसिक ऑबजेक्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.