我正在寻找一种工具,它可以在不到半秒的时间内告诉我麦克风是否拾取了超过特定阈值的声音。(我计划使用另一个命令行工具(如 amixer)将主频道静音。)
答案1
此解决方案将避免重复写入磁盘,尽管在最坏的情况下需要一秒钟而不是期望的不到半秒的时间,但我尝试后发现它足够快。因此,以下是我使用的两个脚本:
./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
取消静音。
答案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
done
答案3
有一个叫 pavumeter 的工具可以让你查看麦克风音量,打开 pavumeter 的捕获界面,
然后使用 pavucontrol 调整捕获声音级别,在 pavucontrol 中,转到输入设备,并调整麦克风灵敏度。
编辑:在 R4v0 的 bash 脚本中,完成是在代码内部。
编辑2:每次有噪音时我都想提高音量,所以我只需将“超过”编辑为“少于”,然后取消说话时间
if (( $(echo "$nmb < 0.3" |bc -l) )); then
答案4
我对其进行了编辑,使其能够与 ffmpeg 配合使用
需要安装 sox 和 bc。
使用 -f “格式”脉冲似乎循环速度太慢,所以我使用了 alsa
对于 -i“输入”,您可以指定流
更多信息:https://trac.ffmpeg.org/wiki/Capture/PulseAudio#Selectingtheinput
#!/bin/bash
ffmpeg -y -loglevel panic -f pulse -i default -t 0.5 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2