在Linux中使用命令行工具监控麦克风电平


Answers:


8

此解决方案将避免重复写入磁盘,即使在最坏的情况下,它花费一秒钟而不是所需的不到半秒的时间,但我发现在尝试后它足够快。因此,这是我使用的两个脚本:

。/检测:

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 2012年

1
Python有点矫kill过正,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] * $“);回声“ $结果> 0.01” | BC
kevinf

1
请记住,“最大振幅”并不是唯一响亮的声音。高频率的声音(例如,叮当响的眼镜)可能被人耳感知为很大声,但是sox的“最大振幅”与最低的声音并没有很大的不同。因此,在某些情况下,分析“粗糙频率”也很有意义。
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的bash脚本中,完成操作在内部代码中。

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

并在代码编辑器中将行尾设置为Unix。
haytham-med haytham

我可以用它来1.监听噪音水平; 2.播放音频文件时“淡入淡出”; 3. x分钟后超时; 4.“淡入淡出”并停止音频; 5.如果再次达到噪音水平,则从音频文件中的上一点?对我来说,淡入淡出功能并不像简历部分那么重要。这容易实现吗?我正在尝试找出如何尽可能使用bash和标准实用程序制作自动白噪声发生器。我几乎自己发表了文章,但这似乎是我要寻找的解决方案的一部分。
BasicObject
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.