使用 Linux 中的命令行工具监控麦克风音量

使用 Linux 中的命令行工具监控麦克风音量

我正在寻找一种工具,它可以在不到半秒的时间内告诉我麦克风是否拾取了超过特定阈值的声音。(我计划使用另一个命令行工具(如 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

相关内容