我正在寻找一种工具,可以在不到半秒钟的时间内告诉我麦克风是否正在拾取高于某个阈值的声音。(然后,我计划使用其他命令行工具(如混音器)将“主”通道静音。)
我正在寻找一种工具,可以在不到半秒钟的时间内告诉我麦克风是否正在拾取高于某个阈值的声音。(然后,我计划使用其他命令行工具(如混音器)将“主”通道静音。)
Answers:
此解决方案将避免重复写入磁盘,即使在最坏的情况下,它花费一秒钟而不是所需的不到半秒的时间,但我发现在尝试后它足够快。因此,这是我使用的两个脚本:
。/检测:
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
取消静音。
只是没有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
做完了
有一个名为pavumeter的工具,可让您查看麦克风的电平,打开pavumeter的捕获界面,
然后使用pavucontrol调整捕获声音的级别。在pavucontrol中,转到输入设备,并调整麦克风的灵敏度。
编辑:在R4v0的bash脚本中,完成操作在内部代码中。
Edit2:我想在每次出现噪音时调高音量,所以我只编辑了大于,然后取消了说话
if (( $(echo "$nmb < 0.3" |bc -l) )); then
我修改了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
while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done