Используйте sox
от SoX для анализа короткого аудиофрагмента:
sox -t .wav "|arecord -d 2" -n stat
С помощью -t .wav
мы указываем, что обрабатываем тип wav, "|arecord -d 2"
выполняет программу arecord
течение двух секунд, -n
выводит в нулевой файл и с помощью stat
мы указываем, что нам нужна статистика.
Вывод этой команды в моей системе с некоторой фоновой речью:
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read: 16000
Length (seconds): 2.000000
Scaled by: 2147483647.0
Maximum amplitude: 0.312500
Minimum amplitude: -0.421875
Midline amplitude: -0.054688
Mean norm: 0.046831
Mean amplitude: -0.000044
RMS amplitude: 0.068383
Maximum delta: 0.414063
Minimum delta: 0.000000
Mean delta: 0.021912
RMS delta: 0.036752
Rough frequency: 684
Volume adjustment: 2.370
Максимальная амплитуда может быть затем извлечена с помощью:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Мы grep
для строки, которую мы хотим, используем tr
чтобы обрезать символы пробела, а затем cut
его по символу :
и взять вторую часть, которая дает нам 0.068383
в этом примере. Как следует из комментариев, RMS является лучшим показателем энергии, чем максимальная амплитуда.
Наконец, вы можете использовать bc
для результата, чтобы сравнить значения с плавающей точкой из командной строки:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Если вы создаете цикл (см. Примеры Bash), который вызывает сон в течение 1 минуты, проверяет громкость, а затем повторяет, вы можете оставить его работающим в фоновом режиме. Последний шаг - добавить его в сценарии инициализации или служебные файлы (в зависимости от вашей ОС / дистрибутива), чтобы вам даже не пришлось запускать его вручную.